mirror of
https://github.com/luxfi/cli.git
synced 2026-10-30 17:01:20 +00:00
286 lines
6.8 KiB
Go
286 lines
6.8 KiB
Go
// Copyright (C) 2022, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package lpmintegration
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/luxfi/cli/v2/pkg/application"
|
|
"github.com/luxfi/cli/v2/pkg/constants"
|
|
"github.com/luxfi/cli/v2/pkg/prompts"
|
|
luxlog "github.com/luxfi/log"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const (
|
|
org1 = "org1"
|
|
org2 = "org2"
|
|
|
|
repo1 = "repo1"
|
|
repo2 = "repo2"
|
|
|
|
subnet1 = "testsubnet1"
|
|
subnet2 = "testsubnet2"
|
|
|
|
vm = "testvm"
|
|
|
|
testSubnetYaml = `subnet:
|
|
id: "abcd"
|
|
alias: "testsubnet"
|
|
homepage: "https://subnet.com"
|
|
description: It's a subnet
|
|
maintainers:
|
|
- "[email protected]"
|
|
vms:
|
|
- "testvm1"
|
|
- "testvm2"
|
|
`
|
|
|
|
testVMYaml = `vm:
|
|
id: "efgh"
|
|
alias: "testvm"
|
|
description: "Virtual machine"
|
|
binary: "build/sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm"
|
|
url: "https://github.com/org/repo/archive/refs/tags/v1.0.0.tar.gz"
|
|
checksum: "1ac250f6c40472f22eaf0616fc8c886078a4eaa9b2b85fbb4fb7783a1db6af3f"
|
|
version: "v1.0.0"
|
|
`
|
|
)
|
|
|
|
func newTestApp(t *testing.T, testDir string) *application.Lux {
|
|
tempDir := t.TempDir()
|
|
app := application.New()
|
|
app.Setup(tempDir, luxlog.NewNoOpLogger(), nil, prompts.NewPrompter(), application.NewDownloader())
|
|
app.LpmDir = testDir
|
|
return app
|
|
}
|
|
|
|
func TestGetRepos(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
orgs []string
|
|
repos []string
|
|
}
|
|
|
|
tests := []test{
|
|
{
|
|
name: "Single",
|
|
orgs: []string{org1},
|
|
repos: []string{repo1},
|
|
},
|
|
{
|
|
name: "Multiple",
|
|
orgs: []string{org1, org2},
|
|
repos: []string{repo1, repo2},
|
|
},
|
|
{
|
|
name: "Empty",
|
|
orgs: []string{},
|
|
repos: []string{},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
repositoryDir := filepath.Join(testDir, "repositories")
|
|
err := os.Mkdir(repositoryDir, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// create repos
|
|
for _, org := range tt.orgs {
|
|
for _, repo := range tt.repos {
|
|
repoPath := filepath.Join(repositoryDir, org, repo)
|
|
err = os.MkdirAll(repoPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
}
|
|
}
|
|
|
|
// test function
|
|
repos, err := GetRepos(app)
|
|
require.NoError(err)
|
|
|
|
// check results
|
|
numRepos := len(tt.orgs) * len(tt.repos)
|
|
require.Equal(numRepos, len(repos))
|
|
|
|
index := 0
|
|
for _, org := range tt.orgs {
|
|
for _, repo := range tt.repos {
|
|
require.Equal(org+"/"+repo, repos[index])
|
|
index++
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetSubnets(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
org string
|
|
repo string
|
|
subnetNames []string
|
|
}
|
|
|
|
tests := []test{
|
|
{
|
|
name: "Single",
|
|
org: org1,
|
|
repo: repo1,
|
|
subnetNames: []string{subnet1},
|
|
},
|
|
{
|
|
name: "Multiple",
|
|
org: org1,
|
|
repo: repo1,
|
|
subnetNames: []string{subnet1, subnet2},
|
|
},
|
|
{
|
|
name: "Empty",
|
|
org: org1,
|
|
repo: repo1,
|
|
subnetNames: []string{},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
// Setup subnet directory
|
|
subnetPath := filepath.Join(testDir, "repositories", tt.org, tt.repo, "subnets")
|
|
err := os.MkdirAll(subnetPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// Create subnet files
|
|
for _, subnet := range tt.subnetNames {
|
|
subnetFile := filepath.Join(subnetPath, subnet+".yaml")
|
|
err = os.WriteFile(subnetFile, []byte(testSubnetYaml), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
}
|
|
|
|
subnets, err := GetSubnets(app, makeAlias(tt.org, tt.repo))
|
|
require.NoError(err)
|
|
|
|
// check results
|
|
require.Equal(len(tt.subnetNames), len(subnets))
|
|
for i, subnet := range tt.subnetNames {
|
|
require.Equal(tt.subnetNames[i], subnet)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLoadSubnetFile_Success(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
// Setup subnet directory
|
|
subnetPath := filepath.Join(testDir, "repositories", org1, repo1, "subnets")
|
|
err := os.MkdirAll(subnetPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// Create subnet files
|
|
subnetFile := filepath.Join(subnetPath, subnet1+".yaml")
|
|
err = os.WriteFile(subnetFile, []byte(testSubnetYaml), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
expectedSubnet := Subnet{
|
|
ID: "abcd",
|
|
Alias: "testsubnet",
|
|
Description: "It's a subnet",
|
|
VMs: []string{"testvm1", "testvm2"},
|
|
}
|
|
|
|
loadedSubnet, err := LoadSubnetFile(app, MakeKey(makeAlias(org1, repo1), subnet1))
|
|
require.NoError(err)
|
|
require.Equal(expectedSubnet, loadedSubnet)
|
|
}
|
|
|
|
func TestLoadSubnetFile_BadKey(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
// Setup subnet directory
|
|
subnetPath := filepath.Join(testDir, "repositories", org1, repo1, "subnets")
|
|
err := os.MkdirAll(subnetPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// Create subnet files
|
|
subnetFile := filepath.Join(subnetPath, subnet1+".yaml")
|
|
err = os.WriteFile(subnetFile, []byte(testSubnetYaml), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
_, err = LoadSubnetFile(app, subnet1)
|
|
require.ErrorContains(err, "invalid subnet key")
|
|
}
|
|
|
|
func TestGetVMsInSubnet(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
// Setup subnet directory
|
|
subnetPath := filepath.Join(testDir, "repositories", org1, repo1, "subnets")
|
|
err := os.MkdirAll(subnetPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// Create subnet files
|
|
subnetFile := filepath.Join(subnetPath, subnet1+".yaml")
|
|
err = os.WriteFile(subnetFile, []byte(testSubnetYaml), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
expectedVMs := []string{"testvm1", "testvm2"}
|
|
|
|
loadedVMs, err := getVMsInSubnet(app, MakeKey(makeAlias(org1, repo1), subnet1))
|
|
require.NoError(err)
|
|
require.Equal(expectedVMs, loadedVMs)
|
|
}
|
|
|
|
func TestLoadVMFile(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
testDir := t.TempDir()
|
|
app := newTestApp(t, testDir)
|
|
|
|
// Setup vm directory
|
|
vmPath := filepath.Join(testDir, "repositories", org1, repo1, "vms")
|
|
err := os.MkdirAll(vmPath, constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
// Create subnet files
|
|
vmFile := filepath.Join(vmPath, vm+".yaml")
|
|
err = os.WriteFile(vmFile, []byte(testVMYaml), constants.DefaultPerms755)
|
|
require.NoError(err)
|
|
|
|
expectedVM := VM{
|
|
ID: "efgh",
|
|
Alias: vm,
|
|
Description: "Virtual machine",
|
|
Binary: "build/sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm",
|
|
URL: "https://github.com/org/repo/archive/refs/tags/v1.0.0.tar.gz",
|
|
Checksum: "1ac250f6c40472f22eaf0616fc8c886078a4eaa9b2b85fbb4fb7783a1db6af3f",
|
|
Version: "v1.0.0",
|
|
}
|
|
|
|
loadedVM, err := LoadVMFile(app, makeAlias(org1, repo1), vm)
|
|
require.NoError(err)
|
|
require.Equal(expectedVM, loadedVM)
|
|
}
|