]>
Commit | Line | Data |
---|---|---|
c9a4e310 | 1 | #include "squid.h" |
c9a4e310 | 2 | #include "base/CharacterSet.h" |
5d4cfe02 AJ |
3 | #include "parser/Tokenizer.h" |
4 | #include "testTokenizer.h" | |
c9a4e310 FC |
5 | |
6 | CPPUNIT_TEST_SUITE_REGISTRATION( testTokenizer ); | |
7 | ||
8 | SBuf text("GET http://resource.com/path HTTP/1.1\r\n" | |
9 | "Host: resource.com\r\n" | |
10 | "Cookie: laijkpk3422r j1noin \r\n" | |
11 | "\r\n"); | |
12 | const CharacterSet alpha("alpha","abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); | |
13 | const CharacterSet whitespace("whitespace"," \r\n"); | |
14 | const CharacterSet crlf("crlf","\r\n"); | |
15 | const CharacterSet tab("tab","\t"); | |
16 | const CharacterSet numbers("numbers","0123456789"); | |
17 | ||
18 | void | |
19 | testTokenizer::testTokenizerPrefix() | |
20 | { | |
21 | Parser::Tokenizer t(text); | |
22 | SBuf s; | |
23 | ||
24 | // successful prefix tokenization | |
25 | CPPUNIT_ASSERT(t.prefix(s,alpha)); | |
26 | CPPUNIT_ASSERT_EQUAL(SBuf("GET"),s); | |
27 | CPPUNIT_ASSERT(t.prefix(s,whitespace)); | |
28 | CPPUNIT_ASSERT_EQUAL(SBuf(" "),s); | |
29 | ||
30 | //no match (first char is not in the prefix set) | |
31 | CPPUNIT_ASSERT(!t.prefix(s,whitespace)); | |
32 | CPPUNIT_ASSERT_EQUAL(SBuf(" "),s); | |
33 | ||
34 | // one more match to set S to something meaningful | |
35 | CPPUNIT_ASSERT(t.prefix(s,alpha)); | |
36 | CPPUNIT_ASSERT_EQUAL(SBuf("http"),s); | |
37 | ||
38 | //no match (no characters from the character set in the prefix) | |
39 | CPPUNIT_ASSERT(!t.prefix(s,tab)); | |
40 | CPPUNIT_ASSERT_EQUAL(SBuf("http"),s); //output SBuf left untouched | |
41 | ||
42 | // match until the end of the sample | |
43 | CharacterSet all(whitespace); | |
44 | all += alpha; | |
45 | all += crlf; | |
46 | all += numbers; | |
47 | all.add(':').add('.').add('/'); | |
48 | CPPUNIT_ASSERT(t.prefix(s,all)); | |
49 | CPPUNIT_ASSERT_EQUAL(SBuf(),t.remaining()); | |
50 | } | |
51 | ||
52 | void | |
53 | testTokenizer::testTokenizerSkip() | |
54 | { | |
55 | Parser::Tokenizer t(text); | |
56 | SBuf s; | |
57 | ||
58 | // first scenario: patterns match | |
59 | // prep for test | |
60 | CPPUNIT_ASSERT(t.prefix(s,alpha)); | |
61 | CPPUNIT_ASSERT_EQUAL(SBuf("GET"),s); | |
62 | ||
63 | // test skip testing character set | |
64 | CPPUNIT_ASSERT(t.skip(whitespace)); | |
65 | // check that skip was right | |
66 | CPPUNIT_ASSERT(t.prefix(s,alpha)); | |
67 | CPPUNIT_ASSERT_EQUAL(SBuf("http"),s); | |
68 | ||
69 | //check skip prefix | |
70 | CPPUNIT_ASSERT(t.skip(SBuf("://"))); | |
71 | // verify | |
72 | CPPUNIT_ASSERT(t.prefix(s,alpha)); | |
73 | CPPUNIT_ASSERT_EQUAL(SBuf("resource"),s); | |
74 | ||
75 | // no skip | |
76 | CPPUNIT_ASSERT(!t.skip(alpha)); | |
77 | CPPUNIT_ASSERT(!t.skip(SBuf("://"))); | |
78 | CPPUNIT_ASSERT(!t.skip('a')); | |
79 | ||
80 | } | |
81 | ||
82 | void | |
83 | testTokenizer::testTokenizerToken() | |
84 | { | |
85 | Parser::Tokenizer t(text); | |
86 | SBuf s; | |
87 | ||
88 | // first scenario: patterns match | |
89 | CPPUNIT_ASSERT(t.token(s,whitespace)); | |
90 | CPPUNIT_ASSERT_EQUAL(SBuf("GET"),s); | |
91 | CPPUNIT_ASSERT(t.token(s,whitespace)); | |
92 | CPPUNIT_ASSERT_EQUAL(SBuf("http://resource.com/path"),s); | |
93 | CPPUNIT_ASSERT(t.token(s,whitespace)); | |
94 | CPPUNIT_ASSERT_EQUAL(SBuf("HTTP/1.1"),s); | |
95 | CPPUNIT_ASSERT(t.token(s,whitespace)); | |
96 | CPPUNIT_ASSERT_EQUAL(SBuf("Host:"),s); | |
97 | ||
c9a4e310 FC |
98 | } |
99 | ||
100 | void | |
101 | testTokenizer::testCharacterSet() | |
102 | { | |
103 | ||
104 | } | |
a56b469c FC |
105 | |
106 | void | |
107 | testTokenizer::testTokenizerInt64() | |
108 | { | |
a56b469c FC |
109 | // successful parse in base 10 |
110 | { | |
e48aef3e | 111 | int64_t rv; |
a56b469c FC |
112 | Parser::Tokenizer t(SBuf("1234")); |
113 | const int64_t benchmark = 1234; | |
114 | CPPUNIT_ASSERT(t.int64(rv, 10)); | |
115 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
116 | } | |
117 | ||
118 | // successful parse, autodetect base | |
119 | { | |
e48aef3e | 120 | int64_t rv; |
a56b469c FC |
121 | Parser::Tokenizer t(SBuf("1234")); |
122 | const int64_t benchmark = 1234; | |
123 | CPPUNIT_ASSERT(t.int64(rv)); | |
124 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
125 | } | |
126 | ||
127 | // successful parse, autodetect base | |
128 | { | |
e48aef3e | 129 | int64_t rv; |
a56b469c FC |
130 | Parser::Tokenizer t(SBuf("01234")); |
131 | const int64_t benchmark = 01234; | |
132 | CPPUNIT_ASSERT(t.int64(rv)); | |
133 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
134 | } | |
135 | ||
136 | // successful parse, autodetect base | |
137 | { | |
e48aef3e | 138 | int64_t rv; |
a56b469c FC |
139 | Parser::Tokenizer t(SBuf("0x12f4")); |
140 | const int64_t benchmark = 0x12f4; | |
141 | CPPUNIT_ASSERT(t.int64(rv)); | |
142 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
143 | } | |
144 | ||
145 | // API mismatch: don't eat leading space | |
146 | { | |
e48aef3e | 147 | int64_t rv; |
a56b469c FC |
148 | Parser::Tokenizer t(SBuf(" 1234")); |
149 | CPPUNIT_ASSERT(!t.int64(rv)); | |
150 | } | |
151 | ||
152 | // API mismatch: don't eat multiple leading spaces | |
153 | { | |
e48aef3e | 154 | int64_t rv; |
a56b469c FC |
155 | Parser::Tokenizer t(SBuf(" 1234")); |
156 | CPPUNIT_ASSERT(!t.int64(rv)); | |
157 | } | |
158 | ||
159 | // trailing spaces | |
160 | { | |
e48aef3e | 161 | int64_t rv; |
a56b469c FC |
162 | Parser::Tokenizer t(SBuf("1234 foo")); |
163 | const int64_t benchmark = 1234; | |
164 | CPPUNIT_ASSERT(t.int64(rv)); | |
165 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
166 | CPPUNIT_ASSERT_EQUAL(SBuf(" foo"), t.buf()); | |
167 | } | |
168 | ||
169 | // trailing nonspaces | |
170 | { | |
e48aef3e | 171 | int64_t rv; |
a56b469c FC |
172 | Parser::Tokenizer t(SBuf("1234foo")); |
173 | const int64_t benchmark = 1234; | |
174 | CPPUNIT_ASSERT(t.int64(rv)); | |
175 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
176 | CPPUNIT_ASSERT_EQUAL(SBuf("foo"), t.buf()); | |
177 | } | |
178 | ||
179 | // trailing nonspaces | |
180 | { | |
e48aef3e | 181 | int64_t rv; |
a56b469c FC |
182 | Parser::Tokenizer t(SBuf("0x1234foo")); |
183 | const int64_t benchmark = 0x1234f; | |
184 | CPPUNIT_ASSERT(t.int64(rv)); | |
185 | CPPUNIT_ASSERT_EQUAL(benchmark,rv); | |
186 | CPPUNIT_ASSERT_EQUAL(SBuf("oo"), t.buf()); | |
187 | } | |
e48aef3e FC |
188 | |
189 | // overflow | |
190 | { | |
191 | int64_t rv; | |
192 | Parser::Tokenizer t(SBuf("1029397752385698678762234")); | |
193 | CPPUNIT_ASSERT(!t.int64(rv)); | |
194 | } | |
a56b469c | 195 | } |