nx_abi_lock_test.nx source
↩ module page · 65 lines · 2222 B
1// nx_abi_lock_test.nx -- smoke: seal two identical manifests, verify UNCHANGED.
2
3import "nx_syscalls.nx"
4import "nx_tier.nx"
5import "nx_sha256.nx"
6import "nx_abi_lock.nx"
7
8// Helper: build a one-symbol AbiManifest where the symbol is named
9// "foo" with sig_bytes = {0,0,0,1} (4-byte stub canonical signature).
10// Returns pointer to the manifest.
11func _make_manifest() -> *AbiManifest {
12 let am: *AbiManifest = (sys_mmap(NX_SIZEOF_NX_INT * 8)) as *AbiManifest
13 let name: *u8 = (sys_mmap(4)) as *u8
14 name[0] = 102 // f
15 name[1] = 111 // o
16 name[2] = 111 // o
17 let sig: *u8 = (sys_mmap(4)) as *u8
18 sig[0] = 0
19 sig[1] = 0
20 sig[2] = 0
21 sig[3] = 1
22
23 // Single-element symbol "array": just one AbiSymbol pointed-to.
24 // Array-of-struct indexing with `.field` is not yet supported in
25 // the parser (codegen-Gap-3 territory) -- use single-element form.
26 let syms: *AbiSymbol = (sys_mmap(NX_SIZEOF_NX_INT * 8)) as *AbiSymbol
27 syms.name_bytes = name
28 syms.name_len = 3
29 syms.sig_bytes = sig
30 syms.sig_len = 4
31
32 let mod_name: *u8 = (sys_mmap(4)) as *u8
33 mod_name[0] = 109 // m
34 mod_name[1] = 111 // o
35 mod_name[2] = 100 // d
36
37 am.module_name = mod_name
38 am.module_name_len = 3
39 am.symbols = syms
40 am.n_symbols = 1
41 am.signature_hash = (sys_mmap(32)) as *u8
42 nx_abi_lock_seal(am)
43 return am
44}
45
46func main() -> nx_int {
47 let m1: *AbiManifest = _make_manifest()
48 let m2: *AbiManifest = _make_manifest()
49
50 // Two manifests built from identical bytes -> same signature hash.
51 let v: nx_int = nx_abi_lock_compare(m1, m2)
52 if v != NX_ABI_UNCHANGED { return 1 }
53
54 // The upgrade-safety predicate must accept UNCHANGED.
55 if nx_abi_upgrade_is_safe(NX_ABI_UNCHANGED) != 1 { return 2 }
56 if nx_abi_upgrade_is_safe(NX_ABI_ADDITIVE_OK) != 1 { return 3 }
57 if nx_abi_upgrade_is_safe(NX_ABI_BREAKING_REMOVED) != 0 { return 4 }
58 if nx_abi_upgrade_is_safe(NX_ABI_BREAKING_RETYPED) != 0 { return 5 }
59
60 // Sealed-enum validity gate.
61 if nx_abi_verdict_is_valid(NX_ABI_UNCHANGED) != 1 { return 6 }
62 if nx_abi_verdict_is_valid(99) != 0 { return 7 }
63
64 return 0
65}