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