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 }