This repository has no description
1//go:build linux
2
3package microvm
4
5import (
6 "context"
7 "errors"
8 "log/slog"
9 "testing"
10
11 "tangled.org/core/spindle/models"
12)
13
14type shutdownTestVM struct {
15 exited bool
16 waitErr error
17 shutdownErr error
18 closed bool
19}
20
21func (v *shutdownTestVM) Shutdown(context.Context) error {
22 v.exited = true
23 return v.shutdownErr
24}
25
26func (v *shutdownTestVM) WaitContext(ctx context.Context) error {
27 if v.exited {
28 return v.waitErr
29 }
30 return ctx.Err()
31}
32
33func (v *shutdownTestVM) Close() error {
34 v.closed = true
35 return nil
36}
37
38func (*shutdownTestVM) Logs() VMLogs { return VMLogs{} }
39func (*shutdownTestVM) CID() uint32 { return 0 }
40func (*shutdownTestVM) WorkDir() string { return "" }
41func (*shutdownTestVM) OOMKilled() bool { return false }
42
43func TestShutdownVM_TreatsExitedVMAsCleanedUp(t *testing.T) {
44 for name, vm := range map[string]*shutdownTestVM{
45 "already exited": {
46 exited: true,
47 waitErr: errors.New("qemu exited"),
48 shutdownErr: errors.New("qmp broken pipe"),
49 },
50 "exits during fallback": {
51 waitErr: errors.New("qemu exited"),
52 shutdownErr: errors.New("qmp broken pipe"),
53 },
54 } {
55 t.Run(name, func(t *testing.T) {
56 e := &Engine{l: slog.Default()}
57 state := &workflowState{VM: vm}
58
59 if err := e.shutdownVM(context.Background(), models.WorkflowId{}, state); err != nil {
60 t.Fatalf("shutdownVM: %v", err)
61 }
62 if !vm.closed {
63 t.Fatal("expected vm handle to be closed")
64 }
65 })
66 }
67}