nx_https_url_for_fetch_test.nx source
↩ module page · 121 lines · 5169 B
1// nx_https_url_for_fetch_test.nx -- KAT for the HTTPS URL
2// parse + scheme validate + default port primitive.
3//
4// expect_exit: 0
5// license_tier: ORIGINAL
6
7import "nx_syscalls.nx"
8import "nx_url.nx"
9import "nx_https_url_for_fetch.nx"
10
11// Write ASCII bytes from `src` (length n) into buf, NUL-terminate.
12func write_str(buf: *u8, src: *u8, n: i64) -> i64 {
13 var i: i64 = 0
14 while i < n {
15 buf[i] = src[i]
16 i = i + 1
17 }
18 buf[n] = 0
19 return n
20}
21
22func main() -> i64 {
23 let buf: *u8 = sys_mmap(128)
24 let url: *NxUrl = nx_url_new()
25 let target_raw: *u8 = sys_mmap(64)
26 let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
27 target.url = url
28 target.port = 0
29
30 // ---- Test A: "https://example.com/path" -> OK, port = 443 ----
31 let url_a: *u8 = sys_mmap(64)
32 url_a[0]=0x68; url_a[1]=0x74; url_a[2]=0x74; url_a[3]=0x70; url_a[4]=0x73 // "https"
33 url_a[5]=0x3A; url_a[6]=0x2F; url_a[7]=0x2F // "://"
34 url_a[8]=0x65; url_a[9]=0x78; url_a[10]=0x61; url_a[11]=0x6D
35 url_a[12]=0x70; url_a[13]=0x6C; url_a[14]=0x65; url_a[15]=0x2E
36 url_a[16]=0x63; url_a[17]=0x6F; url_a[18]=0x6D // "example.com"
37 url_a[19]=0x2F; url_a[20]=0x70; url_a[21]=0x61; url_a[22]=0x74; url_a[23]=0x68 // "/path"
38 url_a[24]=0 // NUL
39 let v_a: i64 = nx_https_url_for_fetch(url_a, target)
40 if v_a != NX_HTTPS_URL_OK { return 1 }
41 if target.port != 443 { return 2 }
42 if target.url.host_len != 11 { return 3 } // "example.com"
43 if target.url.path_len != 5 { return 4 } // "/path"
44
45 // ---- Test B: "https://example.com:8443/" -> OK, port = 8443 ----
46 let url_b: *u8 = sys_mmap(64)
47 url_b[0]=0x68; url_b[1]=0x74; url_b[2]=0x74; url_b[3]=0x70; url_b[4]=0x73 // "https"
48 url_b[5]=0x3A; url_b[6]=0x2F; url_b[7]=0x2F
49 url_b[8]=0x65; url_b[9]=0x78; url_b[10]=0x61; url_b[11]=0x6D
50 url_b[12]=0x70; url_b[13]=0x6C; url_b[14]=0x65; url_b[15]=0x2E
51 url_b[16]=0x63; url_b[17]=0x6F; url_b[18]=0x6D // "example.com"
52 url_b[19]=0x3A; url_b[20]=0x38; url_b[21]=0x34; url_b[22]=0x34; url_b[23]=0x33 // ":8443"
53 url_b[24]=0x2F // "/"
54 url_b[25]=0
55 let url_b_p: *NxUrl = nx_url_new()
56 target.url = url_b_p
57 target.port = 0
58 let v_b: i64 = nx_https_url_for_fetch(url_b, target)
59 if v_b != NX_HTTPS_URL_OK { return 10 }
60 if target.port != 8443 { return 11 }
61
62 // ---- Test C: "http://example.com/" -> WRONG_SCHEME ----
63 let url_c: *u8 = sys_mmap(64)
64 url_c[0]=0x68; url_c[1]=0x74; url_c[2]=0x74; url_c[3]=0x70 // "http"
65 url_c[4]=0x3A; url_c[5]=0x2F; url_c[6]=0x2F
66 url_c[7]=0x65; url_c[8]=0x78; url_c[9]=0x61; url_c[10]=0x6D
67 url_c[11]=0x70; url_c[12]=0x6C; url_c[13]=0x65; url_c[14]=0x2E
68 url_c[15]=0x63; url_c[16]=0x6F; url_c[17]=0x6D
69 url_c[18]=0x2F
70 url_c[19]=0
71 let url_c_p: *NxUrl = nx_url_new()
72 target.url = url_c_p
73 target.port = 0
74 let v_c: i64 = nx_https_url_for_fetch(url_c, target)
75 if v_c != NX_HTTPS_URL_WRONG_SCHEME { return 20 }
76
77 // ---- Test D: "ftp://example.com/" -> WRONG_SCHEME ----
78 let url_d: *u8 = sys_mmap(32)
79 url_d[0]=0x66; url_d[1]=0x74; url_d[2]=0x70 // "ftp"
80 url_d[3]=0x3A; url_d[4]=0x2F; url_d[5]=0x2F
81 url_d[6]=0x65; url_d[7]=0x78; url_d[8]=0x61
82 url_d[9]=0x2F
83 url_d[10]=0
84 let url_d_p: *NxUrl = nx_url_new()
85 target.url = url_d_p
86 target.port = 0
87 if nx_https_url_for_fetch(url_d, target) != NX_HTTPS_URL_WRONG_SCHEME { return 30 }
88
89 // ---- Test E: no scheme "example.com" -> BAD_PARSE ----
90 let url_e: *u8 = sys_mmap(32)
91 url_e[0]=0x65; url_e[1]=0x78; url_e[2]=0x61
92 url_e[3]=0
93 let url_e_p: *NxUrl = nx_url_new()
94 target.url = url_e_p
95 target.port = 0
96 if nx_https_url_for_fetch(url_e, target) != NX_HTTPS_URL_BAD_PARSE { return 40 }
97
98 // ---- Test F: case-insensitive "HTTPS://" -> OK ----
99 let url_f: *u8 = sys_mmap(32)
100 url_f[0]=0x48; url_f[1]=0x54; url_f[2]=0x54; url_f[3]=0x50; url_f[4]=0x53 // "HTTPS"
101 url_f[5]=0x3A; url_f[6]=0x2F; url_f[7]=0x2F
102 url_f[8]=0x65; url_f[9]=0x78; url_f[10]=0x61 // "exa"
103 url_f[11]=0x2F
104 url_f[12]=0
105 let url_f_p: *NxUrl = nx_url_new()
106 target.url = url_f_p
107 target.port = 0
108 if nx_https_url_for_fetch(url_f, target) != NX_HTTPS_URL_OK { return 50 }
109 if target.port != 443 { return 51 }
110
111 // ---- Test G: verdict gate ----
112 if nx_https_url_verdict_is_valid(NX_HTTPS_URL_OK) != 1 { return 60 }
113 if nx_https_url_verdict_is_valid(NX_HTTPS_URL_BAD_PARSE) != 1 { return 61 }
114 if nx_https_url_verdict_is_valid(NX_HTTPS_URL_WRONG_SCHEME) != 1 { return 62 }
115 if nx_https_url_verdict_is_valid(NX_HTTPS_URL_BAD_PORT) != 1 { return 63 }
116 if nx_https_url_verdict_is_valid(NX_HTTPS_URL_VERDICT_N) != 0 { return 64 }
117 if nx_https_url_verdict_is_valid(0) != 0 { return 65 }
118 if nx_https_url_verdict_is_valid(0 - 1) != 0 { return 66 }
119
120 return 0
121}