|  | #include "http2/adapter/oghttp2_util.h" | 
|  |  | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | #include "http2/adapter/http2_protocol.h" | 
|  | #include "http2/adapter/test_frame_sequence.h" | 
|  | #include "common/platform/api/quiche_test.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace adapter { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | using HeaderPair = std::pair<absl::string_view, absl::string_view>; | 
|  |  | 
|  | TEST(ToHeaderBlock, EmptySpan) { | 
|  | spdy::SpdyHeaderBlock block = ToHeaderBlock({}); | 
|  | EXPECT_TRUE(block.empty()); | 
|  | } | 
|  |  | 
|  | TEST(ToHeaderBlock, ExampleRequestHeaders) { | 
|  | const std::vector<HeaderPair> pairs = {{":authority", "example.com"}, | 
|  | {":method", "GET"}, | 
|  | {":path", "/example.html"}, | 
|  | {":scheme", "http"}, | 
|  | {"accept", "text/plain, text/html"}}; | 
|  | const std::vector<Header> headers = ToHeaders(pairs); | 
|  | spdy::SpdyHeaderBlock block = ToHeaderBlock(headers); | 
|  | EXPECT_THAT(block, testing::ElementsAreArray(pairs)); | 
|  | } | 
|  |  | 
|  | TEST(ToHeaderBlock, ExampleResponseHeaders) { | 
|  | const std::vector<HeaderPair> pairs = { | 
|  | {":status", "403"}, | 
|  | {"content-length", "1023"}, | 
|  | {"x-extra-info", "humblest apologies"}}; | 
|  | const std::vector<Header> headers = ToHeaders(pairs); | 
|  | spdy::SpdyHeaderBlock block = ToHeaderBlock(headers); | 
|  | EXPECT_THAT(block, testing::ElementsAreArray(pairs)); | 
|  | } | 
|  |  | 
|  | TEST(ToHeaderBlock, RepeatedRequestHeaderNames) { | 
|  | const std::vector<HeaderPair> pairs = { | 
|  | {":authority", "example.com"},     {":method", "GET"}, | 
|  | {":path", "/example.html"},        {":scheme", "http"}, | 
|  | {"cookie", "chocolate_chips=yes"}, {"accept", "text/plain, text/html"}, | 
|  | {"cookie", "raisins=no"}}; | 
|  | const std::vector<HeaderPair> expected = { | 
|  | {":authority", "example.com"}, | 
|  | {":method", "GET"}, | 
|  | {":path", "/example.html"}, | 
|  | {":scheme", "http"}, | 
|  | {"cookie", "chocolate_chips=yes; raisins=no"}, | 
|  | {"accept", "text/plain, text/html"}}; | 
|  | const std::vector<Header> headers = ToHeaders(pairs); | 
|  | spdy::SpdyHeaderBlock block = ToHeaderBlock(headers); | 
|  | EXPECT_THAT(block, testing::ElementsAreArray(expected)); | 
|  | } | 
|  |  | 
|  | TEST(ToHeaderBlock, RepeatedResponseHeaderNames) { | 
|  | const std::vector<HeaderPair> pairs = { | 
|  | {":status", "403"},          {"x-extra-info", "sorry"}, | 
|  | {"content-length", "1023"},  {"x-extra-info", "humblest apologies"}, | 
|  | {"content-length", "1024"},  {"set-cookie", "chocolate_chips=yes"}, | 
|  | {"set-cookie", "raisins=no"}}; | 
|  | const std::vector<HeaderPair> expected = { | 
|  | {":status", "403"}, | 
|  | {"x-extra-info", absl::string_view("sorry\0humblest apologies", 24)}, | 
|  | {"content-length", absl::string_view("1023" | 
|  | "\0" | 
|  | "1024", | 
|  | 9)}, | 
|  | {"set-cookie", absl::string_view("chocolate_chips=yes\0raisins=no", 30)}}; | 
|  | const std::vector<Header> headers = ToHeaders(pairs); | 
|  | spdy::SpdyHeaderBlock block = ToHeaderBlock(headers); | 
|  | EXPECT_THAT(block, testing::ElementsAreArray(expected)); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace adapter | 
|  | }  // namespace http2 |