code wiki / _hdl_build / nx_adnet_gate.nx
nx_adnet_gate.nx source
↩ module page · 50 lines · 4161 B
1// nx_adnet_gate.nx -- proves the sovereign 4chan-style banner ad server: contextual rotation by section, first-party
2// render (click via our tracker, no cookies), per-ad impression/click counters (no user tracking), click redirect.
3// expect_exit: 0 license_tier: ORIGINAL
4import "nx_adnet.nx"
5import "nx_g_puts_lib.nx"
6import "nx_syscalls.nx"
7
8func g_ck(name: *u8, cond: i64, st: *i64) -> i64 { st[1]=st[1]+1; if cond==1 { st[0]=st[0]+1; g_puts(" [OK] " as *u8) } else { g_puts(" [FAIL] " as *u8) } g_puts(name); g_puts("\n" as *u8); return 0 }
9func g_contains(hay: *u8, needle: *u8) -> i64 { let hl: i64=ad_slen(hay); let nl: i64=ad_slen(needle); if nl==0 { return 1 } var i: i64=0; while i+nl<=hl { var ok: i64=1; var j: i64=0; while j<nl { if hay[i+j]!=needle[j] { ok=0 } j=j+1 } if ok==1 { return 1 } i=i+1 } return 0 }
10func picked_id(inv: *u8, ilen: i64, section: *u8, rot: i64, out_id: *u8) -> i64 { let row: *u8=sys_mmap(1024); if ad_pick(inv,ilen,section,rot,row)==0 { out_id[0]=0 as u8; return 0 } ad_field(row, ad_slen(row), 0, out_id); return 1 }
11
12func main() -> i64 {
13 g_puts("=== nx_adnet_gate: sovereign 4chan-style banner ad server ===\n" as *u8)
14 let st: *i64 = sys_mmap(64) as *i64; st[0]=0; st[1]=0
15
16 // inventory: 2 board banners + 1 gallery banner
17 let inv: *u8 = sys_mmap(4096)
18 let s: *u8 = "ad1\tAcmeCorp\thttps://cdn.nishi/ad1.png\thttps://acme.example\tboard\t10\nad2\tBetaLLC\thttps://cdn.nishi/ad2.png\thttps://beta.example\tboard\t5\nad3\tGammaInc\thttps://cdn.nishi/ad3.png\thttps://gamma.example\tgallery\t8\n" as *u8
19 var ilen: i64=0; while s[ilen]!=(0 as u8) { inv[ilen]=s[ilen]; ilen=ilen+1 }
20
21 let id: *u8 = sys_mmap(128)
22 picked_id(inv, ilen, "board" as *u8, 0, id); g_ck("T1 rotate board[0] -> ad1" as *u8, ad_streq(id, "ad1" as *u8), st)
23 picked_id(inv, ilen, "board" as *u8, 1, id); g_ck("T2 rotate board[1] -> ad2 (round-robin)" as *u8, ad_streq(id, "ad2" as *u8), st)
24 picked_id(inv, ilen, "board" as *u8, 2, id); g_ck("T3 rotate board[2] -> ad1 (wraps, 2 mod 2)" as *u8, ad_streq(id, "ad1" as *u8), st)
25 picked_id(inv, ilen, "gallery" as *u8, 0, id); g_ck("T4 contextual: gallery[0] -> ad3 (section-targeted)" as *u8, ad_streq(id, "ad3" as *u8), st)
26
27 let row: *u8 = sys_mmap(1024); ad_pick(inv, ilen, "board" as *u8, 0, row)
28 let html: *u8 = sys_mmap(2048); ad_render_banner(row, ad_slen(row), html)
29 g_puts(" banner html: "); g_puts(html); g_puts("\n" as *u8)
30 var render_ok: i64=0
31 if g_contains(html, "/ad/click/ad1" as *u8)==1 { if g_contains(html, "https://cdn.nishi/ad1.png" as *u8)==1 { render_ok=1 } }
32 g_ck("T5 first-party render (our /ad/click tracker + advertiser img)" as *u8, render_ok, st)
33 g_ck("T6 PRIVACY: banner has no cookie / no 3rd-party tracker" as *u8, (g_contains(html, "cookie" as *u8)==0) & (g_contains(html, "doubleclick" as *u8)==0), st)
34
35 // impressions + clicks are per-AD, not per-user
36 let imp: *u8 = sys_mmap(4096); var implen: i64=0
37 var i: i64=0; while i<5 { implen=ad_event(imp, implen, "ad1" as *u8); i=i+1 }
38 g_ck("T7 impression tracking: 5 views of ad1 -> count 5" as *u8, ad_event_count(imp, implen, "ad1" as *u8)==5, st)
39 let clk: *u8 = sys_mmap(4096); var clklen: i64=0
40 clklen=ad_event(clk, clklen, "ad1" as *u8); clklen=ad_event(clk, clklen, "ad1" as *u8)
41 let tgt: *u8 = sys_mmap(1024); let found: i64=ad_click_target(inv, ilen, "ad1" as *u8, tgt)
42 g_puts(" ad1 click -> "); g_puts(tgt); g_puts("\n" as *u8)
43 g_ck("T8 click tracking + redirect (2 clicks; target = advertiser url)" as *u8, (ad_event_count(clk,clklen,"ad1" as *u8)==2) & found & ad_streq(tgt, "https://acme.example" as *u8), st)
44
45 g_puts("\n PASS " as *u8); if st[0]==st[1] { g_puts("ALL" as *u8) } else { g_puts("PARTIAL" as *u8) }
46 let p: *u8=sys_mmap(8); p[0]=(48+st[0]) as u8; p[1]=47 as u8; p[2]=(48+st[1]) as u8; p[3]=0 as u8
47 g_puts(" ("); g_puts(p); g_puts(")\n" as *u8)
48 if st[0]==st[1] { g_puts("=== GREEN (sovereign banner ads: rotate + first-party render + track + redirect, privacy-respecting) ===\n" as *u8); sys_exit(0); return 0 }
49 g_puts("=== RED ===\n" as *u8); sys_exit(1); return 1
50}