xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/http2/adapter/oghttp2_util.h"
2 
3 #include <utility>
4 #include <vector>
5 
6 #include "quiche/http2/adapter/http2_protocol.h"
7 #include "quiche/http2/adapter/test_frame_sequence.h"
8 #include "quiche/common/platform/api/quiche_test.h"
9 
10 namespace http2 {
11 namespace adapter {
12 namespace test {
13 namespace {
14 
15 using HeaderPair = std::pair<absl::string_view, absl::string_view>;
16 
TEST(ToHeaderBlock,EmptySpan)17 TEST(ToHeaderBlock, EmptySpan) {
18   spdy::Http2HeaderBlock block = ToHeaderBlock({});
19   EXPECT_TRUE(block.empty());
20 }
21 
TEST(ToHeaderBlock,ExampleRequestHeaders)22 TEST(ToHeaderBlock, ExampleRequestHeaders) {
23   const std::vector<HeaderPair> pairs = {{":authority", "example.com"},
24                                          {":method", "GET"},
25                                          {":path", "/example.html"},
26                                          {":scheme", "http"},
27                                          {"accept", "text/plain, text/html"}};
28   const std::vector<Header> headers = ToHeaders(pairs);
29   spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
30   EXPECT_THAT(block, testing::ElementsAreArray(pairs));
31 }
32 
TEST(ToHeaderBlock,ExampleResponseHeaders)33 TEST(ToHeaderBlock, ExampleResponseHeaders) {
34   const std::vector<HeaderPair> pairs = {
35       {":status", "403"},
36       {"content-length", "1023"},
37       {"x-extra-info", "humblest apologies"}};
38   const std::vector<Header> headers = ToHeaders(pairs);
39   spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
40   EXPECT_THAT(block, testing::ElementsAreArray(pairs));
41 }
42 
TEST(ToHeaderBlock,RepeatedRequestHeaderNames)43 TEST(ToHeaderBlock, RepeatedRequestHeaderNames) {
44   const std::vector<HeaderPair> pairs = {
45       {":authority", "example.com"},     {":method", "GET"},
46       {":path", "/example.html"},        {":scheme", "http"},
47       {"cookie", "chocolate_chips=yes"}, {"accept", "text/plain, text/html"},
48       {"cookie", "raisins=no"}};
49   const std::vector<HeaderPair> expected = {
50       {":authority", "example.com"},
51       {":method", "GET"},
52       {":path", "/example.html"},
53       {":scheme", "http"},
54       {"cookie", "chocolate_chips=yes; raisins=no"},
55       {"accept", "text/plain, text/html"}};
56   const std::vector<Header> headers = ToHeaders(pairs);
57   spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
58   EXPECT_THAT(block, testing::ElementsAreArray(expected));
59 }
60 
TEST(ToHeaderBlock,RepeatedResponseHeaderNames)61 TEST(ToHeaderBlock, RepeatedResponseHeaderNames) {
62   const std::vector<HeaderPair> pairs = {
63       {":status", "403"},          {"x-extra-info", "sorry"},
64       {"content-length", "1023"},  {"x-extra-info", "humblest apologies"},
65       {"content-length", "1024"},  {"set-cookie", "chocolate_chips=yes"},
66       {"set-cookie", "raisins=no"}};
67   const std::vector<HeaderPair> expected = {
68       {":status", "403"},
69       {"x-extra-info", absl::string_view("sorry\0humblest apologies", 24)},
70       {"content-length", absl::string_view("1023"
71                                            "\0"
72                                            "1024",
73                                            9)},
74       {"set-cookie", absl::string_view("chocolate_chips=yes\0raisins=no", 30)}};
75   const std::vector<Header> headers = ToHeaders(pairs);
76   spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
77   EXPECT_THAT(block, testing::ElementsAreArray(expected));
78 }
79 
80 }  // namespace
81 }  // namespace test
82 }  // namespace adapter
83 }  // namespace http2
84