proxygen
StructuredHeadersEncoderTest.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2004-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree. An additional grant
7  * of patent rights can be found in the PATENTS file in the same directory.
8  *
9  */
11 #include <unordered_map>
14 
15 using namespace testing;
16 
17 namespace proxygen {
18 
20 };
21 
24  int64_t val = 2018;
25  item.tag = StructuredHeaderItem::Type::INT64;
26  item.value = val;
27 
29  auto err = encoder.encodeItem(item);
30 
31  EXPECT_EQ(err, EncodeError::OK);
32  EXPECT_EQ(encoder.get(), "2018");
33 }
34 
35 TEST_F(StructuredHeadersEncoderTest, TestIntegerNegative) {
37  int64_t val = -2018;
38  item.tag = StructuredHeaderItem::Type::INT64;
39  item.value = val;
40 
42  auto err = encoder.encodeItem(item);
43 
44  EXPECT_EQ(err, EncodeError::OK);
45  EXPECT_EQ(encoder.get(), "-2018");
46 }
47 
50  double val = 3.1415926535;
51  item.tag = StructuredHeaderItem::Type::DOUBLE;
52  item.value = val;
53 
55  auto err = encoder.encodeItem(item);
56 
57  EXPECT_EQ(err, EncodeError::OK);
58  EXPECT_EQ(encoder.get(), "3.1415926535");
59 }
60 
61 TEST_F(StructuredHeadersEncoderTest, TestFloatTooMuchPrecision) {
64  double val = 100000.8392758372647; // has 20 characters
65  item.tag = StructuredHeaderItem::Type::DOUBLE;
66  item.value = val;
67 
68  auto err = encoder.encodeItem(item);
69 
70  EXPECT_EQ(err, EncodeError::OK);
71  EXPECT_EQ(encoder.get(), "100000.839275837");
72 }
73 
74 TEST_F(StructuredHeadersEncoderTest, TestFloatNegative) {
76  double val = -3.141;
77  item.tag = StructuredHeaderItem::Type::DOUBLE;
78  item.value = val;
79 
81  auto err = encoder.encodeItem(item);
82 
83  EXPECT_EQ(err, EncodeError::OK);
84  EXPECT_EQ(encoder.get(), "-3.141");
85 }
86 
89  std::string val = "seattle is the best";
91  item.value = val;
92 
94  auto err = encoder.encodeItem(item);
95 
96  EXPECT_EQ(err, EncodeError::OK);
97  EXPECT_EQ(encoder.get(), "\"seattle is the best\"");
98 }
99 
100 TEST_F(StructuredHeadersEncoderTest, TestStringBadContent) {
102  std::string val = "seattle \n is the best";
104  item.value = val;
105 
106  StructuredHeadersEncoder encoder;
107  auto err = encoder.encodeItem(item);
108 
109  EXPECT_NE(err, EncodeError::OK);
110 }
111 
112 TEST_F(StructuredHeadersEncoderTest, TestStringBackslash) {
114  std::string val = "seattle \\is the best";
116  item.value = val;
117 
118  StructuredHeadersEncoder encoder;
119  auto err = encoder.encodeItem(item);
120 
121  EXPECT_EQ(err, EncodeError::OK);
122  EXPECT_EQ(encoder.get(), "\"seattle \\\\is the best\"");
123 }
124 
127  std::string val = "seattle \"is the best";
129  item.value = val;
130 
131  StructuredHeadersEncoder encoder;
132  auto err = encoder.encodeItem(item);
133 
134  EXPECT_EQ(err, EncodeError::OK);
135  EXPECT_EQ(encoder.get(), "\"seattle \\\"is the best\"");
136 }
137 
140  std::string val = "seattle <3";
141  item.tag = StructuredHeaderItem::Type::BINARYCONTENT;
142  item.value = val;
143 
144  StructuredHeadersEncoder encoder;
145  auto err = encoder.encodeItem(item);
146 
147  EXPECT_EQ(err, EncodeError::OK);
148  EXPECT_EQ(encoder.get(), "*c2VhdHRsZSA8Mw==*");
149 }
150 
152  std::string result;
153  std::string val = "abc_00123";
154 
155  StructuredHeadersEncoder encoder;
156  auto err = encoder.encodeIdentifier(val);
157 
158  EXPECT_EQ(err, EncodeError::OK);
159  EXPECT_EQ(encoder.get(), "abc_00123");
160 }
161 
162 TEST_F(StructuredHeadersEncoderTest, TestIdentifierBadContent) {
163  std::string result;
164  std::string val = "_abc_00123";
165 
166  StructuredHeadersEncoder encoder;
167  auto err = encoder.encodeIdentifier(val);
168 
169  EXPECT_NE(err, EncodeError::OK);
170 }
171 
174  double val = 3.1415;
175  item.tag = StructuredHeaderItem::Type::INT64;
176  item.value = val;
177 
178  StructuredHeadersEncoder encoder;
179  auto err = encoder.encodeItem(item);
180 
181  EXPECT_NE(err, EncodeError::OK);
182 }
183 
185  std::vector<StructuredHeaderItem> vec;
187 
188  item.tag = StructuredHeaderItem::Type::DOUBLE;
189  double val1 = 3.14;
190  item.value = val1;
191  vec.push_back(item);
192 
193  item.tag = StructuredHeaderItem::Type::BINARYCONTENT;
194  std::string val2 = "pizza";
195  item.value = val2;
196  vec.push_back(item);
197 
198  item.tag = StructuredHeaderItem::Type::INT64;
199  int64_t val3 = 65;
200  item.value = val3;
201  vec.push_back(item);
202 
203  StructuredHeadersEncoder encoder;
204  auto err = encoder.encodeList(vec);
205 
206  EXPECT_EQ(err, EncodeError::OK);
207  EXPECT_EQ(encoder.get(), "3.14, *cGl6emE=*, 65");
208 }
209 
211  std::vector<StructuredHeaderItem> vec;
213 
215  std::string val1 = "hello world";
216  item.value = val1;
217  vec.push_back(item);
218 
219  StructuredHeadersEncoder encoder;
220  auto err = encoder.encodeList(vec);
221 
222  EXPECT_EQ(err, EncodeError::OK);
223  EXPECT_EQ(encoder.get(), "\"hello world\"");
224 }
225 
227  std::vector<StructuredHeaderItem> vec;
228 
229  StructuredHeadersEncoder encoder;
230  auto err = encoder.encodeList(vec);
231 
232  EXPECT_NE(err, EncodeError::OK);
233 }
234 
236  std::vector<StructuredHeaderItem> vec;
238 
240  std::string val1 = "hello \x10world";
241  item.value = val1;
242  vec.push_back(item);
243 
244  StructuredHeadersEncoder encoder;
245  auto err = encoder.encodeList(vec);
246 
247  EXPECT_NE(err, EncodeError::OK);
248 }
249 
250 TEST_F(StructuredHeadersEncoderTest, TestDictionaryOneElt) {
252 
253  StructuredHeaderItem item1;
254  item1.tag = StructuredHeaderItem::Type::DOUBLE;
255  double val1 = 2.71;
256  item1.value = val1;
257 
258  dict["e"] = item1;
259 
260  StructuredHeadersEncoder encoder;
261  auto err = encoder.encodeDictionary(dict);
262 
263  EXPECT_EQ(err, EncodeError::OK);
264  EXPECT_EQ(encoder.get(), "e=2.71");
265 }
266 
267 TEST_F(StructuredHeadersEncoderTest, TestDictionaryManyElts) {
270 
271  item.tag = StructuredHeaderItem::Type::INT64;
272  int64_t val1 = 87;
273  item.value = val1;
274  dict["age"] = item;
275 
277  std::string val2 = "John Doe";
278  item.value = val2;
279  dict["name"] = item;
280 
281  item.tag = StructuredHeaderItem::Type::BINARYCONTENT;
282  std::string val3 = "password";
283  item.value = val3;
284  dict["password"] = item;
285 
286  StructuredHeadersEncoder encoder;
287  auto err = encoder.encodeDictionary(dict);
288 
289  EXPECT_EQ(err, EncodeError::OK);
290 
291  // A dictionary is an unordered mapping, so the ordering of specific elements
292  // within the dictionary doesn't matter
293  EXPECT_THAT(encoder.get(), AnyOf(
294  Eq("age=87, name=\"John Doe\", password=*cGFzc3dvcmQ=*"),
295  Eq("age=87, password=*cGFzc3dvcmQ=*, name=\"John Doe\""),
296  Eq("name=\"John Doe\", age=87, password=*cGFzc3dvcmQ=*"),
297  Eq("name=\"John Doe\", password=*cGFzc3dvcmQ=*, age=87"),
298  Eq("password=*cGFzc3dvcmQ=*, name=\"John Doe\", age=87"),
299  Eq("password=*cGFzc3dvcmQ=*, age=87, name=\"John Doe\"")
300  ));
301 }
302 
303 TEST_F(StructuredHeadersEncoderTest, TestDictionaryEmpty) {
305 
306  StructuredHeadersEncoder encoder;
307  auto err = encoder.encodeDictionary(dict);
308 
309  EXPECT_NE(err, EncodeError::OK);
310 }
311 
312 TEST_F(StructuredHeadersEncoderTest, TestDictionaryBadItem) {
314 
315  StructuredHeaderItem item1;
317  std::string val1 = "hi\nmy name is bob";
318  item1.value = val1;
319 
320  dict["e"] = item1;
321 
322  StructuredHeadersEncoder encoder;
323  auto err = encoder.encodeDictionary(dict);
324 
325  EXPECT_NE(err, EncodeError::OK);
326 }
327 
328 TEST_F(StructuredHeadersEncoderTest, TestDictionaryBadIdentifier) {
330 
331  StructuredHeaderItem item1;
333  std::string val1 = "hi";
334  item1.value = val1;
335 
336  dict["_bad_identifier"] = item1;
337 
338  StructuredHeadersEncoder encoder;
339  auto err = encoder.encodeDictionary(dict);
340 
341  EXPECT_NE(err, EncodeError::OK);
342 }
343 
344 TEST_F(StructuredHeadersEncoderTest, TestParamListOneElt) {
346  std::unordered_map<std::string, StructuredHeaderItem> m;
347 
349 
350  item.tag = StructuredHeaderItem::Type::INT64;
351  int64_t val1 = 1;
352  item.value = val1;
353  m["abc"] = item;
354 
355  ParameterisedIdentifier pident = {"foo", m};
356 
357  pl.emplace_back(pident);
358 
359  StructuredHeadersEncoder encoder;
360  auto err = encoder.encodeParameterisedList(pl);
361 
362  EXPECT_EQ(err, EncodeError::OK);
363 
364  EXPECT_EQ(encoder.get(), "foo; abc=1");
365 }
366 
367 TEST_F(StructuredHeadersEncoderTest, TestParamListSuccessiveNulls) {
369  std::unordered_map<std::string, StructuredHeaderItem> m;
370 
372 
373  item.tag = StructuredHeaderItem::Type::NONE;
374  m["a"] = item;
375  m["b"] = item;
376 
377  ParameterisedIdentifier pident = {"foo", m};
378 
379  pl.emplace_back(pident);
380 
381  StructuredHeadersEncoder encoder;
382  auto err = encoder.encodeParameterisedList(pl);
383 
384  EXPECT_EQ(err, EncodeError::OK);
385 
386  EXPECT_THAT(encoder.get(), AnyOf(
387  Eq("foo; a; b"),
388  Eq("foo; b; a")
389  ));
390 }
391 
392 TEST_F(StructuredHeadersEncoderTest, TestParamListManyElts) {
394  std::unordered_map<std::string, StructuredHeaderItem> m1;
395 
397 
398  item.tag = StructuredHeaderItem::Type::DOUBLE;
399  double val1 = 4234.234;
400  item.value = val1;
401  m1["foo"] = item;
402 
403  item.tag = StructuredHeaderItem::Type::BINARYCONTENT;
404  std::string val2 = "+++!";
405  item.value = val2;
406  m1["goo"] = item;
407 
408  ParameterisedIdentifier pident1 = {"bar", m1};
409 
410  pl.emplace_back(pident1);
411 
412  std::unordered_map<std::string, StructuredHeaderItem> m2;
413 
414  item.tag = StructuredHeaderItem::Type::NONE;
415  m2["foo"] = item;
416 
417  item.tag = StructuredHeaderItem::Type::INT64;
418  int64_t val4 = 100;
419  item.value = val4;
420  m2["goo"] = item;
421 
422  ParameterisedIdentifier pident2 = {"far", m2};
423 
424  pl.emplace_back(pident2);
425 
426  StructuredHeadersEncoder encoder;
427  auto err = encoder.encodeParameterisedList(pl);
428 
429  EXPECT_EQ(err, EncodeError::OK);
430 
431  // The order of the parameters of a particular identifier doesn't matter,
432  // so any of these permutations is acceptable
433  EXPECT_THAT(encoder.get(), AnyOf(
434  Eq("bar; foo=4234.234; goo=*KysrIQ==*, far; foo; goo=100"),
435  Eq("bar; foo=4234.234; goo=*KysrIQ==*, far; goo=100; foo"),
436  Eq("bar; goo=*KysrIQ==*; foo=4234.234, far; foo; goo=100"),
437  Eq("bar; goo=*KysrIQ==*; foo=4234.234, far; goo=100; foo"),
438  Eq("far; foo; goo=100, bar; foo=4234.234; goo=*KysrIQ==*"),
439  Eq("far; foo; goo=100, bar; goo=*KysrIQ==*; foo=4234.234"),
440  Eq("far; goo=100; foo, bar; foo=4234.234; goo=*KysrIQ==*"),
441  Eq("far; goo=100; foo, bar; goo=*KysrIQ==*; foo=4234.234")
442  ));
443 }
444 
445 TEST_F(StructuredHeadersEncoderTest, TestParamListEmpty) {
447  StructuredHeadersEncoder encoder;
448  auto err = encoder.encodeParameterisedList(pl);
449 
450  EXPECT_NE(err, EncodeError::OK);
451 }
452 
453 TEST_F(StructuredHeadersEncoderTest, TestParamListBadSecondaryIdentifier) {
455  std::unordered_map<std::string, StructuredHeaderItem> m;
456 
458 
460  std::string val1 = "ABC";
461  item.value = val1;
462  m["\nbbb"] = item;
463 
464  ParameterisedIdentifier pident = {"foo", m};
465 
466  pl.emplace_back(pident);
467 
468  StructuredHeadersEncoder encoder;
469  auto err = encoder.encodeParameterisedList(pl);
470 
471  EXPECT_NE(err, EncodeError::OK);
472 }
473 
474 TEST_F(StructuredHeadersEncoderTest, TestParamListBadPrimaryIdentifier) {
476  std::unordered_map<std::string, StructuredHeaderItem> m;
477 
479 
480  item.tag = StructuredHeaderItem::Type::INT64;
481  int64_t val1 = 143;
482  item.value = val1;
483  m["abc"] = item;
484 
485  ParameterisedIdentifier pident = {"a+++", m};
486 
487  pl.emplace_back(pident);
488 
489  StructuredHeadersEncoder encoder;
490  auto err = encoder.encodeParameterisedList(pl);
491 
492  EXPECT_NE(err, EncodeError::OK);
493 }
494 
495 TEST_F(StructuredHeadersEncoderTest, TestParamListBadItems) {
497  std::unordered_map<std::string, StructuredHeaderItem> m;
498 
500 
502  std::string val1 = "AB\nC";
503  item.value = val1;
504  m["bbb"] = item;
505 
506  ParameterisedIdentifier pident = {"foo", m};
507 
508  pl.emplace_back(pident);
509 
510  StructuredHeadersEncoder encoder;
511  auto err = encoder.encodeParameterisedList(pl);
512 
513  EXPECT_NE(err, EncodeError::OK);
514 }
515 
516 }
EncodeError encodeItem(const StructuredHeaderItem &input)
EncodeError encodeIdentifier(const std::string &input)
EncodeError encodeDictionary(const Dictionary &input)
std::vector< StructuredHeaders::ParameterisedIdentifier > ParameterisedList
internal::EqMatcher< T > Eq(T x)
TEST_F(TestInfoTest, Names)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
double val
Definition: String.cpp:273
#define STRING
EncodeError encodeList(const std::vector< StructuredHeaderItem > &input)
boost::variant< int64_t, double, std::string > value
std::unordered_map< std::string, StructuredHeaderItem > Dictionary
internal::AnyOfResult2< M1, M2 >::type AnyOf(M1 m1, M2 m2)
static map< string, int > m
#define EXPECT_THAT(value, matcher)
const char * string
Definition: Conv.cpp:212
#define EXPECT_NE(val1, val2)
Definition: gtest.h:1926
vector< string > vec
Definition: StringTest.cpp:35
EncodeError encodeParameterisedList(const ParameterisedList &input)