// Copyright (c) 2018 HyperHQ Inc.
//
// SPDX-License-Identifier: Apache-2.0
//

package virtcontainers

import (
	"context"
	"io/ioutil"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestNewVM(t *testing.T) {
	assert := assert.New(t)

	testDir, _ := ioutil.TempDir("", "vmfactory-tmp-")
	config := VMConfig{
		HypervisorType: MockHypervisor,
		AgentType:      NoopAgentType,
		ProxyType:      NoopProxyType,
	}
	hyperConfig := HypervisorConfig{
		KernelPath: testDir,
		ImagePath:  testDir,
	}

	ctx := context.Background()

	var vm *VM
	_, err := NewVM(ctx, config)
	assert.Error(err)

	config.HypervisorConfig = hyperConfig
	vm, err = NewVM(ctx, config)
	assert.Nil(err)

	// VM operations
	err = vm.Pause()
	assert.Nil(err)
	err = vm.Resume()
	assert.Nil(err)
	err = vm.Start()
	assert.Nil(err)
	err = vm.Disconnect()
	assert.Nil(err)
	err = vm.Save()
	assert.Nil(err)
	err = vm.Stop()
	assert.Nil(err)
	err = vm.AddCPUs(2)
	assert.Nil(err)
	err = vm.AddMemory(128)
	assert.Nil(err)
	err = vm.OnlineCPUMemory()
	assert.Nil(err)
	err = vm.ReseedRNG()
	assert.Nil(err)

	// template VM
	config.HypervisorConfig.BootFromTemplate = true
	_, err = NewVM(ctx, config)
	assert.Error(err)

	config.HypervisorConfig.MemoryPath = testDir
	_, err = NewVM(ctx, config)
	assert.Error(err)

	config.HypervisorConfig.DevicesStatePath = testDir
	_, err = NewVM(ctx, config)
	assert.Nil(err)
}

func TestVMConfigValid(t *testing.T) {
	assert := assert.New(t)

	config := VMConfig{}

	err := config.Valid()
	assert.Error(err)

	testDir, _ := ioutil.TempDir("", "vmfactory-tmp-")
	config.HypervisorConfig = HypervisorConfig{
		KernelPath: testDir,
		InitrdPath: testDir,
	}
	err = config.Valid()
	assert.Nil(err)
}

func TestSetupProxy(t *testing.T) {
	assert := assert.New(t)

	config := VMConfig{
		HypervisorType: MockHypervisor,
		AgentType:      NoopAgentType,
	}

	hypervisor := &mockHypervisor{}
	agent := &noopAgent{}

	// wrong proxy type
	config.ProxyType = "invalidProxyType"
	_, _, _, err := setupProxy(hypervisor, agent, config, "foobar")
	assert.NotNil(err)

	config.ProxyType = NoopProxyType
	_, _, _, err = setupProxy(hypervisor, agent, config, "foobar")
	assert.Nil(err)
}
