Files
nomad/drivers/shared/executor/executor_windows_test.go

89 lines
2.3 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
//go:build windows
package executor
import (
"context"
"os"
"testing"
"time"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/client/allocdir"
"github.com/hashicorp/nomad/client/lib/numalib"
"github.com/hashicorp/nomad/client/taskenv"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/drivers"
"github.com/hashicorp/nomad/plugins/drivers/fsisolation"
"github.com/shoenig/test/must"
)
// testExecutorCommand sets up a test task environment.
func testExecutorCommand(t *testing.T) *testExecCmd {
alloc := mock.Alloc()
task := alloc.Job.TaskGroups[0].Tasks[0]
taskEnv := taskenv.NewBuilder(mock.Node(), alloc, task, "global").Build()
allocDir := allocdir.NewAllocDir(testlog.HCLogger(t), t.TempDir(), t.TempDir(), alloc.ID)
must.NoError(t, allocDir.Build())
t.Cleanup(func() { allocDir.Destroy() })
must.NoError(t, allocDir.NewTaskDir(task).Build(fsisolation.None, nil, task.User))
td := allocDir.TaskDirs[task.Name]
cmd := &ExecCommand{
Env: taskEnv.List(),
TaskDir: td.Dir,
Resources: &drivers.Resources{
NomadResources: &structs.AllocatedTaskResources{
Cpu: structs.AllocatedCpuResources{
CpuShares: 500,
},
Memory: structs.AllocatedMemoryResources{
MemoryMB: 256,
},
},
},
}
testCmd := &testExecCmd{
command: cmd,
allocDir: allocDir,
}
configureTLogging(t, testCmd)
return testCmd
}
func TestExecutor_ProcessExit(t *testing.T) {
ci.Parallel(t)
topology := numalib.Scan(numalib.PlatformScanners(false))
compute := topology.Compute()
cmd := testExecutorCommand(t)
cmd.command.Cmd = "Powershell.exe"
cmd.command.Args = []string{"sleep", "30"}
executor := NewExecutor(testlog.HCLogger(t), compute)
t.Cleanup(func() { executor.Shutdown("SIGKILL", 0) })
childPs, err := executor.Launch(cmd.command)
must.NoError(t, err)
must.NonZero(t, childPs.Pid)
proc, err := os.FindProcess(childPs.Pid)
must.NoError(t, err)
must.NoError(t, proc.Kill())
ctx, cancel := context.WithTimeout(context.TODO(), 1*time.Second)
t.Cleanup(cancel)
waitPs, err := executor.Wait(ctx)
must.NoError(t, err)
must.Eq(t, 1, waitPs.ExitCode)
must.Eq(t, childPs.Pid, waitPs.Pid)
}