proxygen
RFCExamplesTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-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  */
10 #include <algorithm>
12 #include <list>
13 #include <memory>
18 #include <vector>
19 #include <folly/String.h>
20 
21 using namespace folly;
22 using namespace proxygen;
23 using namespace std;
24 using namespace testing;
25 
26 using RfcParam = std::pair<bool, vector<string>>;
27 
28 class RFCRequestTest : public testing::TestWithParam<RfcParam> {
29  public:
31  req1.push_back(HPACKHeader(":method", "GET"));
32  req1.push_back(HPACKHeader(":scheme", "http"));
33  req1.push_back(HPACKHeader(":path", "/"));
34  req1.push_back(HPACKHeader(":authority", "www.example.com"));
35 
36  req2.push_back(HPACKHeader(":method", "GET"));
37  req2.push_back(HPACKHeader(":scheme", "http"));
38  req2.push_back(HPACKHeader(":path", "/"));
39  req2.push_back(HPACKHeader(":authority", "www.example.com"));
40  req2.push_back(HPACKHeader("cache-control", "no-cache"));
41 
42  req3.push_back(HPACKHeader(":method", "GET"));
43  req3.push_back(HPACKHeader(":scheme", "https"));
44  req3.push_back(HPACKHeader(":path", "/index.html"));
45  req3.push_back(HPACKHeader(":authority", "www.example.com"));
46  req3.push_back(HPACKHeader("custom-key", "custom-value"));
47  }
48 
49  protected:
50  vector<HPACKHeader> req1;
51  vector<HPACKHeader> req2;
52  vector<HPACKHeader> req3;
53 };
54 
55 
56 class RFCResponseTest : public testing::TestWithParam<RfcParam> {
57  public:
59  resp1.push_back(HPACKHeader(":status", "302"));
60  resp1.push_back(HPACKHeader("cache-control", "private"));
61  resp1.push_back(HPACKHeader("date", "Mon, 21 Oct 2013 20:13:21 GMT"));
62  resp1.push_back(HPACKHeader("location", "https://www.example.com"));
63 
64  resp2.push_back(HPACKHeader(":status", "307"));
65  resp2.push_back(HPACKHeader("cache-control", "private"));
66  resp2.push_back(HPACKHeader("date", "Mon, 21 Oct 2013 20:13:21 GMT"));
67  resp2.push_back(HPACKHeader("location", "https://www.example.com"));
68 
69  resp3.push_back(HPACKHeader(":status", "200"));
70  resp3.push_back(HPACKHeader("cache-control", "private"));
71  resp3.push_back(HPACKHeader("date", "Mon, 21 Oct 2013 20:13:22 GMT"));
72  resp3.push_back(HPACKHeader("location", "https://www.example.com"));
73  resp3.push_back(HPACKHeader("content-encoding", "gzip"));
74  resp3.push_back(
76  "set-cookie",
77  "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")
78  );
79  }
80 
81  protected:
82  vector<HPACKHeader> resp1;
83  vector<HPACKHeader> resp2;
84  vector<HPACKHeader> resp3;
85 };
86 
87 vector<string> exampleHex1 = {
88  "828684410f7777772e6578616d706c652e636f6d",
89  "828684be58086e6f2d6361636865",
90  "828785bf400a637573746f6d2d6b65790c637573746f6d2d76616c7565"
91 };
92 
93 vector<string> exampleHex2 = {
94  "828684418cf1e3c2e5f23a6ba0ab90f4ff",
95  "828684be5886a8eb10649cbf",
96  "828785bf408825a849e95ba97d7f8925a849e95bb8e8b4bf"
97 };
98 
99 RfcParam d3(false, exampleHex1);
100 RfcParam d4(true, exampleHex2);
101 
102 vector<string> exampleHex3 = {
103  "4803333032580770726976617465611d4d6f6e2c203231204f63742032303133"
104  "2032303a31333a323120474d546e1768747470733a2f2f7777772e6578616d70"
105  "6c652e636f6d",
106  "4803333037c1c0bf",
107  "88c1611d4d6f6e2c203231204f637420323031332032303a31333a323220474d"
108  "54c05a04677a69707738666f6f3d4153444a4b48514b425a584f5157454f5049"
109  "5541585157454f49553b206d61782d6167653d333630303b2076657273696f6e"
110  "3d31"
111 };
112 vector<string> exampleHex4 = {
113  "488264025885aec3771a4b6196d07abe941054d444a8200595040b8166e082a6"
114  "2d1bff6e919d29ad171863c78f0b97c8e9ae82ae43d3",
115  "4883640effc1c0bf",
116  "88c16196d07abe941054d444a8200595040b8166e084a62d1bffc05a839bd9ab"
117  "77ad94e7821dd7f2e6c7b335dfdfcd5b3960d5af27087f3672c1ab270fb5291f"
118  "9587316065c003ed4ee5b1063d5007"
119 };
120 
121 RfcParam d5(false, exampleHex3);
122 RfcParam d6(true, exampleHex4);
123 
124 namespace {
125 std::string unhexlify(const std::string& input) {
126  std::string result;
127  folly::unhexlify(input, result);
128  return result;
129 }
130 }
131 
132 TEST_P(RFCRequestTest, RfcExampleRequest) {
133  HPACKEncoder encoder(GetParam().first);
134  HPACKDecoder decoder;
135  // first request
136  unique_ptr<IOBuf> encoded = hpack::encodeDecode(req1, encoder, decoder);
137  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[0]));
138  EXPECT_EQ(encoder.getTable().bytes(), 57);
139  EXPECT_EQ(encoder.getTable().size(), 1);
140 
141  // second request
142  encoded = hpack::encodeDecode(req2, encoder, decoder);
143  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[1]));
144  EXPECT_EQ(encoder.getTable().bytes(), 110);
145  EXPECT_EQ(encoder.getTable().size(), 2);
146 
147  // third request
148  encoded = hpack::encodeDecode(req3, encoder, decoder);
149  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[2]));
150  EXPECT_EQ(encoder.getTable().bytes(), 164);
151  EXPECT_EQ(encoder.getTable().size(), 3);
152 }
153 
154 
157  ::testing::Values(d3, d4));
158 
159 
160 TEST_P(RFCResponseTest, RfcExampleResponse) {
161  // this test does some evictions
162  uint32_t tableSize = 256;
163  HPACKEncoder encoder(GetParam().first, tableSize);
164  HPACKDecoder decoder(tableSize);
165 
166  // first
167  unique_ptr<IOBuf> encoded = hpack::encodeDecode(resp1, encoder, decoder);
168  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[0]));
169  EXPECT_EQ(encoder.getTable().bytes(), 222);
170  EXPECT_EQ(encoder.getTable().size(), 4);
171  EXPECT_EQ(encoder.getHeader(64).name.get(), "cache-control");
172  EXPECT_EQ(encoder.getHeader(64).value, "private");
173 
174  // second
175  encoded = hpack::encodeDecode(resp2, encoder, decoder);
176  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[1]));
177  EXPECT_EQ(encoder.getTable().bytes(), 222);
178  EXPECT_EQ(encoder.getTable().size(), 4);
179 
180  // third
181  encoded = hpack::encodeDecode(resp3, encoder, decoder);
182  EXPECT_EQ(encoded->moveToFbString(), unhexlify(GetParam().second[2]));
183 
184  EXPECT_EQ(encoder.getTable().size(), 3);
185  EXPECT_EQ(encoder.getTable().bytes(), 215);
186 }
187 
190  ::testing::Values(d5, d6));
std::pair< bool, vector< string >> RfcParam
bool unhexlify(const InputString &input, OutputString &output)
Definition: String-inl.h:616
vector< HPACKHeader > req2
vector< string > exampleHex2
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
fbstring moveToFbString()
Definition: IOBuf.cpp:968
STL namespace.
RfcParam d5(false, exampleHex3)
vector< HPACKHeader > req3
vector< HPACKHeader > req1
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
uint32_t bytes() const
Definition: HeaderTable.h:112
RfcParam d6(true, exampleHex4)
RfcParam d4(true, exampleHex2)
vector< string > exampleHex3
const HPACKHeader & getHeader(uint32_t index)
HPACKHeaderName name
Definition: HPACKHeader.h:82
const HeaderTable & getTable() const
Definition: HPACKContext.h:48
vector< string > exampleHex1
vector< string > exampleHex4
folly::fbstring value
Definition: HPACKHeader.h:83
const char * string
Definition: Conv.cpp:212
vector< HPACKHeader > resp2
TEST_P(RFCRequestTest, RfcExampleRequest)
uint32_t size() const
Definition: HeaderTable.h:105
INSTANTIATE_TEST_CASE_P(Huffman, RFCRequestTest,::testing::Values(d3, d4))
RfcParam d3(false, exampleHex1)
vector< HPACKHeader > resp3
void encodeDecode(vector< HPACKHeader > &headers, HPACKEncoder &encoder, HPACKDecoder &decoder)
vector< HPACKHeader > resp1
constexpr detail::First first
Definition: Base-inl.h:2553
const std::string & get() const