From f32998d8719a734b33ac4fd0ec78b8e17592a815 Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Sat, 7 Apr 2018 13:28:42 +0200 Subject: [PATCH] Fix hanging resources when accessories enumeration is cancelled --- src/USB/ConnectedAccessoriesEnumerator.cpp | 6 ++++- src/USB/ConnectedAccessoriesEnumerator.ut.cpp | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/USB/ConnectedAccessoriesEnumerator.cpp b/src/USB/ConnectedAccessoriesEnumerator.cpp index 75758fa..1d0dc5c 100644 --- a/src/USB/ConnectedAccessoriesEnumerator.cpp +++ b/src/USB/ConnectedAccessoriesEnumerator.cpp @@ -69,7 +69,6 @@ void ConnectedAccessoriesEnumerator::cancel() if(queryChain_ != nullptr) { queryChain_->cancel(); - queryChain_.reset(); } }); } @@ -92,6 +91,11 @@ void ConnectedAccessoriesEnumerator::queryNextDevice() { this->queryNextDevice(); } + else + { + promise_->reject(e); + this->reset(); + } }); queryChain_->start(std::move(deviceHandle), std::move(queryChainPromise)); diff --git a/src/USB/ConnectedAccessoriesEnumerator.ut.cpp b/src/USB/ConnectedAccessoriesEnumerator.ut.cpp index 297b4d4..d89bb20 100644 --- a/src/USB/ConnectedAccessoriesEnumerator.ut.cpp +++ b/src/USB/ConnectedAccessoriesEnumerator.ut.cpp @@ -205,6 +205,32 @@ BOOST_FIXTURE_TEST_CASE(ConnectedAccessoriesEnumerator_OpenDeviceFailed, Connect ioService_.run(); } +BOOST_FIXTURE_TEST_CASE(ConnectedAccessoriesEnumerator_CancelEnumeration, ConnectedAccessoriesEnumeratorUnitTest) +{ + deviceList_.push_back(reinterpret_cast(1)); + EXPECT_CALL(queryChainFactoryMock_, create()).WillOnce(Return(queryChain_)); + auto connectedAccessoriesEnumerator(std::make_shared(usbWrapperMock_, ioService_, queryChainFactoryMock_)); + + EXPECT_CALL(usbWrapperMock_, getDeviceList(_)).WillOnce(DoAll(SetArgReferee<0>(deviceListHandle_), Return(0))); + connectedAccessoriesEnumerator->enumerate(std::move(promise_)); + + EXPECT_CALL(usbWrapperMock_, open(*deviceList_.begin(), _)).WillOnce(DoAll(SetArgReferee<1>(deviceHandle_), Return(0))); + + IAccessoryModeQueryChain::Promise::Pointer queryChainPromise; + EXPECT_CALL(queryChainMock_, start(deviceHandle_, _)).WillOnce(SaveArg<1>(&queryChainPromise)); + ioService_.run(); + ioService_.reset(); + + EXPECT_CALL(queryChainMock_, cancel()); + connectedAccessoriesEnumerator->cancel(); + + error::Error e(error::ErrorCode::OPERATION_ABORTED); + EXPECT_CALL(promiseHandlerMock_, onResolve(_)).Times(0); + EXPECT_CALL(promiseHandlerMock_, onReject(e)); + queryChainPromise->reject(e); + ioService_.run(); +} + } } }