Verifies NgHttp2Session output in the unit test.
PiperOrigin-RevId: 369496789
Change-Id: I8eeafb3001ddf52007ae87e027e6813764bfa218
diff --git a/http2/adapter/nghttp2_session_test.cc b/http2/adapter/nghttp2_session_test.cc
index 1f0dd8f..a369752 100644
--- a/http2/adapter/nghttp2_session_test.cc
+++ b/http2/adapter/nghttp2_session_test.cc
@@ -4,6 +4,7 @@
#include "http2/adapter/nghttp2_callbacks.h"
#include "http2/adapter/nghttp2_util.h"
#include "http2/adapter/test_frame_sequence.h"
+#include "http2/adapter/test_utils.h"
#include "common/platform/api/quiche_test.h"
namespace http2 {
@@ -16,6 +17,7 @@
void Save(absl::string_view data) { absl::StrAppend(&data_, data); }
const std::string& data() { return data_; }
+ void Clear() { data_.clear(); }
private:
std::string data_;
@@ -85,6 +87,14 @@
EXPECT_EQ(session.GetRemoteWindowSize(),
kDefaultInitialStreamWindowSize + 1000);
ASSERT_EQ(0, nghttp2_session_send(session.raw_ptr()));
+ // Some bytes should have been serialized.
+ absl::string_view serialized = visitor_.data();
+ ASSERT_THAT(serialized,
+ testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
+ serialized.remove_prefix(strlen(spdy::kHttp2ConnectionHeaderPrefix));
+ EXPECT_THAT(serialized, EqualsFrames({spdy::SpdyFrameType::SETTINGS,
+ spdy::SpdyFrameType::PING}));
+ visitor_.Clear();
const std::vector<Header> headers1 = {{":method", "GET"},
{":scheme", "http"},
@@ -120,6 +130,11 @@
QUICHE_LOG(INFO) << "Created stream: " << stream_id3;
ASSERT_EQ(0, nghttp2_session_send(session.raw_ptr()));
+ serialized = visitor_.data();
+ EXPECT_THAT(serialized, EqualsFrames({spdy::SpdyFrameType::HEADERS,
+ spdy::SpdyFrameType::HEADERS,
+ spdy::SpdyFrameType::HEADERS}));
+ visitor_.Clear();
const std::string stream_frames =
TestFrameSequence()
@@ -147,7 +162,28 @@
OnGoAway(5, Http2ErrorCode::ENHANCE_YOUR_CALM, "calm down!!"));
const ssize_t stream_result = session.ProcessBytes(stream_frames);
EXPECT_EQ(stream_frames.size(), stream_result);
+
+ // Even though the client recieved a GOAWAY, streams 1 and 5 are still active.
+ EXPECT_TRUE(session.want_read());
+
+ EXPECT_CALL(visitor_, OnBeginDataForStream(1, 0));
+ EXPECT_CALL(visitor_, OnEndStream(1));
+ EXPECT_CALL(visitor_, OnCloseStream(1));
+ EXPECT_CALL(visitor_, OnRstStream(5, Http2ErrorCode::REFUSED_STREAM));
+ EXPECT_CALL(visitor_, OnAbortStream(5, Http2ErrorCode::REFUSED_STREAM));
+ session.ProcessBytes(TestFrameSequence()
+ .Data(1, "", true)
+ .RstStream(5, Http2ErrorCode::REFUSED_STREAM)
+ .Serialize());
+ // After receiving END_STREAM for 1 and RST_STREAM for 5, the session no
+ // longer expects reads.
+ EXPECT_FALSE(session.want_read());
+
+ // Client will not have anything else to write.
+ EXPECT_FALSE(session.want_write());
ASSERT_EQ(0, nghttp2_session_send(session.raw_ptr()));
+ serialized = visitor_.data();
+ EXPECT_EQ(serialized.size(), 0);
}
TEST_F(NgHttp2SessionTest, ServerConstruction) {
@@ -217,6 +253,15 @@
EXPECT_EQ(session.GetRemoteWindowSize(),
kDefaultInitialStreamWindowSize + 1000);
+
+ EXPECT_TRUE(session.want_write());
+ ASSERT_EQ(0, nghttp2_session_send(session.raw_ptr()));
+ // Some bytes should have been serialized.
+ absl::string_view serialized = visitor_.data();
+ // SETTINGS ack, two PING acks.
+ EXPECT_THAT(serialized, EqualsFrames({spdy::SpdyFrameType::SETTINGS,
+ spdy::SpdyFrameType::PING,
+ spdy::SpdyFrameType::PING}));
}
} // namespace