Skip to content

Commit 8ed2761

Browse files
committed
fix: reuse containers in set config tests
1 parent ebf9785 commit 8ed2761

5 files changed

Lines changed: 159 additions & 135 deletions

File tree

mcms/changesets/set-config/changeset_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ func TestChangeset_VerifyPreconditions_Solana(t *testing.T) {
200200
},
201201
} {
202202
t.Run(tt.name, func(t *testing.T) {
203+
t.Parallel()
203204
require.NoError(t, cs.VerifyPreconditions(env, tt.input))
204205
})
205206
}

mcms/changesets/set-config/helpers_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
cldf_chain "github.com/smartcontractkit/chainlink-deployments-framework/chain"
1414
cldf_evm "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
1515
cldfsol "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana"
16-
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
1716
cldfdatastore "github.com/smartcontractkit/chainlink-deployments-framework/datastore"
1817
cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
1918
mcmscontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/mcms"
@@ -156,7 +155,7 @@ func evmMCMSChainState(t *testing.T, rt *runtime.Runtime, selector uint64) (*evm
156155
func newSolanaVerifyPreconditionsEnv(t *testing.T, selector uint64) cldf.Environment {
157156
t.Helper()
158157

159-
ds := datastore.NewMemoryDataStore()
158+
ds := cldfdatastore.NewMemoryDataStore()
160159
version := semver.MustParse("1.0.0")
161160
for _, ref := range []struct {
162161
contractType cldf.ContractType
@@ -167,10 +166,10 @@ func newSolanaVerifyPreconditionsEnv(t *testing.T, selector uint64) cldf.Environ
167166
{mcmscontracts.CancellerManyChainMultisig, "canceller-address"},
168167
{mcmscontracts.BypasserManyChainMultisig, "bypasser-address"},
169168
} {
170-
require.NoError(t, ds.Addresses().Add(datastore.AddressRef{
169+
require.NoError(t, ds.Addresses().Add(cldfdatastore.AddressRef{
171170
Address: ref.address,
172171
ChainSelector: selector,
173-
Type: datastore.ContractType(ref.contractType),
172+
Type: cldfdatastore.ContractType(ref.contractType),
174173
Version: version,
175174
}))
176175
}

mcms/solana/changesets/fund-mcm-pdas/changeset_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestChangeset(t *testing.T) {
3333
selector2 := chainselectors.TEST_33333333333333333333333333333333333333333333.Selector
3434

3535
rt1 := testRuntime(t, selector1)
36-
env1 := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1_000), true)
36+
env1 := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1_000))
3737
cs := Changeset{}
3838

3939
t.Run("VerifyPreconditions", func(t *testing.T) {
@@ -92,7 +92,7 @@ func TestChangeset(t *testing.T) {
9292
},
9393
{
9494
name: "insufficient deployer balance",
95-
env: configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1), true),
95+
env: configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1)),
9696
config: Config{
9797
FundingPerChain: map[uint64]FundingConfig{selector1: {
9898
ProposeMCM: 100,
@@ -106,7 +106,7 @@ func TestChangeset(t *testing.T) {
106106
{
107107
name: "missing deployer key",
108108
env: func() cldf.Environment {
109-
env := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1_000), true)
109+
env := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, rpcWithBalance(t, 1_000))
110110
chain := env.BlockChains.SolanaChains()[selector1]
111111
chain.DeployerKey = nil
112112
env.BlockChains = cldf_chain.NewBlockChains(map[uint64]cldf_chain.BlockChain{selector1: chain})
@@ -158,7 +158,7 @@ func TestChangeset(t *testing.T) {
158158
t.Run("Apply", func(t *testing.T) {
159159
var confirmed [][]solana.Instruction
160160

161-
env := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, nil, true)
161+
env := configureFundMCMSignersEnv(t, rt1.Environment(), selector1, nil)
162162
chain := env.BlockChains.SolanaChains()[selector1]
163163
require.NotNil(t, chain.DeployerKey)
164164
deployerKey := *chain.DeployerKey
@@ -249,12 +249,11 @@ func configureFundMCMSignersEnv(
249249
base cldf.Environment,
250250
selector uint64,
251251
client *rpc.Client,
252-
completeState bool,
253252
) cldf.Environment {
254253
t.Helper()
255254

256255
env := base
257-
env.DataStore = newMCMSDataStore(t, selector, completeState)
256+
env.DataStore = newMCMSDataStore(t, selector, true)
258257

259258
chain := env.BlockChains.SolanaChains()[selector]
260259
if client != nil {

mcms/solana/set-config/operation_test.go

Lines changed: 81 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/stretchr/testify/require"
99

1010
chainselectors "github.com/smartcontractkit/chain-selectors"
11+
cldfsol "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana"
1112
mcmscontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/mcms"
1213
cldftesthelpers "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils/testhelpers"
1314
"github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime"
@@ -18,70 +19,95 @@ import (
1819

1920
//nolint:paralleltest // global mcm.SetProgramID state; serialized via soltestutils.PreloadMCMS lock
2021
func TestSolanaSetConfig(t *testing.T) {
21-
t.Run("operation", testOpSolanaSetConfigMCM)
22-
t.Run("sequence", testRunSolanaSetConfig)
23-
}
24-
25-
func testOpSolanaSetConfigMCM(t *testing.T) {
2622
selector := chainselectors.TEST_22222222222222222222222222222222222222222222.Selector
27-
rt := newSolanaSetConfigRuntime(t, selector)
28-
chain := rt.Environment().BlockChains.SolanaChains()[selector]
29-
refs := solanaSetConfigRefs(t, rt.Environment(), selector)
30-
fundSolanaSignerPDAs(t, chain, refs)
3123

24+
// Direct-send cases must not mutate MCMS quorum before transfer runs in the MCMS group.
3225
t.Run("direct send", func(t *testing.T) { //nolint:paralleltest // shared runtime state
33-
cfg := cldftesthelpers.SingleGroupMCMS(t)
34-
cfg.Signers = append(cfg.Signers, common.HexToAddress("0x0000000000000000000000000000000000000909"))
35-
cfg.Quorum = 2
26+
rt := newSolanaSetConfigRuntime(t, selector)
27+
chain := rt.Environment().BlockChains.SolanaChains()[selector]
28+
refs := solanaSetConfigRefs(t, rt.Environment(), selector)
29+
fundSolanaSignerPDAs(t, chain, refs)
3630

37-
report, err := operations.ExecuteOperation(
38-
rt.Environment().OperationsBundle,
39-
OpSolanaSetConfigMCM,
40-
chain,
41-
OpSolanaSetConfigInput{
42-
Target: MCMSetConfigTarget{
43-
Address: refs.Canceller,
44-
Config: cfg,
45-
ContractType: string(mcmscontracts.CancellerManyChainMultisig),
46-
},
47-
NoSend: false,
48-
},
49-
)
50-
require.NoError(t, err)
51-
require.True(t, report.Output.Confirmed)
52-
assertSolanaConfigEquals(t, mcmssolana.NewInspector(chain.Client), refs.Canceller, cfg)
31+
t.Run("operation", func(t *testing.T) { //nolint:paralleltest // shared runtime state
32+
testOpSolanaSetConfigDirectSend(t, rt, chain, refs)
33+
})
34+
t.Run("sequence", func(t *testing.T) { //nolint:paralleltest // shared runtime state
35+
testRunSolanaSetConfigDirectSend(t, rt, chain, refs, selector)
36+
})
5337
})
5438

39+
// MCMS cases share one fresh deploy; transfer runs once before any timelock proposals.
5540
t.Run("MCMS proposal", func(t *testing.T) { //nolint:paralleltest // shared runtime state
56-
transferSolanaMCMSToTimelock(t, rt, selector)
41+
rt := newSolanaSetConfigRuntime(t, selector)
42+
chain := rt.Environment().BlockChains.SolanaChains()[selector]
43+
refs := solanaSetConfigRefs(t, rt.Environment(), selector)
5744
fundSolanaSignerPDAs(t, chain, refs)
5845

59-
cfg := cldftesthelpers.SingleGroupMCMS(t)
60-
cfg.Signers = append(cfg.Signers, common.HexToAddress("0x0000000000000000000000000000000000000909"))
61-
cfg.Quorum = 2
46+
t.Run("operation", func(t *testing.T) { //nolint:paralleltest // shared runtime state
47+
testOpSolanaSetConfigMCMSProposal(t, rt, chain, refs, selector)
48+
})
49+
t.Run("sequence", func(t *testing.T) { //nolint:paralleltest // shared runtime state
50+
testRunSolanaSetConfigMCMSProposal(t, rt, chain, refs, selector)
51+
})
52+
})
53+
}
54+
55+
func testOpSolanaSetConfigDirectSend(t *testing.T, rt *runtime.Runtime, chain cldfsol.Chain, refs solanaMCMSRefs) {
56+
t.Helper()
57+
58+
cfg := cldftesthelpers.SingleGroupMCMS(t)
59+
cfg.Signers = append(cfg.Signers, common.HexToAddress("0x0000000000000000000000000000000000000909"))
60+
cfg.Quorum = 2
6261

63-
report, err := operations.ExecuteOperation(
64-
rt.Environment().OperationsBundle,
65-
OpSolanaSetConfigMCM,
66-
chain,
67-
OpSolanaSetConfigInput{
68-
Target: MCMSetConfigTarget{
69-
Address: refs.Canceller,
70-
Config: cfg,
71-
ContractType: string(mcmscontracts.CancellerManyChainMultisig),
72-
},
73-
NoSend: true,
74-
AuthorityAccount: refs.TimelockSigner,
62+
report, err := operations.ExecuteOperation(
63+
rt.Environment().OperationsBundle,
64+
OpSolanaSetConfigMCM,
65+
chain,
66+
OpSolanaSetConfigInput{
67+
Target: MCMSetConfigTarget{
68+
Address: refs.Canceller,
69+
Config: cfg,
70+
ContractType: string(mcmscontracts.CancellerManyChainMultisig),
7571
},
76-
)
77-
require.NoError(t, err)
78-
require.False(t, report.Output.Confirmed)
79-
require.Equal(t, mcmstypes.ChainSelector(selector), report.Output.BatchOperation.ChainSelector)
80-
require.NotEmpty(t, report.Output.BatchOperation.Transactions)
81-
require.NoError(t, rt.Exec(
82-
newTimelockProposalTask([]mcmstypes.BatchOperation{report.Output.BatchOperation}, "solana set config operation test"),
83-
runtime.SignAndExecuteProposalsTask([]*ecdsa.PrivateKey{cldftesthelpers.TestXXXMCMSSigner}),
84-
))
85-
assertSolanaConfigEquals(t, mcmssolana.NewInspector(chain.Client), refs.Canceller, cfg)
86-
})
72+
NoSend: false,
73+
},
74+
)
75+
require.NoError(t, err)
76+
require.True(t, report.Output.Confirmed)
77+
assertSolanaConfigEquals(t, mcmssolana.NewInspector(chain.Client), refs.Canceller, cfg)
78+
}
79+
80+
func testOpSolanaSetConfigMCMSProposal(t *testing.T, rt *runtime.Runtime, chain cldfsol.Chain, refs solanaMCMSRefs, selector uint64) {
81+
t.Helper()
82+
83+
transferSolanaMCMSToTimelock(t, rt, selector)
84+
fundSolanaSignerPDAs(t, chain, refs)
85+
86+
cfg := cldftesthelpers.SingleGroupMCMS(t)
87+
cfg.Signers = append(cfg.Signers, common.HexToAddress("0x0000000000000000000000000000000000000909"))
88+
cfg.Quorum = 2
89+
90+
report, err := operations.ExecuteOperation(
91+
rt.Environment().OperationsBundle,
92+
OpSolanaSetConfigMCM,
93+
chain,
94+
OpSolanaSetConfigInput{
95+
Target: MCMSetConfigTarget{
96+
Address: refs.Canceller,
97+
Config: cfg,
98+
ContractType: string(mcmscontracts.CancellerManyChainMultisig),
99+
},
100+
NoSend: true,
101+
AuthorityAccount: refs.TimelockSigner,
102+
},
103+
)
104+
require.NoError(t, err)
105+
require.False(t, report.Output.Confirmed)
106+
require.Equal(t, mcmstypes.ChainSelector(selector), report.Output.BatchOperation.ChainSelector)
107+
require.NotEmpty(t, report.Output.BatchOperation.Transactions)
108+
require.NoError(t, rt.Exec(
109+
newTimelockProposalTask([]mcmstypes.BatchOperation{report.Output.BatchOperation}, "solana set config operation test"),
110+
runtime.SignAndExecuteProposalsTask([]*ecdsa.PrivateKey{cldftesthelpers.TestXXXMCMSSigner}),
111+
))
112+
assertSolanaConfigEquals(t, mcmssolana.NewInspector(chain.Client), refs.Canceller, cfg)
87113
}

0 commit comments

Comments
 (0)