Engine/GCTScript: Refactor script manager (#580)

* refactor script manager

* remove singleton GCTScriptConfig
* create constant for ".gct" extension
* move GctScriptManager into vm package
* reduce script manager global dependencies
* use manager struct to store runtime override values
* enable/disable scripting subsystem now doesn't store the setting in
config (aligned with other subsystems)
* setting max VMs via start option doesn't change config

* instantiate scriptmanager as part of creating a new Engine

    * script manager config is now set during instantiation
    * run script manager when enabled in conf or explicitly enabled
    * use the Started() method to check if script manager is running

* in tests set script manager as running

* script manager adjustments

* create manager before attempting overrides
* check for nil config when creating script manager

* fix script manager waitgroup counter increased too late

* move autoload() function to autoload.go
* add tests to script manager
This commit is contained in:
Rauno Ots
2020-11-05 05:44:53 +01:00
committed by GitHub
parent ee55ae5d0f
commit 1b65d97b65
19 changed files with 520 additions and 253 deletions

View File

@@ -35,12 +35,19 @@ func TestMain(m *testing.M) {
log.RWM.Lock()
log.GlobalLogConfig = &c
log.RWM.Unlock()
GCTScriptConfig = configHelper(true, true, maxTestVirtualMachines)
os.Exit(m.Run())
}
func TestNewVM(t *testing.T) {
x := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
}
x := manager.New()
if x != nil {
t.Error("Should not create a VM when manager not started")
}
manager.started = 1
x = manager.New()
xType := reflect.TypeOf(x).String()
if xType != "*vm.VM" {
t.Fatalf("vm.New should return pointer to VM instead received: %v", x)
@@ -48,32 +55,38 @@ func TestNewVM(t *testing.T) {
}
func TestVMLoad(t *testing.T) {
GCTScriptConfig = configHelper(true, true, maxTestVirtualMachines)
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testScript)
if err != nil {
t.Fatal(err)
}
testScript = testScript[0 : len(testScript)-4]
testVM = New()
testVM = manager.New()
err = testVM.Load(testScript)
if err != nil {
t.Fatal(err)
}
GCTScriptConfig = configHelper(false, false, maxTestVirtualMachines)
manager.config = configHelper(false, false, maxTestVirtualMachines)
err = testVM.Load(testScript)
if err != nil {
if !errors.Is(err, ErrScriptingDisabled) {
t.Fatal(err)
}
}
GCTScriptConfig = configHelper(true, true, maxTestVirtualMachines)
}
func TestVMLoad1s(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testScriptRunner1s)
if err != nil {
t.Fatal(err)
@@ -90,7 +103,11 @@ func TestVMLoad1s(t *testing.T) {
}
func TestVMLoadNegativeTimer(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testScriptRunnerNegative)
if err != nil {
if !errors.Is(err, ErrNoVMLoaded) {
@@ -105,7 +122,11 @@ func TestVMLoadNegativeTimer(t *testing.T) {
}
func TestVMLoadNilVM(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testScript)
if err != nil {
if !errors.Is(err, ErrNoVMLoaded) {
@@ -122,8 +143,12 @@ func TestVMLoadNilVM(t *testing.T) {
}
func TestCompileAndRunNilVM(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
vmcount := VMSCount.Len()
testVM := New()
testVM := manager.New()
err := testVM.Load(testScript)
if err != nil {
if !errors.Is(err, ErrNoVMLoaded) {
@@ -149,7 +174,11 @@ func TestCompileAndRunNilVM(t *testing.T) {
}
func TestVMLoadNoFile(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load("missing file")
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
@@ -159,7 +188,11 @@ func TestVMLoadNoFile(t *testing.T) {
}
func TestVMCompile(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testScript)
if err != nil {
t.Fatal(err)
@@ -172,7 +205,11 @@ func TestVMCompile(t *testing.T) {
}
func TestVMRun(t *testing.T) {
testVM := NewVM()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.NewVM()
err := testVM.Load(testScript)
if err != nil {
t.Fatal(err)
@@ -190,7 +227,11 @@ func TestVMRun(t *testing.T) {
}
func TestVMRunTX(t *testing.T) {
testVM := NewVM()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.NewVM()
err := testVM.Load(testScript)
if err != nil {
t.Fatal(err)
@@ -208,8 +249,12 @@ func TestVMRunTX(t *testing.T) {
}
func TestVMWithRunner(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
vmCount := VMSCount.Len()
VM := New()
VM := manager.New()
if VM == nil {
t.Fatal("Failed to allocate new VM exiting")
}
@@ -231,8 +276,12 @@ func TestVMWithRunner(t *testing.T) {
}
func TestVMWithRunnerOnce(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
vmCount := VMSCount.Len()
VM := New()
VM := manager.New()
if VM == nil {
t.Fatal("Failed to allocate new VM exiting")
}
@@ -251,8 +300,12 @@ func TestVMWithRunnerOnce(t *testing.T) {
}
func TestVMWithRunnerNegativeTimer(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
vmCount := VMSCount.Len()
VM := New()
VM := manager.New()
if VM == nil {
t.Fatal("Failed to allocate new VM exiting")
}
@@ -274,8 +327,12 @@ func TestVMWithRunnerNegativeTimer(t *testing.T) {
}
func TestShutdownAll(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
vmCount := VMSCount.Len()
VM := New()
VM := manager.New()
err := VM.Load(testScriptRunner)
if err != nil {
t.Fatal(err)
@@ -286,7 +343,7 @@ func TestShutdownAll(t *testing.T) {
if VMSCount.Len() == vmCount {
t.Fatal("expected VM count to increase")
}
err = ShutdownAll()
err = manager.ShutdownAll()
if err != nil {
t.Fatal(err)
}
@@ -297,7 +354,11 @@ func TestShutdownAll(t *testing.T) {
}
func TestRead(t *testing.T) {
VM := NewVM()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
VM := manager.NewVM()
err := VM.Load(testScriptRunner)
if err != nil {
t.Fatal(err)
@@ -315,8 +376,12 @@ func TestRead(t *testing.T) {
}
func TestRemoveVM(t *testing.T) {
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
id, _ := uuid.FromString("6f20c907-64a0-48f2-848a-7837dee61672")
err := RemoveVM(id)
err := manager.RemoveVM(id)
if err != nil {
if err.Error() != "VM 6f20c907-64a0-48f2-848a-7837dee61672 not found" {
@@ -338,7 +403,11 @@ func TestError_Error(t *testing.T) {
}
func TestVM_CompileInvalid(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testInvalidScript)
if err != nil {
t.Fatal(err)
@@ -353,7 +422,7 @@ func TestVM_CompileInvalid(t *testing.T) {
t.Fatal("unexpected result broken script compiled successfully ")
}
testVM = New()
testVM = manager.New()
err = testVM.Load(testInvalidScript)
if err != nil {
t.Fatal(err)
@@ -369,7 +438,7 @@ func TestVM_CompileInvalid(t *testing.T) {
t.Fatal("unexpected result broken script compiled successfully ")
}
testVM = New()
testVM = manager.New()
err = testVM.Load(testInvalidScript)
if err != nil {
t.Fatal(err)
@@ -383,7 +452,11 @@ func TestVM_CompileInvalid(t *testing.T) {
}
func TestVM_CompileBroken(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testBrokenScript)
if err != nil {
t.Fatal(err)
@@ -396,7 +469,11 @@ func TestVM_CompileBroken(t *testing.T) {
}
func TestVM_CompileAndRunBroken(t *testing.T) {
testVM := New()
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
testVM := manager.New()
err := testVM.Load(testBrokenScript)
if err != nil {
t.Fatal(err)
@@ -410,48 +487,56 @@ func TestVM_CompileAndRunBroken(t *testing.T) {
}
func TestValidate(t *testing.T) {
err := Validate(testBrokenScript)
manager := GctScriptManager{
config: configHelper(true, true, maxTestVirtualMachines),
started: 1,
}
err := manager.Validate(testBrokenScript)
if err == nil {
t.Fatal(err)
}
err = Validate(testScript)
err = manager.Validate(testScript)
if err != nil {
t.Fatal(err)
}
}
func TestVMLimit(t *testing.T) {
GCTScriptConfig = configHelper(true, false, 0)
testVM := New()
manager := GctScriptManager{
config: configHelper(true, false, 0),
started: 1,
}
testVM := manager.New()
if testVM != nil {
t.Fatal("expected nil but received pointer to VM")
}
GCTScriptConfig = configHelper(true, true, maxTestVirtualMachines)
}
func TestAutoload(t *testing.T) {
GCTScriptConfig = &Config{
Enabled: true,
AutoLoad: []string{
scriptName,
manager := GctScriptManager{
config: &Config{
Enabled: true,
AutoLoad: []string{
scriptName,
},
Verbose: true,
},
Verbose: true,
}
ScriptPath = filepath.Join("..", "..", "testdata", "gctscript")
err := Autoload(scriptName, true)
err := manager.Autoload(scriptName, true)
if err != nil {
t.Fatal(err)
}
err = Autoload(scriptName, true)
err = manager.Autoload(scriptName, true)
if err == nil {
t.Fatal("expected err to be script not found received nil")
}
err = Autoload("once", false)
err = manager.Autoload("once", false)
if err != nil {
t.Fatal(err)
}
err = Autoload(scriptName, false)
err = manager.Autoload(scriptName, false)
if err == nil {
t.Fatal("expected err to be script not found received nil")
}