nx_spore_test.nx source
↩ module page · 138 lines · 6277 B
1// nx_spore_test.nx -- smoke for nx_spore.
2
3import "nx_syscalls.nx"
4import "nx_spore.nx"
5
6func main() -> i64 {
7 let now: nx_size = 1000
8
9 // 1: form factor enum validity
10 if nx_sf_form_is_valid(NX_SF_HYBRID_ISO) != 1 { return 1 }
11 if nx_sf_form_is_valid(NX_SF_NISHI_SILICON_RV64) != 1 { return 2 }
12 if nx_sf_form_is_valid(-1) != 0 { return 3 }
13 if nx_sf_form_is_valid(8) != 0 { return 4 }
14 if NX_SF_N_FORMS != 8 { return 5 }
15
16 // 2: germination state enum validity
17 if nx_gs_state_is_valid(NX_GS_PACKED) != 1 { return 6 }
18 if nx_gs_state_is_valid(NX_GS_FAILED) != 1 { return 7 }
19 if nx_gs_state_is_valid(-1) != 0 { return 8 }
20 if nx_gs_state_is_valid(7) != 0 { return 9 }
21 if NX_GS_N_STATES != 7 { return 10 }
22
23 // 3: verdict enum validity
24 if nx_sp_verdict_is_valid(NX_SP_OK) != 1 { return 11 }
25 if nx_sp_verdict_is_valid(NX_SP_ERR_NULL_INPUT) != 1 { return 12 }
26 if nx_sp_verdict_is_valid(-1) != 0 { return 13 }
27 if nx_sp_verdict_is_valid(6) != 0 { return 14 }
28
29 // 4: terminal state predicate
30 if nx_gs_state_is_terminal(NX_GS_READY_FOR_SEED) != 1 { return 15 }
31 if nx_gs_state_is_terminal(NX_GS_FAILED) != 1 { return 16 }
32 if nx_gs_state_is_terminal(NX_GS_PACKED) != 0 { return 17 }
33 if nx_gs_state_is_terminal(NX_GS_NETWORKING_UP) != 0 { return 18 }
34
35 // 5: active state predicate
36 if nx_gs_state_is_active(NX_GS_NETWORKING_UP) != 1 { return 19 }
37 if nx_gs_state_is_active(NX_GS_VERIFIED) != 1 { return 20 }
38 if nx_gs_state_is_active(NX_GS_PACKED) != 0 { return 21 }
39 if nx_gs_state_is_active(NX_GS_READY_FOR_SEED) != 0 { return 22 }
40
41 // 6: bootable-artifact predicate
42 if nx_sf_is_bootable_artifact(NX_SF_HYBRID_ISO) != 1 { return 23 }
43 if nx_sf_is_bootable_artifact(NX_SF_RAW_DISK_IMG) != 1 { return 24 }
44 if nx_sf_is_bootable_artifact(NX_SF_SD_CARD) != 1 { return 25 }
45 if nx_sf_is_bootable_artifact(NX_SF_QCOW2) != 1 { return 26 }
46 if nx_sf_is_bootable_artifact(NX_SF_NISHI_SILICON_RV64) != 1 { return 27 }
47 if nx_sf_is_bootable_artifact(NX_SF_NETBOOT_PXE) != 0 { return 28 }
48 if nx_sf_is_bootable_artifact(99) != 0 { return 29 }
49
50 // 7: fresh record defaults
51 let r: *NxSporeRecord = nx_sp_record_new(NX_SF_HYBRID_ISO, 1234)
52 if r.form_factor != NX_SF_HYBRID_ISO { return 30 }
53 if r.state != NX_GS_PACKED { return 31 }
54 if r.operator_consent_id != 0 { return 32 }
55 if r.methyl_mark_id != 1234 { return 33 }
56 if r.target_silicon_trust != -1 { return 34 }
57
58 // 8: positive-network discipline -- LANDED without consent rejected
59 nx_sp_record_transition(r, NX_GS_TRANSPORTED, now)
60 if r.state != NX_GS_TRANSPORTED { return 35 }
61 let bad_land: nx_int = nx_sp_record_transition(r, NX_GS_LANDED, now + 10)
62 if bad_land != NX_SP_ERR_OPERATOR_CONSENT_MISSING { return 36 }
63 if r.state != NX_GS_TRANSPORTED { return 37 } // unchanged
64
65 // 9: record operator consent
66 let consent_rc: nx_int = nx_sp_record_set_operator_consent(r, 42)
67 if consent_rc != NX_SP_OK { return 38 }
68 if r.operator_consent_id != 42 { return 39 }
69
70 // 10: invalid consent (zero or negative) rejected
71 let bad_consent: nx_int = nx_sp_record_set_operator_consent(r, 0)
72 if bad_consent != NX_SP_ERR_OPERATOR_CONSENT_MISSING { return 40 }
73 if r.operator_consent_id != 42 { return 41 } // unchanged
74
75 // 11: now LANDED succeeds with consent
76 let v_land: nx_int = nx_sp_record_transition(r, NX_GS_LANDED, now + 100)
77 if v_land != NX_SP_OK { return 42 }
78 if r.state != NX_GS_LANDED { return 43 }
79 if r.landed_at_us != now + 100 { return 44 }
80
81 // 12: verification path -- attestation_ok=1 -> VERIFIED
82 let v_verif: nx_int = nx_sp_record_mark_verified(r, 1, now + 200)
83 if v_verif != NX_SP_OK { return 45 }
84 if r.state != NX_GS_VERIFIED { return 46 }
85 if r.verified_at_us != now + 200 { return 47 }
86
87 // 13: VERIFIED -> NETWORKING_UP
88 let v_net: nx_int = nx_sp_record_transition(r, NX_GS_NETWORKING_UP, now + 300)
89 if v_net != NX_SP_OK { return 48 }
90 if r.state != NX_GS_NETWORKING_UP { return 49 }
91 if r.networking_up_at_us != now + 300 { return 50 }
92
93 // 14: silicon trust set
94 let trust_rc: nx_int = nx_sp_record_set_silicon_trust(r, 6) // COMMODITY_INTEL
95 if trust_rc != NX_SP_OK { return 51 }
96 if r.target_silicon_trust != 6 { return 52 }
97
98 // 15: NETWORKING_UP -> READY_FOR_SEED
99 let v_rdy: nx_int = nx_sp_record_transition(r, NX_GS_READY_FOR_SEED, now + 400)
100 if v_rdy != NX_SP_OK { return 53 }
101 if r.state != NX_GS_READY_FOR_SEED { return 54 }
102
103 // 16: ready_for_seed predicate
104 if nx_sp_record_is_ready_for_seed(r) != 1 { return 55 }
105
106 // 17: terminal state -- no further transitions
107 let bad_term: nx_int = nx_sp_record_transition(r, NX_GS_PACKED, now + 500)
108 if bad_term != NX_SP_ERR_INVALID_TRANSITION { return 56 }
109
110 // 18: failure-path test -- separate record
111 let r2: *NxSporeRecord = nx_sp_record_new(NX_SF_QCOW2, 5678)
112 nx_sp_record_set_operator_consent(r2, 99)
113 nx_sp_record_transition(r2, NX_GS_TRANSPORTED, now)
114 nx_sp_record_transition(r2, NX_GS_LANDED, now + 10)
115 // verification fails -> FAILED
116 let v_fail: nx_int = nx_sp_record_mark_verified(r2, 0, now + 20)
117 if v_fail != NX_SP_OK { return 57 }
118 if r2.state != NX_GS_FAILED { return 58 }
119
120 // 19: FAILED cannot transition out
121 let bad_after_fail: nx_int = nx_sp_record_transition(r2, NX_GS_VERIFIED, now + 30)
122 if bad_after_fail != NX_SP_ERR_INVALID_TRANSITION { return 59 }
123
124 // 20: invalid skip-transition -- PACKED -> LANDED rejected
125 let r3: *NxSporeRecord = nx_sp_record_new(NX_SF_SD_CARD, 7777)
126 nx_sp_record_set_operator_consent(r3, 1)
127 let bad_skip: nx_int = nx_sp_record_transition(r3, NX_GS_LANDED, now)
128 if bad_skip != NX_SP_ERR_INVALID_TRANSITION { return 60 }
129
130 // 21: null record handling
131 let null_r: *NxSporeRecord = (0 as i64) as *NxSporeRecord
132 if nx_sp_record_set_operator_consent(null_r, 1) != NX_SP_ERR_NULL_INPUT { return 61 }
133 if nx_sp_record_transition(null_r, NX_GS_LANDED, now) != NX_SP_ERR_NULL_INPUT { return 62 }
134 if nx_sp_record_mark_verified(null_r, 1, now) != NX_SP_ERR_NULL_INPUT { return 63 }
135 if nx_sp_record_is_ready_for_seed(null_r) != 0 { return 64 }
136
137 return 0
138}