vaguerent/internal/core/testing_basis.go
2023-06-05 14:18:53 -07:00

144 lines
3.6 KiB
Go

package core
import (
"context"
"io/ioutil"
"os"
"path/filepath"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/vagrant-plugin-sdk/core"
coremocks "github.com/hashicorp/vagrant-plugin-sdk/core/mocks"
"github.com/hashicorp/vagrant-plugin-sdk/datadir"
"github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk"
"github.com/hashicorp/vagrant-plugin-sdk/terminal"
"github.com/hashicorp/vagrant/internal/plugin"
"github.com/hashicorp/vagrant/internal/server/singleprocess"
"github.com/mitchellh/go-testing-interface"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
type PluginWithParent struct {
parentPlugin interface{}
}
func (p *PluginWithParent) GetParentComponent() interface{} {
return p.parentPlugin
}
func (p *PluginWithParent) SetParentComponent(in interface{}) {
p.parentPlugin = in
}
type TestCommunicatorPlugin struct {
plugin.TestPluginWithFakeBroker
coremocks.Communicator
}
type TestGuestPlugin struct {
PluginWithParent
plugin.TestPluginWithFakeBroker
coremocks.Guest
}
type TestHostPlugin struct {
PluginWithParent
plugin.TestPluginWithFakeBroker
coremocks.Host
}
type TestSyncedFolderPlugin struct {
PluginWithParent
plugin.TestPluginWithFakeBroker
coremocks.SyncedFolder
}
func BuildTestCommunicatorPlugin(name string) *TestCommunicatorPlugin {
c := &TestCommunicatorPlugin{}
c.On("Seed", mock.AnythingOfType("*core.Seeds")).Return(nil)
c.On("Seeds").Return(core.NewSeeds(), nil)
c.On("PluginName").Return(name, nil)
return c
}
func BuildTestGuestPlugin(name string, parent string) *TestGuestPlugin {
p := &TestGuestPlugin{}
p.On("SetPluginName", mock.AnythingOfType("string")).Return(nil)
p.On("Seed", mock.AnythingOfType("*core.Seeds")).Return(nil)
p.On("Seeds").Return(core.NewSeeds(), nil)
p.On("PluginName").Return(name, nil)
p.On("Parent").Return(parent, nil)
return p
}
func BuildTestHostPlugin(name string, parent string) *TestHostPlugin {
p := &TestHostPlugin{}
p.On("SetPluginName", mock.AnythingOfType("string")).Return(nil)
p.On("Seed", mock.AnythingOfType("*core.Seeds")).Return(nil)
p.On("Seeds").Return(core.NewSeeds(), nil)
p.On("PluginName").Return(name, nil)
p.On("Parent").Return(parent, nil)
return p
}
func BuildTestSyncedFolderPlugin(parent string) *TestSyncedFolderPlugin {
p := &TestSyncedFolderPlugin{}
p.On("SetPluginName", mock.AnythingOfType("string")).Return(nil)
p.On("Seed", mock.AnythingOfType("*core.Seeds")).Return(nil)
p.On("Seeds").Return(core.NewSeeds(), nil)
p.On("Parent").Return(parent, nil)
p.On("Usable", mock.AnythingOfType("*core.Machine")).Return(true, nil)
return p
}
func TestBasis(t testing.T, opts ...BasisOption) (b *Basis) {
td, err := ioutil.TempDir("", "core")
require.NoError(t, err)
t.Cleanup(func() { os.RemoveAll(td) })
name := filepath.Base(td)
mkSubdir := func(root, sub string) string {
sd := filepath.Join(root, sub)
require.NoError(t, os.Mkdir(sd, 0755))
return sd
}
projDir := &datadir.Basis{
Dir: datadir.NewBasicDir(
mkSubdir(td, "config"),
mkSubdir(td, "cache"),
mkSubdir(td, "data"),
mkSubdir(td, "temp"),
),
}
client := singleprocess.TestServer(t)
manager := plugin.TestManager(t)
factory := NewFactory(
context.Background(),
client,
hclog.New(
&hclog.LoggerOptions{
Name: "vagrant.core.factory",
Level: hclog.Trace,
},
),
manager,
(terminal.UI)(nil),
)
defaultOpts := []BasisOption{
WithFactory(factory),
WithClient(client),
WithBasisDataDir(projDir),
WithBasisRef(&vagrant_plugin_sdk.Ref_Basis{Name: name, Path: td}),
}
b, err = factory.NewBasis("", append(defaultOpts, opts...)...)
require.NoError(t, err)
require.NoError(t, b.Save())
return
}