Blocked decoding part 1: QpackHeaderTable::Observer.
gfe-relnote: n/a, QUIC v99-only change.
PiperOrigin-RevId: 257104083
Change-Id: I6209b6f2be59b32fba1790765a00abee7b75bfe2
diff --git a/quic/core/qpack/qpack_header_table_test.cc b/quic/core/qpack/qpack_header_table_test.cc
index 6f9009d..ff7ef48 100644
--- a/quic/core/qpack/qpack_header_table_test.cc
+++ b/quic/core/qpack/qpack_header_table_test.cc
@@ -9,12 +9,22 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/spdy/core/hpack/hpack_entry.h"
+using ::testing::Mock;
+using ::testing::StrictMock;
+
namespace quic {
namespace test {
namespace {
const uint64_t kMaximumDynamicTableCapacityForTesting = 1024 * 1024;
+class MockObserver : public QpackHeaderTable::Observer {
+ public:
+ ~MockObserver() override = default;
+
+ MOCK_METHOD0(OnInsertCountReachedThreshold, void());
+};
+
class QpackHeaderTableTest : public QuicTest {
protected:
QpackHeaderTableTest() {
@@ -78,6 +88,11 @@
return table_.SetDynamicTableCapacity(capacity);
}
+ void RegisterObserver(QpackHeaderTable::Observer* observer,
+ uint64_t required_insert_count) {
+ table_.RegisterObserver(observer, required_insert_count);
+ }
+
uint64_t max_entries() const { return table_.max_entries(); }
uint64_t inserted_entry_count() const {
return table_.inserted_entry_count();
@@ -350,6 +365,45 @@
/* expected_is_static = */ false, 2u);
}
+TEST_F(QpackHeaderTableTest, Observer) {
+ StrictMock<MockObserver> observer1;
+ RegisterObserver(&observer1, 1);
+ EXPECT_CALL(observer1, OnInsertCountReachedThreshold);
+ InsertEntry("foo", "bar");
+ EXPECT_EQ(1u, inserted_entry_count());
+ Mock::VerifyAndClearExpectations(&observer1);
+
+ // Registration order does not matter.
+ StrictMock<MockObserver> observer2;
+ StrictMock<MockObserver> observer3;
+ RegisterObserver(&observer3, 3);
+ RegisterObserver(&observer2, 2);
+
+ EXPECT_CALL(observer2, OnInsertCountReachedThreshold);
+ InsertEntry("foo", "bar");
+ EXPECT_EQ(2u, inserted_entry_count());
+ Mock::VerifyAndClearExpectations(&observer3);
+
+ EXPECT_CALL(observer3, OnInsertCountReachedThreshold);
+ InsertEntry("foo", "bar");
+ EXPECT_EQ(3u, inserted_entry_count());
+ Mock::VerifyAndClearExpectations(&observer2);
+
+ // Multiple observers with identical |required_insert_count| should all be
+ // notified.
+ StrictMock<MockObserver> observer4;
+ StrictMock<MockObserver> observer5;
+ RegisterObserver(&observer4, 4);
+ RegisterObserver(&observer5, 4);
+
+ EXPECT_CALL(observer4, OnInsertCountReachedThreshold);
+ EXPECT_CALL(observer5, OnInsertCountReachedThreshold);
+ InsertEntry("foo", "bar");
+ EXPECT_EQ(4u, inserted_entry_count());
+ Mock::VerifyAndClearExpectations(&observer4);
+ Mock::VerifyAndClearExpectations(&observer5);
+}
+
} // namespace
} // namespace test
} // namespace quic