]> git.ipfire.org Git - thirdparty/squid.git/blame - src/parser/testTokenizer.cc
Merged from trunk
[thirdparty/squid.git] / src / parser / testTokenizer.cc
CommitLineData
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
6CPPUNIT_TEST_SUITE_REGISTRATION( testTokenizer );
7
8SBuf 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");
12const CharacterSet alpha("alpha","abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
13const CharacterSet whitespace("whitespace"," \r\n");
14const CharacterSet crlf("crlf","\r\n");
15const CharacterSet tab("tab","\t");
16const CharacterSet numbers("numbers","0123456789");
17
18void
19testTokenizer::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
52void
53testTokenizer::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
82void
83testTokenizer::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
100void
101testTokenizer::testCharacterSet()
102{
103
104}
a56b469c
FC
105
106void
107testTokenizer::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}