1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-10 21:22:20 +03:00

Fix removeObserver and removeAcceptObserver

Summary: When multiple observers attached and one is removed, removal code can end up calling `observerDetach` on the wrong observer. Simplified and fixed removal logic and added new tests.

Reviewed By: yangchi

Differential Revision: D27033221

fbshipit-source-id: d200fd2243a678890758b2652b61d16887f073dd
This commit is contained in:
Brandon Schlinker
2021-05-13 12:49:53 -07:00
committed by Facebook GitHub Bot
parent 6de0b8bae2
commit 040b68c22d
4 changed files with 91 additions and 23 deletions

View File

@@ -1186,20 +1186,37 @@ TEST_F(QuicServerWorkerTest, AcceptObserverMultipleRemove) {
auto cb2 = std::make_unique<StrictMock<MockAcceptObserver>>();
EXPECT_CALL(*cb2, observerAttach(worker_.get()));
worker_->addAcceptObserver(cb2.get());
Mock::VerifyAndClearExpectations(cb1.get());
Mock::VerifyAndClearExpectations(cb2.get());
EXPECT_CALL(*cb2, observerDetach(worker_.get()));
EXPECT_TRUE(worker_->removeAcceptObserver(cb2.get()));
Mock::VerifyAndClearExpectations(cb1.get());
Mock::VerifyAndClearExpectations(cb2.get());
EXPECT_CALL(*cb1, observerDetach(worker_.get()));
EXPECT_TRUE(worker_->removeAcceptObserver(cb1.get()));
Mock::VerifyAndClearExpectations(cb1.get());
EXPECT_CALL(*cb2, observerDetach(worker_.get()));
EXPECT_TRUE(worker_->removeAcceptObserver(cb2.get()));
Mock::VerifyAndClearExpectations(cb2.get());
}
TEST_F(QuicServerWorkerTest, AcceptObserverMultipleRemoveReverse) {
auto cb1 = std::make_unique<StrictMock<MockAcceptObserver>>();
EXPECT_CALL(*cb1, observerAttach(worker_.get()));
worker_->addAcceptObserver(cb1.get());
Mock::VerifyAndClearExpectations(cb1.get());
auto cb2 = std::make_unique<StrictMock<MockAcceptObserver>>();
EXPECT_CALL(*cb2, observerAttach(worker_.get()));
worker_->addAcceptObserver(cb2.get());
Mock::VerifyAndClearExpectations(cb2.get());
EXPECT_CALL(*cb2, observerDetach(worker_.get()));
EXPECT_TRUE(worker_->removeAcceptObserver(cb2.get()));
Mock::VerifyAndClearExpectations(cb2.get());
EXPECT_CALL(*cb1, observerDetach(worker_.get()));
EXPECT_TRUE(worker_->removeAcceptObserver(cb1.get()));
Mock::VerifyAndClearExpectations(cb1.get());
}
TEST_F(QuicServerWorkerTest, AcceptObserverMultipleAcceptorDestroyed) {
auto cb1 = std::make_unique<StrictMock<MockAcceptObserver>>();
EXPECT_CALL(*cb1, observerAttach(worker_.get()));
@@ -1209,7 +1226,6 @@ TEST_F(QuicServerWorkerTest, AcceptObserverMultipleAcceptorDestroyed) {
auto cb2 = std::make_unique<StrictMock<MockAcceptObserver>>();
EXPECT_CALL(*cb2, observerAttach(worker_.get()));
worker_->addAcceptObserver(cb2.get());
Mock::VerifyAndClearExpectations(cb1.get());
Mock::VerifyAndClearExpectations(cb2.get());
// destroy the acceptor while the AcceptObserver is installed