diff --git a/.changeset/fast-chefs-shop.md b/.changeset/fast-chefs-shop.md new file mode 100644 index 00000000..523e7453 --- /dev/null +++ b/.changeset/fast-chefs-shop.md @@ -0,0 +1,5 @@ +--- +"chainlink-deployments-framework": minor +--- + +feat(engine): allow configuration for SUI chain in test engine diff --git a/engine/test/environment/options.go b/engine/test/environment/options.go index 0b8e4c25..0957cf43 100644 --- a/engine/test/environment/options.go +++ b/engine/test/environment/options.go @@ -17,6 +17,7 @@ var ( newAptosContainerLoader = onchain.NewAptosContainerLoader newSolanaContainerLoader = onchain.NewSolanaContainerLoader newSuiContainerLoader = onchain.NewSuiContainerLoader + newSuiContainerLoaderWithConfig = onchain.NewSuiContainerLoaderWithConfig newTonContainerLoader = onchain.NewTonContainerLoader newTonContainerLoaderWithConfig = onchain.NewTonContainerLoaderWithConfig newTronContainerLoader = onchain.NewTronContainerLoader @@ -170,6 +171,14 @@ func WithSuiContainer(t *testing.T, selectors []uint64) LoadOpt { return withChainLoader(t, newSuiContainerLoader(), selectors) } +// WithSuiContainerWithConfig loads Sui blockchain container instances with custom configuration +// for specified chain selectors. +func WithSuiContainerWithConfig(t *testing.T, selectors []uint64, cfg onchain.SuiContainerConfig) LoadOpt { + t.Helper() + + return withChainLoader(t, newSuiContainerLoaderWithConfig(cfg), selectors) +} + // WithSuiContainerN loads n Sui blockchain container instances. func WithSuiContainerN(t *testing.T, n int) LoadOpt { t.Helper() @@ -177,6 +186,13 @@ func WithSuiContainerN(t *testing.T, n int) LoadOpt { return withChainLoaderN(t, newSuiContainerLoader(), n) } +// WithSuiContainerNWithConfig loads n Sui blockchain container instances with custom configuration. +func WithSuiContainerNWithConfig(t *testing.T, n int, cfg onchain.SuiContainerConfig) LoadOpt { + t.Helper() + + return withChainLoaderN(t, newSuiContainerLoaderWithConfig(cfg), n) +} + // WithLogger sets the logger for the environment. func WithLogger(lggr logger.Logger) LoadOpt { return func(cmps *components) error { diff --git a/engine/test/onchain/sui.go b/engine/test/onchain/sui.go index dcdc717c..23952220 100644 --- a/engine/test/onchain/sui.go +++ b/engine/test/onchain/sui.go @@ -14,6 +14,9 @@ import ( suiprov "github.com/smartcontractkit/chainlink-deployments-framework/chain/sui/provider" ) +// SuiContainerConfig is the configuration for the Sui container loader. +type SuiContainerConfig = suiprov.CTFChainProviderConfig + // NewSuiContainerLoader creates a new Sui chain loader with default configuration using CTF. func NewSuiContainerLoader() *ChainLoader { // Generate a random Sui Ed25519 private key for testing @@ -34,6 +37,18 @@ func NewSuiContainerLoader() *ChainLoader { } } +// NewSuiContainerLoaderWithConfig creates a new Sui chain loader with the given configuration using CTF. +func NewSuiContainerLoaderWithConfig(cfg SuiContainerConfig) *ChainLoader { + return &ChainLoader{ + selectors: getTestSelectorsByFamily(chainselectors.FamilySui), + factory: func(t *testing.T, selector uint64) (fchain.BlockChain, error) { + t.Helper() + + return suiprov.NewCTFChainProvider(t, selector, cfg).Initialize(t.Context()) + }, + } +} + // randomSeed generates a random seed for the Sui Ed25519 private key. func suiRandomSeed() []byte { seed := make([]byte, ed25519.SeedSize) diff --git a/engine/test/onchain/sui_test.go b/engine/test/onchain/sui_test.go index 14185eed..df2c41c9 100644 --- a/engine/test/onchain/sui_test.go +++ b/engine/test/onchain/sui_test.go @@ -1,11 +1,17 @@ package onchain import ( + "crypto/ed25519" + "crypto/rand" + "encoding/hex" + "sync" "testing" chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + suiprov "github.com/smartcontractkit/chainlink-deployments-framework/chain/sui/provider" ) func Test_NewSuiContainerLoader(t *testing.T) { @@ -23,3 +29,34 @@ func Test_NewSuiContainerLoader(t *testing.T) { // but we can verify it exists. require.NotNil(t, loader.factory) } + +func Test_NewSuiContainerLoaderWithConfig(t *testing.T) { + t.Parallel() + + // Generate a test private key + seed := make([]byte, ed25519.SeedSize) + _, err := rand.Read(seed) + require.NoError(t, err) + + seeded := ed25519.NewKeyFromSeed(seed) + seedBytes := seeded[:32] + testPrivateKey := hex.EncodeToString(seedBytes) + + var once sync.Once + + config := suiprov.CTFChainProviderConfig{ + Once: &once, + DeployerSignerGen: suiprov.AccountGenPrivateKey(testPrivateKey), + } + + loader := NewSuiContainerLoaderWithConfig(config) + require.NotNil(t, loader) + + // Should have the same selectors as getTestSelectorsByFamily returns + require.NotNil(t, loader.selectors) + wantSelectors := getTestSelectorsByFamily(chainselectors.FamilySui) + assert.Equal(t, wantSelectors, loader.selectors) + + // Factory should be configured with the provided config + require.NotNil(t, loader.factory) +}