Skip to content

controller/vm: add unit tests for VM Controller state machine#2634

Open
shreyanshjain7174 wants to merge 2 commits intomicrosoft:mainfrom
shreyanshjain7174:controller/vm-unit-tests
Open

controller/vm: add unit tests for VM Controller state machine#2634
shreyanshjain7174 wants to merge 2 commits intomicrosoft:mainfrom
shreyanshjain7174:controller/vm-unit-tests

Conversation

@shreyanshjain7174
Copy link
Copy Markdown
Contributor

@shreyanshjain7174 shreyanshjain7174 commented Mar 18, 2026

Depends on #2627 — must merge first.

Adds unit tests for the VM Controller state machine (internal/controller/vm/). To make the Manager testable, two field types are changed to their existing interfaces (vmmanager.LifetimeManager, combined GuestManager). Mocks are generated with mockgen following the internal/windows/mock/ pattern.

Tests are biased toward production failure paths — resource cleanup, state corruption, and half-started scenarios — rather than guard-check permutations.

30 test cases covering: TerminateVM transitions (idempotency, Created/Running→Terminated, Close fail→Invalid, Invalid recovery, Terminate() error swallowed with Close still called, CloseConnection() error swallowed with Close still called), CreateVM duplicate-call rejection, StartVM failure paths (uvm.Start fails→Invalid, listener/connection failure→Invalid, idempotency when already Running, wrong-state rejection), ExecIntoHost (terminal+stderr precondition, success, exec error), DumpStacks (supported, not supported, dump error), StartTime/ExitStatus for relevant states, representative guard checks (one per method for realistic wrong-state calls), and State.String() for all values. All tests run without admin or HCS.

@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch from eeccba4 to 687d39e Compare March 20, 2026 06:32
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch from 687d39e to ef82816 Compare March 20, 2026 06:53
@shreyanshjain7174 shreyanshjain7174 marked this pull request as ready for review March 20, 2026 07:13
@shreyanshjain7174 shreyanshjain7174 requested a review from a team as a code owner March 20, 2026 07:13
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch 3 times, most recently from e8cacd2 to 4718b32 Compare March 24, 2026 14:28
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch from 4718b32 to 09f8fa8 Compare March 30, 2026 09:25
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch 2 times, most recently from e179fe0 to aba0d5f Compare April 6, 2026 11:23
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch 2 times, most recently from 2c926f4 to 5115d34 Compare April 27, 2026 08:28
Adds narrow `vmLifetime` and `guestManager` seam interfaces in the vm package and threads them through Controller so the state machine can be exercised without booting a real Hyper-V VM. Production wiring is unchanged: CreateVM still hands the concrete `*vmmanager.UtilityVM` and `*guestmanager.Guest` into the Controller, and device-level sub-controllers (scsi, vpci, plan9, network) continue to receive the wider concrete types via dedicated fields.

Test coverage focuses on production failure paths: TerminateVM cleanup-chain continuation when intermediate steps fail, transition to StateInvalid when uvm.Close errors, idempotency of TerminateVM/StartVM for the containerd retry case, exit-status and start-time accessor branches, ExecIntoHost guard and passthrough, DumpStacks capability gating, and the Update*/Stats/Wait/Create state guards for the most realistic wrong-state callers.

Signed-off-by: Shreyansh Sancheti <shsancheti@microsoft.com>
@shreyanshjain7174 shreyanshjain7174 force-pushed the controller/vm-unit-tests branch from 5115d34 to b6fc890 Compare April 27, 2026 12:37
mock_vm.go imports types from internal/vm/guestmanager and internal/cmd
that are themselves gated to "windows && (lcow || wcow)". Without a build
tag on the generated mock, the bare "windows" lint matrix in CI tries to
typecheck mock_vm.go and fails because its imports have no buildable files.

Add the same build constraint as the source interfaces (types.go) so the
mock is excluded from bare-windows and bare-linux compilation, matching
the existing pattern used by the vpci controller mocks.

Signed-off-by: Shreyansh Sancheti <shsancheti@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant