This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / spindle / engines / microvm / vm_test.go
1.5 kB 67 lines
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}