lib/machine/src/instance/reference/integration/test.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const os = @import("os");
2 const std = @import("std");
3 const instance = @import("../../root.zig");
4 const profile = @import("../../../profile/root.zig");
5 const test_support = @import("../../fixture/root.zig");
6
7 const fixture = test_support.fixture;
8
9 test "portable reference backend exposes an unreceipted ready doorbell" {
10 var storage = instance.Storage.init();
11 const image = fixture.elf();
12 const execution = try fixture.execution(&image);
13 var machine = switch (instance.Instance.init(
14 &storage,
15 &fixture.ram,
16 fixture.input(
17 instance.Input,
18 profile.interpretedContinuationTestV1(),
19 &image,
20 &execution,
21 ),
22 )) {
23 .ready => |value| value,
24 .unavailable => return error.UnexpectedBackendUnavailable,
25 .rejected => |failure| return failure,
26 };
27 defer machine.deinit();
28
29 const exit = try machine.run();
30 try std.testing.expectEqual(.doorbell, std.meta.activeTag(exit));
31 try std.testing.expectEqual(os.abi.channel.DoorbellCode.ready, exit.doorbell.code);
32 try std.testing.expectEqual(instance.RunPhase.draining_activation, machine.phase());
33 try std.testing.expectError(error.EventDrainRequired, machine.run());
34 var batch: instance.EventBatch = undefined;
35 try std.testing.expectError(error.EventReceiptMismatch, machine.takeEvents(&batch));
36 try std.testing.expectEqual(instance.RunPhase.draining_activation, machine.phase());
37 }
38
39 test "portable reference backend detects executable mutation before execution" {
40 var storage = instance.Storage.init();
41 const image = fixture.elf();
42 const execution = try fixture.execution(&image);
43 var machine = switch (instance.Instance.init(
44 &storage,
45 &fixture.ram,
46 fixture.input(
47 instance.Input,
48 profile.interpretedContinuationTestV1(),
49 &image,
50 &execution,
51 ),
52 )) {
53 .ready => |value| value,
54 .unavailable => return error.UnexpectedBackendUnavailable,
55 .rejected => |failure| return failure,
56 };
57 defer machine.deinit();
58
59 fixture.ram[@intCast(os.boot.kernel.physical_base)] ^= 1;
60 const exit = try machine.run();
61 try std.testing.expectEqual(.fault, std.meta.activeTag(exit));
62 try std.testing.expectEqual(instance.FaultKind.memory, exit.fault.kind);
63 try std.testing.expectEqual(os.boot.kernel.physical_base, exit.fault.address);
64 try std.testing.expectEqual(instance.RunPhase.failed, machine.phase());
65 }