code wiki / (root) / nx_spore_test.nx

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}