Loading services/incremental/IncrementalService.cpp +17 −19 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ std::string makeBindMdName() { } // namespace IncrementalService::IncFsMount::~IncFsMount() { incrementalService.mIncrementalManager->destroyDataLoader(mountId); incrementalService.mDataLoaderManager->destroyDataLoader(mountId); control.reset(); LOG(INFO) << "Unmounting and cleaning up mount " << mountId << " with root '" << root << '\''; for (auto&& [target, _] : bindPoints) { Loading Loading @@ -229,14 +229,14 @@ void IncrementalService::IncFsMount::cleanupFilesystem(std::string_view root) { IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_view rootDir) : mVold(sm.getVoldService()), mIncrementalManager(sm.getIncrementalManager()), mDataLoaderManager(sm.getDataLoaderManager()), mIncFs(sm.getIncFs()), mIncrementalDir(rootDir) { if (!mVold) { LOG(FATAL) << "Vold service is unavailable"; } if (!mIncrementalManager) { LOG(FATAL) << "IncrementalManager service is unavailable"; if (!mDataLoaderManager) { LOG(FATAL) << "DataLoaderManagerService is unavailable"; } mountExistingImages(); } Loading Loading @@ -921,7 +921,6 @@ bool IncrementalService::startLoading(StorageId storage) const { if (!ifs) { return false; } bool started = false; std::unique_lock l(ifs->lock); if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) { if (ifs->dataLoaderReady.wait_for(l, Seconds(5)) == std::cv_status::timeout) { Loading @@ -929,11 +928,19 @@ bool IncrementalService::startLoading(StorageId storage) const { return false; } } auto status = mIncrementalManager->startDataLoader(ifs->mountId, &started); sp<IDataLoader> dataloader; auto status = mDataLoaderManager->getDataLoader(ifs->mountId, &dataloader); if (!status.isOk()) { return false; } return started; if (!dataloader) { return false; } status = dataloader->start(); if (!status.isOk()) { return false; } return true; } void IncrementalService::mountExistingImages() { Loading Loading @@ -1086,7 +1093,7 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, sp<IncrementalDataLoaderListener> listener = new IncrementalDataLoaderListener(*this, *externalListener); bool created = false; auto status = mIncrementalManager->prepareDataLoader(ifs.mountId, fsControlParcel, *dlp, auto status = mDataLoaderManager->initializeDataLoader(ifs.mountId, *dlp, fsControlParcel, listener, &created); if (!status.isOk() || !created) { LOG(ERROR) << "Failed to create a data loader for mount " << ifs.mountId; Loading Loading @@ -1229,16 +1236,7 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange ifs->dataLoaderStatus = newStatus; switch (newStatus) { case IDataLoaderStatusListener::DATA_LOADER_NO_CONNECTION: { auto now = Clock::now(); if (ifs->connectionLostTime.time_since_epoch().count() == 0) { ifs->connectionLostTime = now; break; } auto duration = std::chrono::duration_cast<Seconds>(now - ifs->connectionLostTime).count(); if (duration >= 10) { incrementalService.mIncrementalManager->showHealthBlockedUI(mountId); } // TODO(b/150411019): handle data loader connection loss break; } case IDataLoaderStatusListener::DATA_LOADER_CONNECTION_OK: { Loading services/incremental/IncrementalService.h +1 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #include <android-base/strings.h> #include <android-base/unique_fd.h> #include <android/content/pm/DataLoaderParamsParcel.h> #include <android/os/incremental/IIncrementalManager.h> #include <binder/IServiceManager.h> #include <utils/String16.h> #include <utils/StrongPointer.h> Loading Loading @@ -220,7 +219,7 @@ private: // Member variables std::unique_ptr<VoldServiceWrapper> mVold; std::unique_ptr<IncrementalManagerWrapper> mIncrementalManager; std::unique_ptr<DataLoaderManagerWrapper> mDataLoaderManager; std::unique_ptr<IncFsWrapper> mIncFs; const std::string mIncrementalDir; Loading services/incremental/ServiceWrappers.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ using namespace std::literals; namespace android::os::incremental { static constexpr auto kVoldServiceName = "vold"sv; static constexpr auto kIncrementalManagerName = "incremental"sv; static constexpr auto kDataLoaderManagerName = "dataloader_manager"sv; RealServiceManager::RealServiceManager(sp<IServiceManager> serviceManager) : mServiceManager(std::move(serviceManager)) {} Loading @@ -46,11 +46,11 @@ std::unique_ptr<VoldServiceWrapper> RealServiceManager::getVoldService() { return nullptr; } std::unique_ptr<IncrementalManagerWrapper> RealServiceManager::getIncrementalManager() { sp<IIncrementalManager> manager = RealServiceManager::getRealService<IIncrementalManager>(kIncrementalManagerName); std::unique_ptr<DataLoaderManagerWrapper> RealServiceManager::getDataLoaderManager() { sp<IDataLoaderManager> manager = RealServiceManager::getRealService<IDataLoaderManager>(kDataLoaderManagerName); if (manager) { return std::make_unique<RealIncrementalManager>(manager); return std::make_unique<RealDataLoaderManager>(manager); } return nullptr; } Loading services/incremental/ServiceWrappers.h +23 −26 Original line number Diff line number Diff line Loading @@ -20,9 +20,10 @@ #include <android-base/unique_fd.h> #include <android/content/pm/DataLoaderParamsParcel.h> #include <android/content/pm/FileSystemControlParcel.h> #include <android/content/pm/IDataLoader.h> #include <android/content/pm/IDataLoaderManager.h> #include <android/content/pm/IDataLoaderStatusListener.h> #include <android/os/IVold.h> #include <android/os/incremental/IIncrementalManager.h> #include <binder/IServiceManager.h> #include <incfs.h> Loading Loading @@ -50,17 +51,16 @@ public: const std::string& targetDir) const = 0; }; class IncrementalManagerWrapper { class DataLoaderManagerWrapper { public: virtual ~IncrementalManagerWrapper() = default; virtual binder::Status prepareDataLoader(MountId mountId, const FileSystemControlParcel& control, virtual ~DataLoaderManagerWrapper() = default; virtual binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) const = 0; virtual binder::Status startDataLoader(MountId mountId, bool* _aidl_return) const = 0; virtual binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const = 0; virtual binder::Status destroyDataLoader(MountId mountId) const = 0; virtual binder::Status showHealthBlockedUI(MountId mountId) const = 0; }; class IncFsWrapper { Loading @@ -82,7 +82,7 @@ class ServiceManagerWrapper { public: virtual ~ServiceManagerWrapper() = default; virtual std::unique_ptr<VoldServiceWrapper> getVoldService() = 0; virtual std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() = 0; virtual std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() = 0; virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0; }; Loading @@ -109,29 +109,26 @@ private: sp<os::IVold> mInterface; }; class RealIncrementalManager : public IncrementalManagerWrapper { class RealDataLoaderManager : public DataLoaderManagerWrapper { public: RealIncrementalManager(const sp<os::incremental::IIncrementalManager> manager) RealDataLoaderManager(const sp<content::pm::IDataLoaderManager> manager) : mInterface(manager) {} ~RealIncrementalManager() = default; binder::Status prepareDataLoader(MountId mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, ~RealDataLoaderManager() = default; binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) const override { return mInterface->prepareDataLoader(mountId, control, params, listener, _aidl_return); return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return); } binder::Status startDataLoader(MountId mountId, bool* _aidl_return) const override { return mInterface->startDataLoader(mountId, _aidl_return); binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const override { return mInterface->getDataLoader(mountId, _aidl_return); } binder::Status destroyDataLoader(MountId mountId) const override { return mInterface->destroyDataLoader(mountId); } binder::Status showHealthBlockedUI(MountId mountId) const override { return mInterface->showHealthBlockedUI(mountId); } private: sp<os::incremental::IIncrementalManager> mInterface; sp<content::pm::IDataLoaderManager> mInterface; }; class RealServiceManager : public ServiceManagerWrapper { Loading @@ -139,7 +136,7 @@ public: RealServiceManager(sp<IServiceManager> serviceManager); ~RealServiceManager() = default; std::unique_ptr<VoldServiceWrapper> getVoldService() override; std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() override; std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() override; std::unique_ptr<IncFsWrapper> getIncFs() override; private: Loading services/incremental/test/IncrementalServiceTest.cpp +68 −54 Original line number Diff line number Diff line Loading @@ -93,22 +93,35 @@ private: TemporaryFile logFile; }; class MockIncrementalManager : public IncrementalManagerWrapper { class FakeDataLoader : public IDataLoader { public: MOCK_CONST_METHOD5(prepareDataLoader, binder::Status(int32_t mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, IBinder* onAsBinder() override { return nullptr; } binder::Status create(int32_t, const DataLoaderParamsParcel&, const FileSystemControlParcel&, const sp<IDataLoaderStatusListener>&) override { return binder::Status::ok(); } binder::Status start() override { return binder::Status::ok(); } binder::Status stop() override { return binder::Status::ok(); } binder::Status destroy() override { return binder::Status::ok(); } binder::Status prepareImage(const std::vector<InstallationFileParcel>&, const std::vector<std::string>&) override { return binder::Status::ok(); } }; class MockDataLoaderManager : public DataLoaderManagerWrapper { public: MOCK_CONST_METHOD5(initializeDataLoader, binder::Status(int32_t mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return)); MOCK_CONST_METHOD2(startDataLoader, binder::Status(int32_t mountId, bool* _aidl_return)); MOCK_CONST_METHOD2(getDataLoader, binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return)); MOCK_CONST_METHOD1(destroyDataLoader, binder::Status(int32_t mountId)); MOCK_CONST_METHOD3(newFileForDataLoader, binder::Status(int32_t mountId, FileId fileId, const ::std::vector<uint8_t>& metadata)); MOCK_CONST_METHOD1(showHealthBlockedUI, binder::Status(int32_t mountId)); binder::Status prepareDataLoaderOk(int32_t mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, binder::Status initializeDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) { mId = mountId; Loading @@ -117,23 +130,23 @@ public: return binder::Status::ok(); } binder::Status startDataLoaderOk(int32_t mountId, bool* _aidl_return) { *_aidl_return = true; binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) { *_aidl_return = mDataLoader; return binder::Status::ok(); } void prepareDataLoaderFails() { ON_CALL(*this, prepareDataLoader(_, _, _, _, _)) void initializeDataLoaderFails() { ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) .WillByDefault(Return( (binder::Status::fromExceptionCode(1, String8("failed to prepare"))))); } void prepareDataLoaderSuccess() { ON_CALL(*this, prepareDataLoader(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockIncrementalManager::prepareDataLoaderOk)); void initializeDataLoaderSuccess() { ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::initializeDataLoaderOk)); } void startDataLoaderSuccess() { ON_CALL(*this, startDataLoader(_, _)) .WillByDefault(Invoke(this, &MockIncrementalManager::startDataLoaderOk)); void getDataLoaderSuccess() { ON_CALL(*this, getDataLoader(_, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk)); } void setDataLoaderStatusNotReady() { mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); Loading @@ -145,6 +158,7 @@ public: private: int mId; sp<IDataLoaderStatusListener> mListener; sp<IDataLoader> mDataLoader = sp<IDataLoader>(new FakeDataLoader()); }; class MockIncFs : public IncFsWrapper { Loading Loading @@ -197,20 +211,20 @@ public: class MockServiceManager : public ServiceManagerWrapper { public: MockServiceManager(std::unique_ptr<MockVoldService> vold, std::unique_ptr<MockIncrementalManager> manager, std::unique_ptr<MockDataLoaderManager> manager, std::unique_ptr<MockIncFs> incfs) : mVold(std::move(vold)), mIncrementalManager(std::move(manager)), mDataLoaderManager(std::move(manager)), mIncFs(std::move(incfs)) {} std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); } std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() final { return std::move(mIncrementalManager); std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final { return std::move(mDataLoaderManager); } std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); } private: std::unique_ptr<MockVoldService> mVold; std::unique_ptr<MockIncrementalManager> mIncrementalManager; std::unique_ptr<MockDataLoaderManager> mDataLoaderManager; std::unique_ptr<MockIncFs> mIncFs; }; Loading @@ -221,14 +235,14 @@ public: void SetUp() override { auto vold = std::make_unique<NiceMock<MockVoldService>>(); mVold = vold.get(); auto incrementalManager = std::make_unique<NiceMock<MockIncrementalManager>>(); mIncrementalManager = incrementalManager.get(); auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(); mDataLoaderManager = dataloaderManager.get(); auto incFs = std::make_unique<NiceMock<MockIncFs>>(); mIncFs = incFs.get(); mIncrementalService = std::make_unique<IncrementalService>(MockServiceManager(std::move(vold), std::move( incrementalManager), dataloaderManager), std::move(incFs)), mRootDir.path); mDataLoaderParcel.packageName = "com.test"; Loading Loading @@ -260,7 +274,7 @@ public: protected: NiceMock<MockVoldService>* mVold; NiceMock<MockIncFs>* mIncFs; NiceMock<MockIncrementalManager>* mIncrementalManager; NiceMock<MockDataLoaderManager>* mDataLoaderManager; std::unique_ptr<IncrementalService> mIncrementalService; TemporaryDir mRootDir; DataLoaderParamsParcel mDataLoaderParcel; Loading @@ -268,7 +282,7 @@ protected: TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { mVold->mountIncFsFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -278,7 +292,7 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) { mVold->mountIncFsInvalidControlParcel(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -289,8 +303,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = Loading @@ -303,8 +317,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = Loading @@ -317,8 +331,8 @@ TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderFails(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderFails(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = Loading @@ -331,8 +345,8 @@ TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = Loading @@ -346,31 +360,31 @@ TEST_F(IncrementalServiceTest, testOnStatusNotReady) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); mIncrementalManager->setDataLoaderStatusNotReady(); mDataLoaderManager->setDataLoaderStatusNotReady(); } TEST_F(IncrementalServiceTest, testStartDataLoaderSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); mIncrementalManager->setDataLoaderStatusReady(); mDataLoaderManager->setDataLoaderStatusReady(); ASSERT_TRUE(mIncrementalService->startLoading(storageId)); } Loading @@ -378,8 +392,8 @@ TEST_F(IncrementalServiceTest, testMakeDirectory) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -402,8 +416,8 @@ TEST_F(IncrementalServiceTest, testMakeDirectories) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading Loading
services/incremental/IncrementalService.cpp +17 −19 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ std::string makeBindMdName() { } // namespace IncrementalService::IncFsMount::~IncFsMount() { incrementalService.mIncrementalManager->destroyDataLoader(mountId); incrementalService.mDataLoaderManager->destroyDataLoader(mountId); control.reset(); LOG(INFO) << "Unmounting and cleaning up mount " << mountId << " with root '" << root << '\''; for (auto&& [target, _] : bindPoints) { Loading Loading @@ -229,14 +229,14 @@ void IncrementalService::IncFsMount::cleanupFilesystem(std::string_view root) { IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_view rootDir) : mVold(sm.getVoldService()), mIncrementalManager(sm.getIncrementalManager()), mDataLoaderManager(sm.getDataLoaderManager()), mIncFs(sm.getIncFs()), mIncrementalDir(rootDir) { if (!mVold) { LOG(FATAL) << "Vold service is unavailable"; } if (!mIncrementalManager) { LOG(FATAL) << "IncrementalManager service is unavailable"; if (!mDataLoaderManager) { LOG(FATAL) << "DataLoaderManagerService is unavailable"; } mountExistingImages(); } Loading Loading @@ -921,7 +921,6 @@ bool IncrementalService::startLoading(StorageId storage) const { if (!ifs) { return false; } bool started = false; std::unique_lock l(ifs->lock); if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) { if (ifs->dataLoaderReady.wait_for(l, Seconds(5)) == std::cv_status::timeout) { Loading @@ -929,11 +928,19 @@ bool IncrementalService::startLoading(StorageId storage) const { return false; } } auto status = mIncrementalManager->startDataLoader(ifs->mountId, &started); sp<IDataLoader> dataloader; auto status = mDataLoaderManager->getDataLoader(ifs->mountId, &dataloader); if (!status.isOk()) { return false; } return started; if (!dataloader) { return false; } status = dataloader->start(); if (!status.isOk()) { return false; } return true; } void IncrementalService::mountExistingImages() { Loading Loading @@ -1086,7 +1093,7 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, sp<IncrementalDataLoaderListener> listener = new IncrementalDataLoaderListener(*this, *externalListener); bool created = false; auto status = mIncrementalManager->prepareDataLoader(ifs.mountId, fsControlParcel, *dlp, auto status = mDataLoaderManager->initializeDataLoader(ifs.mountId, *dlp, fsControlParcel, listener, &created); if (!status.isOk() || !created) { LOG(ERROR) << "Failed to create a data loader for mount " << ifs.mountId; Loading Loading @@ -1229,16 +1236,7 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange ifs->dataLoaderStatus = newStatus; switch (newStatus) { case IDataLoaderStatusListener::DATA_LOADER_NO_CONNECTION: { auto now = Clock::now(); if (ifs->connectionLostTime.time_since_epoch().count() == 0) { ifs->connectionLostTime = now; break; } auto duration = std::chrono::duration_cast<Seconds>(now - ifs->connectionLostTime).count(); if (duration >= 10) { incrementalService.mIncrementalManager->showHealthBlockedUI(mountId); } // TODO(b/150411019): handle data loader connection loss break; } case IDataLoaderStatusListener::DATA_LOADER_CONNECTION_OK: { Loading
services/incremental/IncrementalService.h +1 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #include <android-base/strings.h> #include <android-base/unique_fd.h> #include <android/content/pm/DataLoaderParamsParcel.h> #include <android/os/incremental/IIncrementalManager.h> #include <binder/IServiceManager.h> #include <utils/String16.h> #include <utils/StrongPointer.h> Loading Loading @@ -220,7 +219,7 @@ private: // Member variables std::unique_ptr<VoldServiceWrapper> mVold; std::unique_ptr<IncrementalManagerWrapper> mIncrementalManager; std::unique_ptr<DataLoaderManagerWrapper> mDataLoaderManager; std::unique_ptr<IncFsWrapper> mIncFs; const std::string mIncrementalDir; Loading
services/incremental/ServiceWrappers.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ using namespace std::literals; namespace android::os::incremental { static constexpr auto kVoldServiceName = "vold"sv; static constexpr auto kIncrementalManagerName = "incremental"sv; static constexpr auto kDataLoaderManagerName = "dataloader_manager"sv; RealServiceManager::RealServiceManager(sp<IServiceManager> serviceManager) : mServiceManager(std::move(serviceManager)) {} Loading @@ -46,11 +46,11 @@ std::unique_ptr<VoldServiceWrapper> RealServiceManager::getVoldService() { return nullptr; } std::unique_ptr<IncrementalManagerWrapper> RealServiceManager::getIncrementalManager() { sp<IIncrementalManager> manager = RealServiceManager::getRealService<IIncrementalManager>(kIncrementalManagerName); std::unique_ptr<DataLoaderManagerWrapper> RealServiceManager::getDataLoaderManager() { sp<IDataLoaderManager> manager = RealServiceManager::getRealService<IDataLoaderManager>(kDataLoaderManagerName); if (manager) { return std::make_unique<RealIncrementalManager>(manager); return std::make_unique<RealDataLoaderManager>(manager); } return nullptr; } Loading
services/incremental/ServiceWrappers.h +23 −26 Original line number Diff line number Diff line Loading @@ -20,9 +20,10 @@ #include <android-base/unique_fd.h> #include <android/content/pm/DataLoaderParamsParcel.h> #include <android/content/pm/FileSystemControlParcel.h> #include <android/content/pm/IDataLoader.h> #include <android/content/pm/IDataLoaderManager.h> #include <android/content/pm/IDataLoaderStatusListener.h> #include <android/os/IVold.h> #include <android/os/incremental/IIncrementalManager.h> #include <binder/IServiceManager.h> #include <incfs.h> Loading Loading @@ -50,17 +51,16 @@ public: const std::string& targetDir) const = 0; }; class IncrementalManagerWrapper { class DataLoaderManagerWrapper { public: virtual ~IncrementalManagerWrapper() = default; virtual binder::Status prepareDataLoader(MountId mountId, const FileSystemControlParcel& control, virtual ~DataLoaderManagerWrapper() = default; virtual binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) const = 0; virtual binder::Status startDataLoader(MountId mountId, bool* _aidl_return) const = 0; virtual binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const = 0; virtual binder::Status destroyDataLoader(MountId mountId) const = 0; virtual binder::Status showHealthBlockedUI(MountId mountId) const = 0; }; class IncFsWrapper { Loading @@ -82,7 +82,7 @@ class ServiceManagerWrapper { public: virtual ~ServiceManagerWrapper() = default; virtual std::unique_ptr<VoldServiceWrapper> getVoldService() = 0; virtual std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() = 0; virtual std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() = 0; virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0; }; Loading @@ -109,29 +109,26 @@ private: sp<os::IVold> mInterface; }; class RealIncrementalManager : public IncrementalManagerWrapper { class RealDataLoaderManager : public DataLoaderManagerWrapper { public: RealIncrementalManager(const sp<os::incremental::IIncrementalManager> manager) RealDataLoaderManager(const sp<content::pm::IDataLoaderManager> manager) : mInterface(manager) {} ~RealIncrementalManager() = default; binder::Status prepareDataLoader(MountId mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, ~RealDataLoaderManager() = default; binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) const override { return mInterface->prepareDataLoader(mountId, control, params, listener, _aidl_return); return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return); } binder::Status startDataLoader(MountId mountId, bool* _aidl_return) const override { return mInterface->startDataLoader(mountId, _aidl_return); binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const override { return mInterface->getDataLoader(mountId, _aidl_return); } binder::Status destroyDataLoader(MountId mountId) const override { return mInterface->destroyDataLoader(mountId); } binder::Status showHealthBlockedUI(MountId mountId) const override { return mInterface->showHealthBlockedUI(mountId); } private: sp<os::incremental::IIncrementalManager> mInterface; sp<content::pm::IDataLoaderManager> mInterface; }; class RealServiceManager : public ServiceManagerWrapper { Loading @@ -139,7 +136,7 @@ public: RealServiceManager(sp<IServiceManager> serviceManager); ~RealServiceManager() = default; std::unique_ptr<VoldServiceWrapper> getVoldService() override; std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() override; std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() override; std::unique_ptr<IncFsWrapper> getIncFs() override; private: Loading
services/incremental/test/IncrementalServiceTest.cpp +68 −54 Original line number Diff line number Diff line Loading @@ -93,22 +93,35 @@ private: TemporaryFile logFile; }; class MockIncrementalManager : public IncrementalManagerWrapper { class FakeDataLoader : public IDataLoader { public: MOCK_CONST_METHOD5(prepareDataLoader, binder::Status(int32_t mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, IBinder* onAsBinder() override { return nullptr; } binder::Status create(int32_t, const DataLoaderParamsParcel&, const FileSystemControlParcel&, const sp<IDataLoaderStatusListener>&) override { return binder::Status::ok(); } binder::Status start() override { return binder::Status::ok(); } binder::Status stop() override { return binder::Status::ok(); } binder::Status destroy() override { return binder::Status::ok(); } binder::Status prepareImage(const std::vector<InstallationFileParcel>&, const std::vector<std::string>&) override { return binder::Status::ok(); } }; class MockDataLoaderManager : public DataLoaderManagerWrapper { public: MOCK_CONST_METHOD5(initializeDataLoader, binder::Status(int32_t mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return)); MOCK_CONST_METHOD2(startDataLoader, binder::Status(int32_t mountId, bool* _aidl_return)); MOCK_CONST_METHOD2(getDataLoader, binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return)); MOCK_CONST_METHOD1(destroyDataLoader, binder::Status(int32_t mountId)); MOCK_CONST_METHOD3(newFileForDataLoader, binder::Status(int32_t mountId, FileId fileId, const ::std::vector<uint8_t>& metadata)); MOCK_CONST_METHOD1(showHealthBlockedUI, binder::Status(int32_t mountId)); binder::Status prepareDataLoaderOk(int32_t mountId, const FileSystemControlParcel& control, const DataLoaderParamsParcel& params, binder::Status initializeDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params, const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, bool* _aidl_return) { mId = mountId; Loading @@ -117,23 +130,23 @@ public: return binder::Status::ok(); } binder::Status startDataLoaderOk(int32_t mountId, bool* _aidl_return) { *_aidl_return = true; binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) { *_aidl_return = mDataLoader; return binder::Status::ok(); } void prepareDataLoaderFails() { ON_CALL(*this, prepareDataLoader(_, _, _, _, _)) void initializeDataLoaderFails() { ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) .WillByDefault(Return( (binder::Status::fromExceptionCode(1, String8("failed to prepare"))))); } void prepareDataLoaderSuccess() { ON_CALL(*this, prepareDataLoader(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockIncrementalManager::prepareDataLoaderOk)); void initializeDataLoaderSuccess() { ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::initializeDataLoaderOk)); } void startDataLoaderSuccess() { ON_CALL(*this, startDataLoader(_, _)) .WillByDefault(Invoke(this, &MockIncrementalManager::startDataLoaderOk)); void getDataLoaderSuccess() { ON_CALL(*this, getDataLoader(_, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk)); } void setDataLoaderStatusNotReady() { mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); Loading @@ -145,6 +158,7 @@ public: private: int mId; sp<IDataLoaderStatusListener> mListener; sp<IDataLoader> mDataLoader = sp<IDataLoader>(new FakeDataLoader()); }; class MockIncFs : public IncFsWrapper { Loading Loading @@ -197,20 +211,20 @@ public: class MockServiceManager : public ServiceManagerWrapper { public: MockServiceManager(std::unique_ptr<MockVoldService> vold, std::unique_ptr<MockIncrementalManager> manager, std::unique_ptr<MockDataLoaderManager> manager, std::unique_ptr<MockIncFs> incfs) : mVold(std::move(vold)), mIncrementalManager(std::move(manager)), mDataLoaderManager(std::move(manager)), mIncFs(std::move(incfs)) {} std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); } std::unique_ptr<IncrementalManagerWrapper> getIncrementalManager() final { return std::move(mIncrementalManager); std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final { return std::move(mDataLoaderManager); } std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); } private: std::unique_ptr<MockVoldService> mVold; std::unique_ptr<MockIncrementalManager> mIncrementalManager; std::unique_ptr<MockDataLoaderManager> mDataLoaderManager; std::unique_ptr<MockIncFs> mIncFs; }; Loading @@ -221,14 +235,14 @@ public: void SetUp() override { auto vold = std::make_unique<NiceMock<MockVoldService>>(); mVold = vold.get(); auto incrementalManager = std::make_unique<NiceMock<MockIncrementalManager>>(); mIncrementalManager = incrementalManager.get(); auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(); mDataLoaderManager = dataloaderManager.get(); auto incFs = std::make_unique<NiceMock<MockIncFs>>(); mIncFs = incFs.get(); mIncrementalService = std::make_unique<IncrementalService>(MockServiceManager(std::move(vold), std::move( incrementalManager), dataloaderManager), std::move(incFs)), mRootDir.path); mDataLoaderParcel.packageName = "com.test"; Loading Loading @@ -260,7 +274,7 @@ public: protected: NiceMock<MockVoldService>* mVold; NiceMock<MockIncFs>* mIncFs; NiceMock<MockIncrementalManager>* mIncrementalManager; NiceMock<MockDataLoaderManager>* mDataLoaderManager; std::unique_ptr<IncrementalService> mIncrementalService; TemporaryDir mRootDir; DataLoaderParamsParcel mDataLoaderParcel; Loading @@ -268,7 +282,7 @@ protected: TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { mVold->mountIncFsFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -278,7 +292,7 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) { mVold->mountIncFsInvalidControlParcel(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -289,8 +303,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = Loading @@ -303,8 +317,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountFails(); EXPECT_CALL(*mIncrementalManager, prepareDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = Loading @@ -317,8 +331,8 @@ TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderFails(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderFails(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = Loading @@ -331,8 +345,8 @@ TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = Loading @@ -346,31 +360,31 @@ TEST_F(IncrementalServiceTest, testOnStatusNotReady) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); mIncrementalManager->setDataLoaderStatusNotReady(); mDataLoaderManager->setDataLoaderStatusNotReady(); } TEST_F(IncrementalServiceTest, testStartDataLoaderSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); EXPECT_CALL(*mIncrementalManager, destroyDataLoader(_)); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); mIncrementalManager->setDataLoaderStatusReady(); mDataLoaderManager->setDataLoaderStatusReady(); ASSERT_TRUE(mIncrementalService->startLoading(storageId)); } Loading @@ -378,8 +392,8 @@ TEST_F(IncrementalServiceTest, testMakeDirectory) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading @@ -402,8 +416,8 @@ TEST_F(IncrementalServiceTest, testMakeDirectories) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mIncrementalManager->prepareDataLoaderSuccess(); mIncrementalManager->startDataLoaderSuccess(); mDataLoaderManager->initializeDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, Loading