Branch data Line data Source code
1 : : /* Copyright 2006-2011 Savarese Software Research Corporation
2 : : *
3 : : * Licensed under the Apache License, Version 2.0 (the "License");
4 : : * you may not use this file except in compliance with the License.
5 : : * You may obtain a copy of the License at
6 : : *
7 : : * https://www.savarese.com/software/ApacheLicense-2.0
8 : : *
9 : : * Unless required by applicable law or agreed to in writing, software
10 : : * distributed under the License is distributed on an "AS IS" BASIS,
11 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : : * See the License for the specific language governing permissions and
13 : : * limitations under the License.
14 : : */
15 : :
16 : : #include <ssrc/wispers/fcgi/parse_query.h>
17 : :
18 : : #define BOOST_TEST_MODULE ParseQueryStringTest
19 : : #include <boost/test/unit_test.hpp>
20 : :
21 : : using namespace NS_SSRC_WSPR_FCGI;
22 : :
23 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_parse_query_string) {
24 [ + - ]: 2 : parameter_map parameters;
25 [ + - ]: 1 : parameter_map::iterator it;
26 : :
27 [ + - + - : 1 : parse_query_string("bar=foo&foo=bar", parameters);
+ - ]
28 : :
29 [ + - + - : 1 : BOOST_CHECK_EQUAL(parameters.size(), 2u);
+ - + - +
- + - -
+ ]
30 : :
31 [ + - + - : 1 : it = parameters.find("bar");
+ - ]
32 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
33 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "bar");
+ - + - +
- + - -
+ ]
34 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "foo");
+ - + - +
- + - -
+ ]
35 : :
36 [ + - + - : 1 : it = parameters.find("foo");
+ - ]
37 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
38 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "foo");
+ - + - +
- + - -
+ ]
39 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "bar");
+ - + - +
- + - -
+ ]
40 : :
41 [ + - ]: 1 : parameters.clear();
42 [ + - + - : 1 : parse_query_string( "=foo", parameters);
+ - ]
43 [ + - + - : 1 : BOOST_CHECK_EQUAL(parameters.size(), 0u);
+ - + - +
- + - -
+ ]
44 : :
45 [ + - ]: 1 : parameters.clear();
46 [ + - + - : 1 : parse_query_string("&&&&bar=foo", parameters);
+ - ]
47 [ + - + - : 1 : BOOST_CHECK_EQUAL(parameters.size(), 1u);
+ - + - +
- + - -
+ ]
48 : :
49 [ + - + - : 1 : it = parameters.find("bar");
+ - ]
50 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
51 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "bar");
+ - + - +
- + - -
+ ]
52 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "foo");
+ - + - +
- + - -
+ ]
53 : :
54 [ + - ]: 1 : parameters.clear();
55 [ + - + - : 1 : parse_query_string("foo=bar", parameters);
+ - ]
56 [ + - + - : 1 : BOOST_CHECK_EQUAL(parameters.size(), 1u);
+ - + - +
- + - -
+ ]
57 : :
58 [ + - + - : 1 : it = parameters.find("foo");
+ - ]
59 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
60 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "foo");
+ - + - +
- + - -
+ ]
61 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "bar");
+ - + - +
- + - -
+ ]
62 : :
63 [ + - ]: 1 : parameters.clear();
64 [ + - + - : 1 : parse_query_string("foo=blah%20blah&bar=la+la&baz=50%25", parameters);
+ - ]
65 [ + - + - : 1 : BOOST_CHECK_EQUAL(parameters.size(), 3u);
+ - + - +
- + - -
+ ]
66 : :
67 [ + - + - : 1 : it = parameters.find("foo");
+ - ]
68 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
69 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "foo");
+ - + - +
- + - -
+ ]
70 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second,"blah blah");
+ - + - +
- + - -
+ ]
71 : :
72 [ + - + - : 1 : it = parameters.find("bar");
+ - ]
73 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
74 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "bar");
+ - + - +
- + - -
+ ]
75 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "la la");
+ - + - +
- + - -
+ ]
76 : :
77 [ + - + - : 1 : it = parameters.find("baz");
+ - ]
78 [ + - + - : 1 : BOOST_CHECK(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
79 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->first, "baz");
+ - + - +
- + - -
+ ]
80 [ + - + - : 1 : BOOST_CHECK_EQUAL(it->second, "50%");
+ - + - +
- + - -
+ ]
81 : 1 : }
82 : :
83 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_parse_header_attribute) {
84 [ + - ]: 9 : struct test_pass {
85 : : unsigned int index;
86 : : std::string attr_name;
87 : : std::string attr_value;
88 : : };
89 : : const char * const values[2] = {
90 : : "multipart/form-data; boundary=---------------------------73473741115465877981752891035",
91 : : "Content-Type: message/external-body; name=\"BodyFormats.ps\";"
92 : : " site=\"thumper.bellcore.com\"; mode=\"image\";"
93 : : " access-type=ANON-FTP; directory=\"pub\";"
94 : : " expiration=\"Fri, 14 Jun 1991 19:13:14 -0400 (EDT)\"\r\n"
95 : 1 : };
96 : : #define NUM_PASSES 9
97 : : test_pass data[NUM_PASSES] = {
98 : : { 0, "boundary", "---------------------------73473741115465877981752891035" },
99 : : { 0, "foo", "" },
100 : : { 1, "name", "BodyFormats.ps" },
101 : : { 1, "site", "thumper.bellcore.com" },
102 : : { 1, "mode", "image" },
103 : : { 1, "access-type", "ANON-FTP" },
104 : : { 1, "directory", "pub" },
105 : : { 1, "expiration", "Fri, 14 Jun 1991 19:13:14 -0400 (EDT)" },
106 : : { 1, "foo", "" }
107 [ + - + - : 10 : };
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - # # #
# ]
108 : :
109 [ + + ]: 10 : for(unsigned int i = 0; i < NUM_PASSES; ++i) {
110 : 9 : const test_pass & d = data[i];
111 [ + - + - : 36 : BOOST_CHECK_EQUAL(parse_header_attribute(values[d.index], d.attr_name),
+ - - + ]
112 [ + - + - : 27 : d.attr_value);
+ - + - +
- + - ]
113 [ + + # # ]: 10 : }
114 : : #undef NUM_PASSES
115 : 1 : }
116 : :
117 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_parse_multipart_data) {
118 : : const char * const boundary =
119 : 1 : "-----------------------------7273408401484587330863127999";
120 : : const char * const data =
121 : : "foobar ignore this stuff preamble\r\n"
122 : : "-----------------------------7273408401484587330863127999\r\n"
123 : : "Content-Disposition: form-data; name=\"query\"\r\n"
124 : : "\r\n"
125 : : "foo\r\n"
126 : : "-----------------------------7273408401484587330863127999\r\n"
127 : : "Content-Disposition: form-data; name=\"action\"\r\n"
128 : : "\r\n"
129 : : "san\r\n"
130 : : "-----------------------------7273408401484587330863127999\r\n"
131 : : "Content-Disposition: form-data; name=\"limit\"\r\n"
132 : : "\r\n"
133 : : "20\r\n"
134 : : "-----------------------------7273408401484587330863127999--\r\n"
135 : 1 : "foobar ignore this stuff epilogue\r\n";
136 : :
137 : : #define NUM_VALUES 3u
138 : : const char * const keys[NUM_VALUES] = {
139 : : "query", "action", "limit"
140 : 1 : };
141 : : const char * const values[NUM_VALUES] = {
142 : : "foo", "san", "20"
143 : 1 : };
144 [ + - ]: 2 : parameter_map parameters;
145 : :
146 [ + - + - : 1 : parse_multipart_data(data, boundary, parameters);
+ - + - +
- ]
147 : :
148 [ + - + - : 1 : BOOST_REQUIRE_EQUAL(parameters.size(), NUM_VALUES);
+ - + - +
- + - -
+ ]
149 : :
150 [ + + ]: 4 : for(unsigned int i = 0; i < NUM_VALUES; ++i) {
151 [ + - + - : 3 : const parameter_map::iterator && it = parameters.find(keys[i]);
+ - ]
152 [ + - + - : 3 : BOOST_REQUIRE(it != parameters.end());
+ - + - +
- + - + -
+ - + - -
+ ]
153 [ + - + - : 3 : BOOST_CHECK_EQUAL(it->first, keys[i]);
+ - + - +
- + - -
+ ]
154 [ + - + - : 3 : BOOST_CHECK_EQUAL(it->second, values[i]);
+ - + - +
- + - -
+ ]
155 : : }
156 : :
157 : : #undef NUM_VALUES
158 [ + - + - ]: 4 : }
|