Move oghttp2 shutdown tests to oghttp2_adapter_test.cc, and add analogous nghttp2 tests. This testing prefactor/addition will be helpful for future shutdown changes. PiperOrigin-RevId: 416875184
diff --git a/http2/adapter/nghttp2_adapter_test.cc b/http2/adapter/nghttp2_adapter_test.cc index fc5dbd2..b2494e5 100644 --- a/http2/adapter/nghttp2_adapter_test.cc +++ b/http2/adapter/nghttp2_adapter_test.cc
@@ -1072,6 +1072,22 @@ EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS})); } +TEST(NgHttp2AdapterTest, ClientStartsShutdown) { + DataSavingVisitor visitor; + auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); + + EXPECT_FALSE(adapter->want_write()); + + // No-op for a client implementation. + adapter->SubmitShutdownNotice(); + EXPECT_FALSE(adapter->want_write()); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + + EXPECT_EQ(visitor.data(), spdy::kHttp2ConnectionHeaderPrefix); +} + TEST(NgHttp2AdapterTest, ClientFailsOnGoAway) { DataSavingVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); @@ -3855,6 +3871,45 @@ EXPECT_FALSE(adapter->want_write()); } +TEST(NgHttp2AdapterTest, ServerStartsShutdown) { + DataSavingVisitor visitor; + auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); + + EXPECT_FALSE(adapter->want_write()); + + adapter->SubmitShutdownNotice(); + EXPECT_TRUE(adapter->want_write()); + + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::GOAWAY})); +} + +TEST(NgHttp2AdapterTest, ServerStartsShutdownAfterGoaway) { + DataSavingVisitor visitor; + auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); + + EXPECT_FALSE(adapter->want_write()); + + adapter->SubmitGoAway(1, Http2ErrorCode::HTTP2_NO_ERROR, + "and don't come back!"); + EXPECT_TRUE(adapter->want_write()); + + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::GOAWAY})); + + // No-op, since a GOAWAY has previously been enqueued. + adapter->SubmitShutdownNotice(); + EXPECT_FALSE(adapter->want_write()); +} + } // namespace } // namespace test } // namespace adapter
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc index 8d62da9..adc46c0 100644 --- a/http2/adapter/oghttp2_adapter_test.cc +++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -1298,6 +1298,30 @@ spdy::SpdyFrameType::RST_STREAM})); } +TEST(OgHttp2AdapterClientTest, ClientStartsShutdown) { + DataSavingVisitor visitor; + OgHttp2Adapter::Options options{.perspective = Perspective::kClient}; + auto adapter = OgHttp2Adapter::Create(visitor, options); + + EXPECT_FALSE(adapter->want_write()); + + // No-op (except for logging) for a client implementation. + adapter->SubmitShutdownNotice(); + EXPECT_FALSE(adapter->want_write()); + + EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + + absl::string_view serialized = visitor.data(); + EXPECT_THAT(serialized, + testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); + serialized.remove_prefix(strlen(spdy::kHttp2ConnectionHeaderPrefix)); + EXPECT_THAT(serialized, EqualsFrames({SpdyFrameType::SETTINGS})); +} + TEST(OgHttp2AdapterClientTest, ClientFailsOnGoAway) { DataSavingVisitor visitor; OgHttp2Adapter::Options options{.perspective = Perspective::kClient}; @@ -3887,6 +3911,53 @@ EXPECT_FALSE(adapter->want_write()); } +TEST(OgHttpAdapterServerTest, ServerStartsShutdown) { + DataSavingVisitor visitor; + OgHttp2Adapter::Options options{.perspective = Perspective::kServer}; + auto adapter = OgHttp2Adapter::Create(visitor, options); + + EXPECT_FALSE(adapter->want_write()); + + adapter->SubmitShutdownNotice(); + EXPECT_TRUE(adapter->want_write()); + + EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + EXPECT_THAT(visitor.data(), + EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); +} + +TEST(OgHttp2AdapterServerTest, ServerStartsShutdownAfterGoaway) { + DataSavingVisitor visitor; + OgHttp2Adapter::Options options{.perspective = Perspective::kServer}; + auto adapter = OgHttp2Adapter::Create(visitor, options); + + EXPECT_FALSE(adapter->want_write()); + + adapter->SubmitGoAway(1, Http2ErrorCode::HTTP2_NO_ERROR, + "and don't come back!"); + EXPECT_TRUE(adapter->want_write()); + + EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); + + int result = adapter->Send(); + EXPECT_EQ(0, result); + EXPECT_THAT(visitor.data(), + EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); + + // No-op, since a GOAWAY has previously been enqueued. + adapter->SubmitShutdownNotice(); + EXPECT_FALSE(adapter->want_write()); +} + } // namespace } // namespace test } // namespace adapter
diff --git a/http2/adapter/oghttp2_session_test.cc b/http2/adapter/oghttp2_session_test.cc index 28a143a..83dd424 100644 --- a/http2/adapter/oghttp2_session_test.cc +++ b/http2/adapter/oghttp2_session_test.cc
@@ -473,30 +473,6 @@ EXPECT_FALSE(session.want_write()); } -TEST(OgHttp2SessionTest, ClientStartShutdown) { - DataSavingVisitor visitor; - OgHttp2Session session( - visitor, OgHttp2Session::Options{.perspective = Perspective::kClient}); - - EXPECT_FALSE(session.want_write()); - - // No-op (except for logging) for a client implementation. - session.StartGracefulShutdown(); - EXPECT_FALSE(session.want_write()); - - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); - - int result = session.Send(); - EXPECT_EQ(0, result); - - absl::string_view serialized = visitor.data(); - EXPECT_THAT(serialized, - testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); - serialized.remove_prefix(strlen(spdy::kHttp2ConnectionHeaderPrefix)); - EXPECT_THAT(serialized, EqualsFrames({SpdyFrameType::SETTINGS})); -} - TEST(OgHttp2SessionTest, ServerConstruction) { testing::StrictMock<MockHttp2Visitor> visitor; OgHttp2Session session( @@ -762,54 +738,6 @@ EXPECT_GT(session.GetHpackEncoderDynamicTableSize(), 0); } -TEST(OgHttp2SessionTest, ServerStartShutdown) { - DataSavingVisitor visitor; - OgHttp2Session session( - visitor, OgHttp2Session::Options{.perspective = Perspective::kServer}); - - EXPECT_FALSE(session.want_write()); - - session.StartGracefulShutdown(); - EXPECT_TRUE(session.want_write()); - - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); - EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); - EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); - - int result = session.Send(); - EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), - EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); -} - -TEST(OgHttp2SessionTest, ServerStartShutdownAfterGoaway) { - DataSavingVisitor visitor; - OgHttp2Session session( - visitor, OgHttp2Session::Options{.perspective = Perspective::kServer}); - - EXPECT_FALSE(session.want_write()); - - auto goaway = absl::make_unique<spdy::SpdyGoAwayIR>( - 1, spdy::ERROR_CODE_NO_ERROR, "and don't come back!"); - session.EnqueueFrame(std::move(goaway)); - EXPECT_TRUE(session.want_write()); - - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); - EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); - EXPECT_CALL(visitor, OnFrameSent(GOAWAY, 0, _, 0x0, 0)); - - int result = session.Send(); - EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), - EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); - - // No-op, since a GOAWAY has previously been enqueued. - session.StartGracefulShutdown(); - EXPECT_FALSE(session.want_write()); -} - // Tests the case where the server queues trailers after the data stream is // exhausted. TEST(OgHttp2SessionTest, ServerSendsTrailers) {