|  | #include "http2/adapter/recording_http2_visitor.h" | 
|  |  | 
|  | #include "http2/adapter/http2_protocol.h" | 
|  | #include "http2/adapter/nghttp2_adapter.h" | 
|  | #include "http2/adapter/oghttp2_adapter.h" | 
|  | #include "http2/adapter/test_frame_sequence.h" | 
|  | #include "common/platform/api/quiche_test.h" | 
|  | #include "spdy/core/spdy_protocol.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace adapter { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | TEST(AdapterImplComparisonTest, ClientHandlesFrames) { | 
|  | RecordingHttp2Visitor nghttp2_visitor; | 
|  | std::unique_ptr<NgHttp2Adapter> nghttp2_adapter = | 
|  | NgHttp2Adapter::CreateClientAdapter(nghttp2_visitor); | 
|  |  | 
|  | RecordingHttp2Visitor oghttp2_visitor; | 
|  | OgHttp2Adapter::Options options{.perspective = Perspective::kClient}; | 
|  | std::unique_ptr<OgHttp2Adapter> oghttp2_adapter = | 
|  | OgHttp2Adapter::Create(oghttp2_visitor, options); | 
|  |  | 
|  | const std::string initial_frames = TestFrameSequence() | 
|  | .ServerPreface() | 
|  | .Ping(42) | 
|  | .WindowUpdate(0, 1000) | 
|  | .Serialize(); | 
|  |  | 
|  | nghttp2_adapter->ProcessBytes(initial_frames); | 
|  | oghttp2_adapter->ProcessBytes(initial_frames); | 
|  |  | 
|  | EXPECT_EQ(nghttp2_visitor.GetEventSequence(), | 
|  | oghttp2_visitor.GetEventSequence()); | 
|  |  | 
|  | // TODO(b/181586191): Consider consistent behavior for delivering events on | 
|  | // non-existent streams between nghttp2_adapter and oghttp2_adapter. | 
|  | } | 
|  |  | 
|  | TEST(AdapterImplComparisonTest, ServerHandlesFrames) { | 
|  | RecordingHttp2Visitor nghttp2_visitor; | 
|  | std::unique_ptr<NgHttp2Adapter> nghttp2_adapter = | 
|  | NgHttp2Adapter::CreateServerAdapter(nghttp2_visitor); | 
|  |  | 
|  | RecordingHttp2Visitor oghttp2_visitor; | 
|  | OgHttp2Adapter::Options options{.perspective = Perspective::kServer}; | 
|  | std::unique_ptr<OgHttp2Adapter> oghttp2_adapter = | 
|  | OgHttp2Adapter::Create(oghttp2_visitor, options); | 
|  |  | 
|  | const std::string frames = TestFrameSequence() | 
|  | .ClientPreface() | 
|  | .Ping(42) | 
|  | .WindowUpdate(0, 1000) | 
|  | .Headers(1, | 
|  | {{":method", "POST"}, | 
|  | {":scheme", "https"}, | 
|  | {":authority", "example.com"}, | 
|  | {":path", "/this/is/request/one"}}, | 
|  | /*fin=*/false) | 
|  | .WindowUpdate(1, 2000) | 
|  | .Data(1, "This is the request body.") | 
|  | .Headers(3, | 
|  | {{":method", "GET"}, | 
|  | {":scheme", "http"}, | 
|  | {":authority", "example.com"}, | 
|  | {":path", "/this/is/request/two"}}, | 
|  | /*fin=*/true) | 
|  | .RstStream(3, Http2ErrorCode::CANCEL) | 
|  | .Ping(47) | 
|  | .Serialize(); | 
|  |  | 
|  | nghttp2_adapter->ProcessBytes(frames); | 
|  | oghttp2_adapter->ProcessBytes(frames); | 
|  |  | 
|  | EXPECT_EQ(nghttp2_visitor.GetEventSequence(), | 
|  | oghttp2_visitor.GetEventSequence()); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace adapter | 
|  | }  // namespace http2 |