mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-05 11:21:09 +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:
committed by
Facebook GitHub Bot
parent
6de0b8bae2
commit
040b68c22d
@@ -3497,6 +3497,56 @@ TEST_F(QuicTransportImplTest, ObserverAttachRemove) {
|
||||
EXPECT_THAT(transport->getObservers(), IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, ObserverAttachRemoveMultiple) {
|
||||
auto cb1 = std::make_unique<StrictMock<MockObserver>>();
|
||||
EXPECT_CALL(*cb1, observerAttach(transport.get()));
|
||||
transport->addObserver(cb1.get());
|
||||
Mock::VerifyAndClearExpectations(cb1.get());
|
||||
EXPECT_THAT(transport->getObservers(), UnorderedElementsAre(cb1.get()));
|
||||
|
||||
auto cb2 = std::make_unique<StrictMock<MockObserver>>();
|
||||
EXPECT_CALL(*cb2, observerAttach(transport.get()));
|
||||
transport->addObserver(cb2.get());
|
||||
Mock::VerifyAndClearExpectations(cb2.get());
|
||||
EXPECT_THAT(
|
||||
transport->getObservers(), UnorderedElementsAre(cb1.get(), cb2.get()));
|
||||
|
||||
EXPECT_CALL(*cb1, observerDetach(transport.get()));
|
||||
EXPECT_TRUE(transport->removeObserver(cb1.get()));
|
||||
Mock::VerifyAndClearExpectations(cb1.get());
|
||||
EXPECT_THAT(transport->getObservers(), UnorderedElementsAre(cb2.get()));
|
||||
|
||||
EXPECT_CALL(*cb2, observerDetach(transport.get()));
|
||||
EXPECT_TRUE(transport->removeObserver(cb2.get()));
|
||||
Mock::VerifyAndClearExpectations(cb2.get());
|
||||
EXPECT_THAT(transport->getObservers(), IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, ObserverAttachRemoveMultipleReverse) {
|
||||
auto cb1 = std::make_unique<StrictMock<MockObserver>>();
|
||||
EXPECT_CALL(*cb1, observerAttach(transport.get()));
|
||||
transport->addObserver(cb1.get());
|
||||
Mock::VerifyAndClearExpectations(cb1.get());
|
||||
EXPECT_THAT(transport->getObservers(), UnorderedElementsAre(cb1.get()));
|
||||
|
||||
auto cb2 = std::make_unique<StrictMock<MockObserver>>();
|
||||
EXPECT_CALL(*cb2, observerAttach(transport.get()));
|
||||
transport->addObserver(cb2.get());
|
||||
Mock::VerifyAndClearExpectations(cb2.get());
|
||||
EXPECT_THAT(
|
||||
transport->getObservers(), UnorderedElementsAre(cb1.get(), cb2.get()));
|
||||
|
||||
EXPECT_CALL(*cb2, observerDetach(transport.get()));
|
||||
EXPECT_TRUE(transport->removeObserver(cb2.get()));
|
||||
Mock::VerifyAndClearExpectations(cb2.get());
|
||||
EXPECT_THAT(transport->getObservers(), UnorderedElementsAre(cb1.get()));
|
||||
|
||||
EXPECT_CALL(*cb1, observerDetach(transport.get()));
|
||||
EXPECT_TRUE(transport->removeObserver(cb1.get()));
|
||||
Mock::VerifyAndClearExpectations(cb1.get());
|
||||
EXPECT_THAT(transport->getObservers(), IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, ObserverRemoveMissing) {
|
||||
auto cb = std::make_unique<StrictMock<MockObserver>>();
|
||||
EXPECT_FALSE(transport->removeObserver(cb.get()));
|
||||
|
Reference in New Issue
Block a user