code wiki / _hdl_build / nx_cms_migrate_gate.nx
nx_cms_migrate_gate.nx source
↩ module page · 118 lines · 6439 B
1// nx_cms_migrate_gate.nx -- CMS IMPORT/EXPORT/MIGRATE gate (the import-export-migrate class). Proves the
2// nx_cms_migrate capability over the REAL nx_cms_store format: a site round-trips through an integrity-
3// stamped bundle byte-identically AND stays functional, a TAMPERED bundle is REFUSED (no silent
4// corruption -- the exceed over all-in-one-migration), and a foreign WordPress-style export is migrated
5// into the native store with field + value mapping (post_status:publish -> published). Appends
6// "CMSGATE row=nx_cms_migrate ... verdict=PASS" to cms_gate.log ONLY if all rows pass. Exit 0 iff all pass.
7// license_tier: ORIGINAL
8import "nx_cms_migrate.nx"
9import "nx_cms_store.nx"
10import "nx_syscalls.nx"
11
12func mg_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func mg_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
14func mg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var k: i64=0; while s[k]!=(0 as u8){dst[o]=s[k];o=o+1;k=k+1} return o }
15func mg_catnum(dst: *u8, off: i64, v: i64) -> i64 {
16 var o: i64=off; let t: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; var k: i64=0
17 if m==0 {t[0]=48 as u8;k=1}; while m>0 {t[k]=(48+(m%10)) as u8; m=m/10; k=k+1}
18 var i: i64=0; while i<k {dst[o]=t[k-1-i]; o=o+1; i=i+1} return o
19}
20func mg_cpy(dst: *u8, src: *u8) -> i64 { var k: i64=0; while src[k]!=(0 as u8){dst[k]=src[k];k=k+1} return k }
21func mg_streq(buf: *u8, n: i64, lit: *u8) -> i64 {
22 var i: i64=0
23 while i<n { if (buf[i] as i64) != (lit[i] as i64) { return 0 } i=i+1 }
24 if (lit[n] as i64) != 0 { return 0 }
25 return 1
26}
27func mg_row(id: i64, ok: i64, what: *u8) -> i64 {
28 mg_w("MIGROW " as *u8); mg_num(id); mg_w(" " as *u8)
29 if ok==1 { mg_w("PASS " as *u8) } else { mg_w("FAIL " as *u8) }
30 mg_w(what); mg_w("\n" as *u8)
31 return ok
32}
33
34func main() -> i64 {
35 var pass: i64 = 0
36 var rows: i64 = 0
37 var ok: i64 = 0
38
39 let src: *u8 = sys_mmap(8192)
40 let srclen: i64 = mg_cpy(src, "@title\nAutumn Sale\n@status\nscheduled\n@body\nBig autumn news.\n" as *u8)
41 let sbuf: *u8 = sys_mmap(512)
42
43 // R0: export -> self-describing integrity-stamped bundle
44 let bundle: *u8 = sys_mmap(8192)
45 let blen: i64 = cms_migrate_export(src, srclen, bundle, 8192)
46 ok = 0; if cmm_find(bundle, blen, "@@NXEXPORT" as *u8) == 0 { ok = 1 }
47 rows=rows+1; pass=pass+mg_row(0, ok, "export -> @@NXEXPORT integrity-stamped bundle" as *u8)
48
49 // R1: import round-trips byte-identical
50 let imp: *u8 = sys_mmap(8192)
51 let ilen: i64 = cms_migrate_import(bundle, blen, imp, 8192)
52 ok = 0
53 if ilen == srclen {
54 var eq: i64 = 1
55 var i: i64 = 0
56 while i < srclen { if (imp[i] as i64) != (src[i] as i64) { eq = 0; i = srclen } i = i + 1 }
57 if eq == 1 { ok = 1 }
58 }
59 rows=rows+1; pass=pass+mg_row(1, ok, "import round-trips byte-identical" as *u8)
60
61 // R2: imported store is functional (a real cms_store, keys readable)
62 let g2: i64 = cst_get(imp, ilen, "title" as *u8, sbuf, 512)
63 ok = 0; if g2 >= 0 { if mg_streq(sbuf, g2, "Autumn Sale" as *u8) == 1 { ok = 1 } }
64 rows=rows+1; pass=pass+mg_row(2, ok, "imported store functional (cst_get title=Autumn Sale)" as *u8)
65
66 // R3: a TAMPERED bundle is REFUSED (integrity guard; no silent corruption)
67 let bad: *u8 = sys_mmap(8192)
68 var bc: i64 = 0
69 while bc < blen { bad[bc] = bundle[bc]; bc = bc + 1 }
70 // locate header end (first newline), flip a body byte
71 var he: i64 = 0 - 1
72 var fi: i64 = 0
73 while fi < blen { if (bad[fi] as i64) == 10 { he = fi; fi = blen } else { fi = fi + 1 } }
74 bad[he + 2] = 88 as u8 // 'X' over a body byte
75 let badlen: i64 = cms_migrate_import(bad, blen, imp, 8192)
76 ok = 0; if badlen == 0 - 1 { ok = 1 }
77 rows=rows+1; pass=pass+mg_row(3, ok, "tampered bundle REFUSED (sha mismatch -> -1)" as *u8)
78
79 // R4: cross-format migrate from a WordPress-style export -> native field mapping
80 let wp: *u8 = sys_mmap(4096)
81 let wn: i64 = mg_cpy(wp, "post_title: Autumn Sale\npost_content: Big news for fall.\npost_status: publish\npost_author: admin\n" as *u8)
82 let nat: *u8 = sys_mmap(8192)
83 let nlen: i64 = cms_migrate_wp_import(wp, wn, nat, 8192)
84 let gt: i64 = cst_get(nat, nlen, "title" as *u8, sbuf, 512)
85 var okt: i64 = 0; if gt >= 0 { if mg_streq(sbuf, gt, "Autumn Sale" as *u8) == 1 { okt = 1 } }
86 let gb: i64 = cst_get(nat, nlen, "body" as *u8, sbuf, 512)
87 var okb: i64 = 0; if gb >= 0 { if mg_streq(sbuf, gb, "Big news for fall." as *u8) == 1 { okb = 1 } }
88 ok = 0; if okt == 1 { if okb == 1 { ok = 1 } }
89 rows=rows+1; pass=pass+mg_row(4, ok, "WP migrate: post_title->title + post_content->body mapped" as *u8)
90
91 // R5: WP status VALUE migration (publish -> published)
92 let gs: i64 = cst_get(nat, nlen, "status" as *u8, sbuf, 512)
93 ok = 0; if gs >= 0 { if mg_streq(sbuf, gs, "published" as *u8) == 1 { ok = 1 } }
94 rows=rows+1; pass=pass+mg_row(5, ok, "WP migrate: post_status:publish -> native published" as *u8)
95
96 // R6: negative control -- a header-less blob is not importable
97 let junk: *u8 = sys_mmap(64)
98 let jn: i64 = mg_cpy(junk, "hello, not a bundle" as *u8)
99 let jr: i64 = cms_migrate_import(junk, jn, imp, 8192)
100 ok = 0; if jr == 0 - 1 { ok = 1 }
101 rows=rows+1; pass=pass+mg_row(6, ok, "header-less blob refused (negative control)" as *u8)
102
103 mg_w("CMS-MIGRATE-GATE rows=" as *u8); mg_num(rows); mg_w(" pass=" as *u8); mg_num(pass); mg_w("\n" as *u8)
104
105 if pass == rows {
106 let line: *u8 = sys_mmap(256)
107 var lo: i64 = mg_cat(line, 0, "CMSGATE row=nx_cms_migrate import-export-migrate rows=" as *u8)
108 lo = mg_catnum(line, lo, rows)
109 lo = mg_cat(line, lo, " pass=" as *u8); lo = mg_catnum(line, lo, pass)
110 lo = mg_cat(line, lo, " verdict=PASS\n" as *u8)
111 let gf: i64 = sys_openat_append("knowledge/status/cms_gate.log" as *u8, 0x1a4)
112 if gf >= 0 { sys_write(gf, line, lo); sys_close(gf) }
113 mg_w("CMS-MIGRATE-GATE verdict=PASS -- import-export-migrate recorded in cms_gate.log\n" as *u8)
114 sys_exit(0); return 0
115 }
116 mg_w("CMS-MIGRATE-GATE verdict=FAIL -- NOT recorded (no fake-green)\n" as *u8)
117 sys_exit(1); return 1
118}