Files
cocos/manager/qemu/vm_test.go
T
Sammy Kerata Oina 8eb1fac9ad NOISSUE - Refactor and update dependencies in the project (#491)
* Refactor and update dependencies in the project

- Updated go.sum to replace `github.com/absmach/magistrala` with `github.com/absmach/supermq` across various modules.
- Removed VSock configuration from environment variables and QEMU arguments.
- Updated QEMU configuration and related tests to remove references to guest CID and VSock.
- Added new HTTP transport layer for API endpoints in the manager.
- Introduced Prometheus monitoring configuration with alert rules and Alertmanager setup.
- Updated service and VM interfaces to remove unused methods and references.
- Refactored tests to align with the new structure and dependencies.

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add MaxVMs configuration and enforce limit on VM creation

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add comprehensive tests for HTTP transport handlers and endpoints

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add test case for exceeding maximum number of VMs in TestRun

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Improve error handling in TestHandlerWithCustomRouter to ensure response writing is checked

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Update dependencies to latest versions

- Upgrade cel.dev/expr from v0.23.0 to v0.24.0
- Upgrade github.com/absmach/supermq from v0.16.0 to v0.17.0
- Upgrade github.com/cenkalti/backoff from v4.3.0 to v5.0.2
- Upgrade github.com/cncf/xds/go to v0.0.0-20250501225837-2ac532fd4443
- Upgrade github.com/go-chi/chi/v5 from v5.2.1 to v5.2.2
- Upgrade github.com/go-jose/go-jose/v3 from v3.0.3 to v3.0.4
- Upgrade github.com/gofrs/uuid/v5 from v5.3.0 to v5.3.2
- Upgrade github.com/prometheus/client_golang from v1.22.0 to v1.23.0
- Upgrade github.com/prometheus/client_model from v0.6.1 to v0.6.2
- Upgrade github.com/prometheus/common from v0.62.0 to v0.65.0
- Upgrade github.com/prometheus/procfs from v0.15.1 to v0.16.1
- Upgrade go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp from v0.60.0 to v0.62.0
- Upgrade go.opentelemetry.io/otel/exporters/otlp/otlptrace from v1.36.0 to v1.37.0
- Upgrade golang.org/x/crypto from v0.39.0 to v0.40.0
- Upgrade golang.org/x/sys from v0.33.0 to v0.34.0
- Upgrade golang.org/x/text from v0.26.0 to v0.27.0
- Upgrade golang.org/x/time from v0.11.0 to v0.12.0
- Upgrade google.golang.org/grpc from v1.73.0 to v1.74.2

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

---------

Signed-off-by: Sammy Oina <sammyoina@gmail.com>
2025-08-05 11:22:02 +02:00

184 lines
3.9 KiB
Go

// Copyright (c) Ultraviolet
// SPDX-License-Identifier: Apache-2.0
package qemu
import (
"log/slog"
"os"
"os/exec"
"testing"
"github.com/stretchr/testify/assert"
"github.com/ultravioletrs/cocos/manager/vm/mocks"
pkgmanager "github.com/ultravioletrs/cocos/pkg/manager"
)
const testComputationID = "test-computation"
func TestNewVM(t *testing.T) {
config := VMInfo{Config: Config{}}
vm := NewVM(config, testComputationID, slog.Default())
assert.NotNil(t, vm)
assert.IsType(t, &qemuVM{}, vm)
}
func TestStart(t *testing.T) {
// Create a temporary file for testing
tmpFile, err := os.CreateTemp("", "test-ovmf-vars")
assert.NoError(t, err)
defer os.Remove(tmpFile.Name())
config := VMInfo{Config: Config{
OVMFVarsConfig: OVMFVarsConfig{
File: tmpFile.Name(),
},
QemuBinPath: "echo",
}}
vm := NewVM(config, testComputationID, slog.Default()).(*qemuVM)
err = vm.Start()
assert.NoError(t, err)
assert.NotNil(t, vm.cmd)
_ = vm.Stop()
}
func TestStartSudo(t *testing.T) {
// Create a temporary file for testing
tmpFile, err := os.CreateTemp("", "test-ovmf-vars")
assert.NoError(t, err)
defer os.Remove(tmpFile.Name())
config := VMInfo{Config: Config{
OVMFVarsConfig: OVMFVarsConfig{
File: tmpFile.Name(),
},
QemuBinPath: "echo",
UseSudo: true,
}}
vm := NewVM(config, testComputationID, slog.Default()).(*qemuVM)
err = vm.Start()
assert.NoError(t, err)
assert.NotNil(t, vm.cmd)
_ = vm.Stop()
}
func TestStop(t *testing.T) {
t.Run("success", func(t *testing.T) {
cmd := exec.Command("echo", "test")
err := cmd.Start()
assert.NoError(t, err)
sm := new(mocks.StateMachine)
sm.On("Transition", pkgmanager.StopComputationRun).Return(nil)
vm := &qemuVM{
cmd: &exec.Cmd{
Process: cmd.Process,
},
StateMachine: sm,
}
err = vm.Stop()
assert.NoError(t, err)
})
t.Run("transition error", func(t *testing.T) {
cmd := exec.Command("echo", "test")
err := cmd.Start()
assert.NoError(t, err)
sm := new(mocks.StateMachine)
sm.On("Transition", pkgmanager.StopComputationRun).Return(assert.AnError)
sm.On("State").Return(pkgmanager.Stopped.String())
vm := &qemuVM{
cmd: &exec.Cmd{
Process: cmd.Process,
},
StateMachine: sm,
}
err = vm.Stop()
assert.NoError(t, err)
})
}
func TestSetProcess(t *testing.T) {
vm := &qemuVM{
vmi: VMInfo{
Config: Config{QemuBinPath: "echo"}, // Use 'echo' as a dummy QEMU binary
},
}
err := vm.SetProcess(os.Getpid()) // Use current process as a dummy
assert.NoError(t, err)
assert.NotNil(t, vm.cmd)
assert.NotNil(t, vm.cmd.Process)
}
func TestGetProcess(t *testing.T) {
expectedPid := 12345
vm := &qemuVM{
cmd: &exec.Cmd{
Process: &os.Process{Pid: expectedPid},
},
}
pid := vm.GetProcess()
assert.Equal(t, expectedPid, pid)
}
func TestGetConfig(t *testing.T) {
expectedConfig := VMInfo{
Config: Config{
QemuBinPath: "echo",
},
}
vm := &qemuVM{
vmi: expectedConfig,
}
config := vm.GetConfig()
assert.Equal(t, expectedConfig, config)
}
func TestSEVSNPEnabled(t *testing.T) {
t.Run("cpuinfo and kvm param correct", func(t *testing.T) {
assert.True(t, SEVSNPEnabled("flags: sev_snp abc", "Y"))
})
t.Run("missing sev_snp in cpuinfo", func(t *testing.T) {
assert.False(t, SEVSNPEnabled("flags: abc", "1"))
})
t.Run("kernel param not enabled", func(t *testing.T) {
assert.False(t, SEVSNPEnabled("flags: sev_snp", "0"))
})
}
func TestTDXEnabled(t *testing.T) {
t.Run("cpuinfo and kvm param correct", func(t *testing.T) {
assert.True(t, TDXEnabled("flags: tdx_host_platform abc", "Y"))
})
t.Run("missing tdx_host_platform in cpuinfo", func(t *testing.T) {
assert.False(t, TDXEnabled("flags: abc", "1"))
})
t.Run("kernel param not enabled", func(t *testing.T) {
assert.False(t, TDXEnabled("flags: tdx_host_platform", "0"))
})
}
func TestSEVSNPEnabledOnHost(t *testing.T) {
assert.False(t, SEVSNPEnabledOnHost())
}
func TestTDXEnabledOnHost(t *testing.T) {
assert.False(t, TDXEnabledOnHost())
}