proxygen
ExtensionsTest.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-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.
7  */
8 
9 #include <gmock/gmock.h>
10 #include <gtest/gtest.h>
11 
12 #include <fizz/record/Extensions.h>
14 #include <folly/String.h>
15 
16 using namespace folly;
17 using namespace folly::io;
18 
19 using testing::_;
20 using namespace testing;
21 
22 StringPiece alpn{"00100017001502683208737064792f332e3108687474702f312e31"};
23 StringPiece sni{"0000001500130000107777772e66616365626f6f6b2e636f6d"};
27 StringPiece ticketEarlyData{"002a000400000005"};
28 StringPiece cookie{"002c00080006636f6f6b6965"};
30  "002f005400520028434e3d4c696d696e616c6974792c204f553d46697a7a2c204f3d46616365626f6f6b2c20433d55530026434e3d457465726e6974792c204f553d46697a7a2c204f3d46616365626f6f6b2c20433d5553"};
32 
33 namespace fizz {
34 namespace test {
35 
36 TEST_F(ExtensionsTest, TestProtocolNameList) {
37  auto exts = getExtensions(alpn);
38  auto ext = getExtension<ProtocolNameList>(exts);
39 
40  EXPECT_EQ(ext->protocol_name_list.size(), 3);
41  EXPECT_EQ(
42  StringPiece(ext->protocol_name_list[0].name->coalesce()),
43  StringPiece("h2"));
44  EXPECT_EQ(
45  StringPiece(ext->protocol_name_list[1].name->coalesce()),
46  StringPiece("spdy/3.1"));
47  EXPECT_EQ(
48  StringPiece(ext->protocol_name_list[2].name->coalesce()),
49  StringPiece("http/1.1"));
50 
51  checkEncode(std::move(*ext), alpn);
52 }
53 
54 TEST_F(ExtensionsTest, TestServerNameList) {
55  auto exts = getExtensions(sni);
56  auto ext = getExtension<ServerNameList>(exts);
57 
58  EXPECT_EQ(ext->server_name_list.size(), 1);
59  EXPECT_EQ(ext->server_name_list[0].name_type, ServerNameType::host_name);
60  EXPECT_EQ(
61  StringPiece(ext->server_name_list[0].hostname->coalesce()),
62  StringPiece("www.facebook.com"));
63 
64  checkEncode(std::move(*ext), sni);
65 }
66 
67 TEST_F(ExtensionsTest, TestHelloRetryRequestKeyShare) {
68  auto exts = getExtensions(helloRetryRequestKeyShare);
69  auto ext = getExtension<HelloRetryRequestKeyShare>(exts);
70 
71  EXPECT_EQ(ext->selected_group, NamedGroup::secp256r1);
72 
73  checkEncode(std::move(*ext), helloRetryRequestKeyShare);
74 }
75 
76 TEST_F(ExtensionsTest, TestClientEarlyData) {
77  auto exts = getExtensions(clientEarlyData);
78  auto ext = getExtension<ClientEarlyData>(exts);
79  checkEncode(std::move(*ext), clientEarlyData);
80 }
81 
82 TEST_F(ExtensionsTest, TestServerEarlyData) {
83  auto exts = getExtensions(serverEarlyData);
84  auto ext = getExtension<ServerEarlyData>(exts);
85  checkEncode(std::move(*ext), serverEarlyData);
86 }
87 
88 TEST_F(ExtensionsTest, TestTicketEarlyData) {
89  auto exts = getExtensions(ticketEarlyData);
90  auto ext = getExtension<TicketEarlyData>(exts);
91  EXPECT_EQ(ext->max_early_data_size, 5);
92  checkEncode(std::move(*ext), ticketEarlyData);
93 }
94 
95 TEST_F(ExtensionsTest, TestCookie) {
96  auto exts = getExtensions(cookie);
97  auto ext = getExtension<Cookie>(exts);
98 
99  EXPECT_EQ(StringPiece(ext->cookie->coalesce()), StringPiece("cookie"));
100 
101  checkEncode(std::move(*ext), cookie);
102 }
103 
104 TEST_F(ExtensionsTest, TestCertificateAuthorities) {
105  auto exts = getExtensions(authorities);
106  auto ext = getExtension<CertificateAuthorities>(exts);
107 
108  EXPECT_EQ(ext->authorities.size(), 2);
109  EXPECT_EQ(
110  StringPiece(ext->authorities[0].encoded_name->coalesce()),
111  StringPiece("CN=Liminality, OU=Fizz, O=Facebook, C=US"));
112  EXPECT_EQ(
113  StringPiece(ext->authorities[1].encoded_name->coalesce()),
114  StringPiece("CN=Eternity, OU=Fizz, O=Facebook, C=US"));
115 
116  checkEncode(std::move(*ext), authorities);
117 }
118 
119 TEST_F(ExtensionsTest, TestCertificateCompressionAlgorithms) {
120  auto exts = getExtensions(certCompressionAlgorithms);
121  auto ext = getExtension<CertificateCompressionAlgorithms>(exts);
122 
123  EXPECT_EQ(ext->algorithms.size(), 1);
124  EXPECT_EQ(ext->algorithms[0], CertificateCompressionAlgorithm::zlib);
125  checkEncode(std::move(*ext), certCompressionAlgorithms);
126 }
127 
128 TEST_F(ExtensionsTest, TestBadlyFormedExtension) {
129  auto buf = getBuf(sni);
130  buf->reserve(0, 1);
131  buf->append(1);
132  std::vector<Extension> exts;
133  Extension ext;
134  ext.extension_type = ExtensionType::server_name;
135  ext.extension_data = std::move(buf);
136  exts.push_back(std::move(ext));
137  EXPECT_THROW(getExtension<ServerNameList>(exts), std::runtime_error);
138 }
139 } // namespace test
140 } // namespace fizz
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
StringPiece cookie
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
StringPiece alpn
StringPiece ticketEarlyData
Buf extension_data
Definition: Types.h:175
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
StringPiece clientEarlyData
StringPiece certCompressionAlgorithms
StringPiece helloRetryRequestKeyShare
Definition: Actions.h:16
StringPiece serverEarlyData
StringPiece authorities
TEST_F(AsyncSSLSocketWriteTest, write_coalescing1)
StringPiece sni
ExtensionType extension_type
Definition: Types.h:174
const internal::AnythingMatcher _
Range< const char * > StringPiece