nx_range_header_gate.nx source
↩ module page · 59 lines · 4153 B
1import "nx_range_header.nx"
2import "nx_gate_verdict.nx"
3static rgt_plan: *i64
4const RGT_CASES: *u8="beach-signature-range\nexplicit-range\nopen-range\nsuffix-range\noversized-end-clamped\noversized-suffix-clamped\noversized-start-unsatisfiable\nhuge-reversed-range-invalid\nreversed-range-invalid\nmissing-comma-invalid\ntrailing-junk-invalid\nempty-list-invalid\nwhitespace-and-empty-members\ncase-insensitive-unit\nzero-suffix-unsatisfiable\nempty-resource-explicit\nempty-resource-positive-suffix\nunsupported-unit\nnegative-resource-invalid\ncapacity-refuses-without-writing\nskip-unsatisfiable-member\nmultiple-ranges-correct-layout\nlegacy-decimal-overflow-refused\nall-signature-prefixes-safe\n"
5func rgt_case(name: *u8,s: *u8,total: i64,expected: i64,start: i64,end: i64,count: *i64) -> i64 {
6 let bytes: i64=3*__size_of(RangeSpec)
7 let raw: *u8=sys_mmap(bytes)
8 var i: i64=0;while i<bytes { raw[i]=77 as u8;i=i+1 }
9 let ranges: *RangeSpec=raw as *RangeSpec
10 let rc: i64=range_parse(s,rgt_len(s),total,ranges,2)
11 var ok: i64=(rc==expected) as i64
12 if expected>0 { if ranges[0].start!=start || ranges[0].end!=end { ok=0 } }
13 else { i=0;while i<2*__size_of(RangeSpec) { if raw[i]!=(77 as u8) { ok=0 };i=i+1 } }
14 i=2*__size_of(RangeSpec);while i<bytes { if raw[i]!=(77 as u8) { ok=0 };i=i+1 }
15 gv_plan_check(rgt_plan,name,ok,count)
16 sys_munmap(raw,bytes);return 0
17}
18func rgt_len(s: *u8) -> i64 { var i: i64=0;while s[i]!=(0 as u8) { i=i+1 };return i }
19func main() -> i64 {
20 let count: *i64=gv_ctr();rgt_plan=gv_plan_new(RGT_CASES)
21 rgt_case("beach-signature-range","bytes=0-7",11728120,1,0,7,count)
22 rgt_case("explicit-range","bytes=500-999",1000,1,500,999,count)
23 rgt_case("open-range","bytes=500-",1000,1,500,999,count)
24 rgt_case("suffix-range","bytes=-500",1000,1,500,999,count)
25 rgt_case("oversized-end-clamped","bytes=1-999999999999999999999999",1000,1,1,999,count)
26 rgt_case("oversized-suffix-clamped","bytes=-999999999999999999999999",1000,1,0,999,count)
27 rgt_case("oversized-start-unsatisfiable","bytes=999999999999999999999999-",1000,-4,0,0,count)
28 rgt_case("huge-reversed-range-invalid","bytes=999999999999999999999999-999999999999999999999998",1000,-1,0,0,count)
29 rgt_case("reversed-range-invalid","bytes=50-20",1000,-1,0,0,count)
30 rgt_case("missing-comma-invalid","bytes=0-1 2-3",1000,-1,0,0,count)
31 rgt_case("trailing-junk-invalid","bytes=0-1,junk",1000,-1,0,0,count)
32 rgt_case("empty-list-invalid","bytes= , ,",1000,-1,0,0,count)
33 rgt_case("whitespace-and-empty-members","bytes= , 0-7, ,",1000,1,0,7,count)
34 rgt_case("case-insensitive-unit","BYTES=0-7",1000,1,0,7,count)
35 rgt_case("zero-suffix-unsatisfiable","bytes=-0",1000,-4,0,0,count)
36 rgt_case("empty-resource-explicit","bytes=0-",0,-4,0,0,count)
37 rgt_case("empty-resource-positive-suffix","bytes=-1",0,-5,0,0,count)
38 rgt_case("unsupported-unit","chars=0-7",1000,-2,0,0,count)
39 rgt_case("negative-resource-invalid","bytes=0-7",-1,-1,0,0,count)
40 rgt_case("capacity-refuses-without-writing","bytes=0-1,3-4,6-7",1000,-3,0,0,count)
41 rgt_case("skip-unsatisfiable-member","bytes=9000-,0-7",1000,1,0,7,count)
42 let bytes: i64=2*__size_of(RangeSpec);let raw: *u8=sys_mmap(bytes);let ranges: *RangeSpec=raw as *RangeSpec
43 let s: *u8="bytes=0-9,20-29"
44 let rc: i64=range_parse(s,rgt_len(s),1000,ranges,2)
45 gv_plan_check(rgt_plan,"multiple-ranges-correct-layout",((rc==2)&&(ranges[0].start==0)&&(ranges[0].end==9)&&(ranges[1].start==20)&&(ranges[1].end==29)) as i64,count)
46 let off: *i64=sys_mmap(__size_of(i64)) as *i64;off[0]=0
47 let huge: *u8="9223372036854775808"
48 gv_plan_check(rgt_plan,"legacy-decimal-overflow-refused",(rh_parse_uint(huge,off,rgt_len(huge))==RH_ERR_NUMBER) as i64,count)
49 let sig: *u8="bytes=0-7";var i: i64=0;var ok: i64=1
50 while i<=rgt_len(sig) {
51 let prc: i64=range_parse(sig,i,11728120,ranges,2)
52 if prc>0 { if ranges[0].start<0 || ranges[0].end>=11728120 || ranges[0].end<ranges[0].start { ok=0 } }
53 i=i+1
54 }
55 gv_plan_check(rgt_plan,"all-signature-prefixes-safe",ok,count)
56 sys_munmap(off as *u8,__size_of(i64));sys_munmap(raw,bytes)
57 gv_plan_finish(rgt_plan,count)
58 return gv_verdict("RANGE-HEADER-GATE",count,"native parser; serving integration separate")
59}