mirror of
https://github.com/luxfi/cli.git
synced 2026-10-30 17:01:20 +00:00
286 lines
6.4 KiB
Go
286 lines
6.4 KiB
Go
// Copyright (C) 2022-2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package application
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/luxfi/constants"
|
|
"github.com/luxfi/ids"
|
|
luxlog "github.com/luxfi/log"
|
|
"github.com/luxfi/sdk/models"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const (
|
|
chainName1 = "TEST_chain"
|
|
chainName2 = "TEST_copied_chain"
|
|
)
|
|
|
|
func TestUpdateSideCar(t *testing.T) {
|
|
require := require.New(t)
|
|
chainID := ids.GenerateTestID()
|
|
sc := &models.Sidecar{
|
|
Name: "TEST",
|
|
VM: models.EVM,
|
|
TokenName: "TEST",
|
|
ChainID: chainID,
|
|
}
|
|
|
|
ap := newTestApp(t)
|
|
|
|
err := ap.CreateSidecar(sc)
|
|
require.NoError(err)
|
|
control, err := ap.LoadSidecar(sc.Name)
|
|
require.NoError(err)
|
|
require.Equal(*sc, control)
|
|
sc.Networks = make(map[string]models.NetworkData)
|
|
sc.Networks["local"] = models.NetworkData{
|
|
BlockchainID: ids.GenerateTestID(),
|
|
ChainID: ids.GenerateTestID(),
|
|
}
|
|
|
|
err = ap.UpdateSidecar(sc)
|
|
require.NoError(err)
|
|
control, err = ap.LoadSidecar(sc.Name)
|
|
require.NoError(err)
|
|
require.Equal(*sc, control)
|
|
}
|
|
|
|
func Test_writeGenesisFile_success(t *testing.T) {
|
|
require := require.New(t)
|
|
genesisBytes := []byte("genesis")
|
|
genesisFile := constants.GenesisFileName
|
|
|
|
ap := newTestApp(t)
|
|
// Write genesis
|
|
err := ap.WriteGenesisFile(chainName1, genesisBytes)
|
|
require.NoError(err)
|
|
|
|
// Check file exists
|
|
createdPath := filepath.Join(ap.GetChainsDir(), chainName1, genesisFile)
|
|
_, err = os.Stat(createdPath)
|
|
require.NoError(err)
|
|
|
|
// Cleanup file
|
|
err = os.Remove(createdPath)
|
|
require.NoError(err)
|
|
}
|
|
|
|
func Test_copyGenesisFile_success(t *testing.T) {
|
|
require := require.New(t)
|
|
genesisBytes := []byte("genesis")
|
|
|
|
ap := newTestApp(t)
|
|
// Create original genesis
|
|
err := ap.WriteGenesisFile(chainName1, genesisBytes)
|
|
require.NoError(err)
|
|
|
|
// Copy genesis
|
|
createdGenesis := ap.GetGenesisPath(chainName1)
|
|
err = ap.CopyGenesisFile(createdGenesis, chainName2)
|
|
require.NoError(err)
|
|
|
|
// Check copied file exists
|
|
copiedGenesis := ap.GetGenesisPath(chainName2)
|
|
_, err = os.Stat(copiedGenesis)
|
|
require.NoError(err)
|
|
|
|
// Cleanup files
|
|
err = os.Remove(createdGenesis)
|
|
require.NoError(err)
|
|
err = os.Remove(copiedGenesis)
|
|
require.NoError(err)
|
|
}
|
|
|
|
func Test_copyGenesisFile_failure(t *testing.T) {
|
|
require := require.New(t)
|
|
// copy genesis that doesn't exist
|
|
|
|
ap := newTestApp(t)
|
|
// Copy genesis
|
|
createdGenesis := ap.GetGenesisPath(chainName1)
|
|
err := ap.CopyGenesisFile(createdGenesis, chainName2)
|
|
require.Error(err)
|
|
|
|
// Check no copied file exists
|
|
copiedGenesis := ap.GetGenesisPath(chainName2)
|
|
_, err = os.Stat(copiedGenesis)
|
|
require.Error(err)
|
|
}
|
|
|
|
func Test_createSidecar_success(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
chainName string
|
|
tokenName string
|
|
expectedTokenName string
|
|
chainID ids.ID
|
|
}
|
|
|
|
tests := []test{
|
|
{
|
|
name: "Success",
|
|
chainName: chainName1,
|
|
tokenName: "TOKEN",
|
|
expectedTokenName: "TOKEN",
|
|
chainID: ids.GenerateTestID(),
|
|
},
|
|
{
|
|
name: "no token name",
|
|
chainName: chainName1,
|
|
tokenName: "",
|
|
expectedTokenName: "TEST",
|
|
chainID: ids.GenerateTestID(),
|
|
},
|
|
}
|
|
|
|
ap := newTestApp(t)
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
require := require.New(t)
|
|
const vm = models.EVM
|
|
|
|
sc := &models.Sidecar{
|
|
Name: tt.chainName,
|
|
VM: vm,
|
|
TokenName: tt.tokenName,
|
|
ChainID: tt.chainID,
|
|
}
|
|
|
|
// Write sidecar
|
|
err := ap.CreateSidecar(sc)
|
|
require.NoError(err)
|
|
|
|
// Check file exists
|
|
createdPath := ap.GetSidecarPath(tt.chainName)
|
|
_, err = os.Stat(createdPath)
|
|
require.NoError(err)
|
|
|
|
control, err := ap.LoadSidecar(tt.chainName)
|
|
require.NoError(err)
|
|
require.Equal(*sc, control)
|
|
|
|
require.Equal(sc.TokenName, tt.expectedTokenName)
|
|
|
|
// Cleanup file
|
|
err = os.Remove(createdPath)
|
|
require.NoError(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_loadSidecar_success(t *testing.T) {
|
|
require := require.New(t)
|
|
const vm = models.EVM
|
|
|
|
ap := newTestApp(t)
|
|
|
|
// Write sidecar
|
|
sidecarBytes := []byte("{ \"Name\": \"TEST_chain\",\n \"VM\": \"Lux EVM\",\n \"Chain\": \"TEST_chain\"\n }")
|
|
sidecarPath := ap.GetSidecarPath(chainName1)
|
|
err := os.MkdirAll(filepath.Dir(sidecarPath), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
err = os.WriteFile(sidecarPath, sidecarBytes, 0o600)
|
|
require.NoError(err)
|
|
|
|
// Check file exists
|
|
_, err = os.Stat(sidecarPath)
|
|
require.NoError(err)
|
|
|
|
// Check contents
|
|
expectedSc := models.Sidecar{
|
|
Name: chainName1,
|
|
VM: vm,
|
|
Chain: chainName1,
|
|
TokenName: constants.DefaultTokenName,
|
|
}
|
|
|
|
sc, err := ap.LoadSidecar(chainName1)
|
|
require.NoError(err)
|
|
require.Equal(sc, expectedSc)
|
|
|
|
// Cleanup file
|
|
err = os.Remove(sidecarPath)
|
|
require.NoError(err)
|
|
}
|
|
|
|
func Test_loadSidecar_failure_notFound(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
ap := newTestApp(t)
|
|
|
|
// Assert file doesn't exist at start
|
|
sidecarPath := ap.GetSidecarPath(chainName1)
|
|
_, err := os.Stat(sidecarPath)
|
|
require.Error(err)
|
|
|
|
_, err = ap.LoadSidecar(chainName1)
|
|
require.Error(err)
|
|
}
|
|
|
|
func Test_loadSidecar_failure_malformed(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
ap := newTestApp(t)
|
|
|
|
// Write sidecar
|
|
sidecarBytes := []byte("bad_sidecar")
|
|
sidecarPath := ap.GetSidecarPath(chainName1)
|
|
err := os.MkdirAll(filepath.Dir(sidecarPath), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
err = os.WriteFile(sidecarPath, sidecarBytes, 0o600)
|
|
require.NoError(err)
|
|
|
|
// Check file exists
|
|
_, err = os.Stat(sidecarPath)
|
|
require.NoError(err)
|
|
|
|
// Check contents
|
|
_, err = ap.LoadSidecar(chainName1)
|
|
require.Error(err)
|
|
|
|
// Cleanup file
|
|
err = os.Remove(sidecarPath)
|
|
require.NoError(err)
|
|
}
|
|
|
|
func Test_genesisExists(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
ap := newTestApp(t)
|
|
|
|
// Assert file doesn't exist at start
|
|
result := ap.GenesisExists(chainName1)
|
|
require.False(result)
|
|
|
|
// Create genesis
|
|
genesisPath := ap.GetGenesisPath(chainName1)
|
|
genesisBytes := []byte("genesis")
|
|
err := os.MkdirAll(filepath.Dir(genesisPath), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
err = os.WriteFile(genesisPath, genesisBytes, 0o600)
|
|
require.NoError(err)
|
|
|
|
// Verify genesis exists
|
|
result = ap.GenesisExists(chainName1)
|
|
require.True(result)
|
|
|
|
// Clean up created genesis
|
|
err = os.Remove(genesisPath)
|
|
require.NoError(err)
|
|
}
|
|
|
|
func newTestApp(t *testing.T) *Lux {
|
|
tempDir := t.TempDir()
|
|
app := New()
|
|
app.Setup(tempDir, luxlog.NewNoOpLogger(), nil, nil, nil)
|
|
return app
|
|
}
|