code wiki / (root) / nx_range_header_gate.nx

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}