1# vi:filetype=
2
3use lib 'lib';
4use Test::Nginx::Socket;
5
6repeat_each(1);
7
8plan tests => repeat_each() * 2 * blocks();
9
10no_long_string();
11
12run_tests();
13
14#no_diff();
15
16__DATA__
17
18=== TEST 1: rds in a single buf (empty result set)
19--- config
20location = /single {
21    default_type 'application/x-resty-dbd-stream';
22    set_unescape_uri $rds $arg_rds;
23    echo_duplicate 1 $rds;
24    rds_csv on;
25}
26--- request eval
27my $rds = "\x{00}". # endian
28"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
29"\x{00}". # result type
30"\x{00}\x{00}".  # std errcode
31"\x{00}\x{00}" . # driver errcode
32"\x{00}\x{00}".  # driver errstr len
33"".  # driver errstr data
34"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected
35"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id
36"\x{02}\x{00}".  # col count
37"\x{01}\x{00}".  # std col type (bigint/int)
38"\x{03}\x{00}".  # drizzle col type
39"\x{02}\x{00}".     # col name len
40"id".   # col name data
41"\x{13}\x{80}".  # std col type (blob/str)
42"\x{fc}\x{00}".  # drizzle col type
43"\x{04}\x{00}".  # col name len
44"name".  # col name data
45"\x{00}";  # row list terminator
46
47use URI::Escape;
48$rds = uri_escape($rds);
49"GET /single?rds=$rds"
50--- response_body eval
51"id,name\r
52"
53
54
55
56=== TEST 2: rds in a single buf (non-empty result set)
57--- config
58location = /single {
59    default_type 'application/x-resty-dbd-stream';
60    set_unescape_uri $rds $arg_rds;
61    echo_duplicate 1 $rds;
62    rds_csv on;
63}
64--- request eval
65my $rds =
66"\x{00}". # endian
67"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
68"\x{00}". # result type
69"\x{00}\x{00}".  # std errcode
70"\x{00}\x{00}" . # driver errcode
71"\x{00}\x{00}".  # driver errstr len
72"".  # driver errstr data
73"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected
74"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id
75"\x{02}\x{00}".  # col count
76"\x{01}\x{00}".  # std col type (bigint/int)
77"\x{03}\x{00}".  # drizzle col type
78"\x{02}\x{00}".     # col name len
79"id".   # col name data
80"\x{13}\x{80}".  # std col type (blob/str)
81"\x{fc}\x{00}".  # drizzle col type
82"\x{04}\x{00}".  # col name len
83"name".  # col name data
84"\x{01}".  # valid row flag
85"\x{01}\x{00}\x{00}\x{00}".  # field len
86"2".  # field data
87"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len
88"".  # field data
89"\x{01}".  # valid row flag
90"\x{01}\x{00}\x{00}\x{00}".  # field len
91"3".  # field data
92"\x{03}\x{00}\x{00}\x{00}".  # field len
93"bob".  # field data
94"\x{00}";  # row list terminator
95
96use URI::Escape;
97$rds = uri_escape($rds);
98"GET /single?rds=$rds"
99--- response_body eval
100"id,name\r
1012,\r
1023,bob\r
103"
104
105
106
107=== TEST 3: rds in a single buf (non-empty result set, and each row in a single buf)
108--- config
109location = /single {
110    default_type 'application/x-resty-dbd-stream';
111
112    set_unescape_uri $a $arg_a;
113    set_unescape_uri $b $arg_b;
114    set_unescape_uri $c $arg_c;
115    set_unescape_uri $d $arg_d;
116
117    echo_duplicate 1 $a;
118    echo_duplicate 1 $b;
119    echo_duplicate 1 $c;
120    echo_duplicate 1 $d;
121
122    rds_csv on;
123}
124--- request eval
125my $a =
126"\x{00}". # endian
127"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
128"\x{00}". # result type
129"\x{00}\x{00}".  # std errcode
130"\x{00}\x{00}" . # driver errcode
131"\x{00}\x{00}".  # driver errstr len
132"".  # driver errstr data
133"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected
134"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id
135"\x{02}\x{00}".  # col count
136"\x{01}\x{00}".  # std col type (bigint/int)
137"\x{03}\x{00}".  # drizzle col type
138"\x{02}\x{00}".     # col name len
139"id".   # col name data
140"\x{13}\x{80}".  # std col type (blob/str)
141"\x{fc}\x{00}".  # drizzle col type
142"\x{04}\x{00}".  # col name len
143"name";  # col name data
144
145my $b =
146"\x{01}".  # valid row flag
147"\x{01}\x{00}\x{00}\x{00}".  # field len
148"2".  # field data
149"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len
150"";  # field data
151
152my $c =
153"\x{01}".  # valid row flag
154"\x{01}\x{00}\x{00}\x{00}".  # field len
155"3".  # field data
156"\x{03}\x{00}\x{00}\x{00}".  # field len
157"bob";  # field data
158
159my $d =
160"\x{00}";  # row list terminator
161
162use URI::Escape;
163
164$a = uri_escape($a);
165$b = uri_escape($b);
166$c = uri_escape($c);
167$d = uri_escape($d);
168
169"GET /single?a=$a&b=$b&c=$c&d=$d"
170--- response_body eval
171"id,name\r
1722,\r
1733,bob\r
174"
175
176
177
178=== TEST 4: rds in a single buf (non-empty result set, and each row in a single buf)
179--- config
180location = /single {
181    default_type 'application/x-resty-dbd-stream';
182
183    set_unescape_uri $a $arg_a;
184    set_unescape_uri $b $arg_b;
185    set_unescape_uri $c $arg_c;
186
187    echo -n $a;
188    echo -n $b;
189    echo -n $c;
190
191    rds_csv on;
192}
193--- request eval
194my $a =
195"\x{00}". # endian
196"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
197"\x{00}". # result type
198"\x{00}\x{00}".  # std errcode
199"\x{00}\x{00}" . # driver errcode
200"\x{00}\x{00}".  # driver errstr len
201"".  # driver errstr data
202"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected
203"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id
204"\x{02}\x{00}".  # col count
205"\x{01}\x{00}".  # std col type (bigint/int)
206"\x{03}\x{00}".  # drizzle col type
207"\x{02}\x{00}".     # col name len
208"id".   # col name data
209"\x{13}\x{80}".  # std col type (blob/str)
210"\x{fc}\x{00}".  # drizzle col type
211"\x{04}\x{00}".  # col name len
212"name";  # col name data
213
214my $b =
215"\x{01}".  # valid row flag
216"\x{01}\x{00}\x{00}\x{00}".  # field len
217"2".  # field data
218"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len
219"";  # field data
220
221my $c =
222"\x{01}".  # valid row flag
223"\x{01}\x{00}\x{00}\x{00}".  # field len
224"3".  # field data
225"\x{03}\x{00}\x{00}\x{00}".  # field len
226"bob".  # field data
227"\x{00}";  # row list terminator
228
229use URI::Escape;
230
231$a = uri_escape($a);
232$b = uri_escape($b);
233$c = uri_escape($c);
234
235"GET /single?a=$a&b=$b&c=$c"
236--- response_body eval
237"id,name\r
2382,\r
2393,bob\r
240"
241
242