diff options
Diffstat (limited to 'services/incremental/test/IncrementalServiceTest.cpp')
-rw-r--r-- | services/incremental/test/IncrementalServiceTest.cpp | 321 |
1 files changed, 217 insertions, 104 deletions
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index 117dca8c37b3..2205bfed15d1 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -25,6 +25,7 @@ #include <future> #include "IncrementalService.h" +#include "IncrementalServiceValidation.h" #include "Metadata.pb.h" #include "ServiceWrappers.h" @@ -103,40 +104,108 @@ private: TemporaryFile logFile; }; -class FakeDataLoader : public IDataLoader { +class MockDataLoader : public IDataLoader { public: + MockDataLoader() { + ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk)); + ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk)); + ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk)); + ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk)); + ON_CALL(*this, prepareImage(_, _, _)) + .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk)); + } IBinder* onAsBinder() override { return nullptr; } - binder::Status create(int32_t, const DataLoaderParamsParcel&, const FileSystemControlParcel&, - const sp<IDataLoaderStatusListener>&) override { + MOCK_METHOD4(create, + binder::Status(int32_t id, const DataLoaderParamsParcel& params, + const FileSystemControlParcel& control, + const sp<IDataLoaderStatusListener>& listener)); + MOCK_METHOD1(start, binder::Status(int32_t id)); + MOCK_METHOD1(stop, binder::Status(int32_t id)); + MOCK_METHOD1(destroy, binder::Status(int32_t id)); + MOCK_METHOD3(prepareImage, + binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles, + const std::vector<std::string>& removedFiles)); + + void initializeCreateOkNoStatus() { + ON_CALL(*this, create(_, _, _, _)) + .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus)); + } + + binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params, + const content::pm::FileSystemControlParcel& control, + const sp<content::pm::IDataLoaderStatusListener>& listener) { + createOkNoStatus(id, params, control, listener); + if (mListener) { + mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_CREATED); + } + return binder::Status::ok(); + } + binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params, + const content::pm::FileSystemControlParcel& control, + const sp<content::pm::IDataLoaderStatusListener>& listener) { + mServiceConnector = control.service; + mListener = listener; + return binder::Status::ok(); + } + binder::Status startOk(int32_t id) { + if (mListener) { + mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STARTED); + } + return binder::Status::ok(); + } + binder::Status stopOk(int32_t id) { + if (mListener) { + mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED); + } + return binder::Status::ok(); + } + binder::Status destroyOk(int32_t id) { + if (mListener) { + mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); + } + mListener = nullptr; return binder::Status::ok(); } - binder::Status start(int32_t) override { return binder::Status::ok(); } - binder::Status stop(int32_t) override { return binder::Status::ok(); } - binder::Status destroy(int32_t) override { return binder::Status::ok(); } - binder::Status prepareImage(int32_t, - const std::vector<InstallationFileParcel>&, - const std::vector<std::string>&) override { + binder::Status prepareImageOk(int32_t id, + const ::std::vector<content::pm::InstallationFileParcel>&, + const ::std::vector<::std::string>&) { + if (mListener) { + mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY); + } return binder::Status::ok(); } + int32_t setStorageParams(bool enableReadLogs) { + int32_t result = -1; + EXPECT_NE(mServiceConnector.get(), nullptr); + EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk()); + return result; + } + +private: + sp<IIncrementalServiceConnector> mServiceConnector; + sp<IDataLoaderStatusListener> mListener; }; class MockDataLoaderManager : public DataLoaderManagerWrapper { public: - MOCK_CONST_METHOD5(initializeDataLoader, + MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) { + EXPECT_TRUE(mDataLoaderHolder != nullptr); + } + + MOCK_CONST_METHOD4(bindToDataLoader, binder::Status(int32_t mountId, const DataLoaderParamsParcel& params, - const FileSystemControlParcel& control, const sp<IDataLoaderStatusListener>& listener, 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_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId)); - void initializeDataLoaderSuccess() { - ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) - .WillByDefault(Invoke(this, &MockDataLoaderManager::initializeDataLoaderOk)); + void bindToDataLoaderSuccess() { + ON_CALL(*this, bindToDataLoader(_, _, _, _)) + .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk)); } - void initializeDataLoaderFails() { - ON_CALL(*this, initializeDataLoader(_, _, _, _, _)) + void bindToDataLoaderFails() { + ON_CALL(*this, bindToDataLoader(_, _, _, _)) .WillByDefault(Return( (binder::Status::fromExceptionCode(1, String8("failed to prepare"))))); } @@ -144,57 +213,66 @@ public: ON_CALL(*this, getDataLoader(_, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk)); } - void destroyDataLoaderOk() { - ON_CALL(*this, destroyDataLoader(_)) - .WillByDefault(Invoke(this, &MockDataLoaderManager::setDataLoaderStatusDestroyed)); + void unbindFromDataLoaderSuccess() { + ON_CALL(*this, unbindFromDataLoader(_)) + .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk)); } - binder::Status initializeDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params, - const FileSystemControlParcel& control, - const sp<IDataLoaderStatusListener>& listener, - bool* _aidl_return) { + binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params, + const sp<IDataLoaderStatusListener>& listener, + bool* _aidl_return) { mId = mountId; mListener = listener; - mServiceConnector = control.service; + mDataLoader = mDataLoaderHolder; *_aidl_return = true; + if (mListener) { + mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND); + } return binder::Status::ok(); } binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) { *_aidl_return = mDataLoader; return binder::Status::ok(); } - void setDataLoaderStatusNotReady() { - mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); - } - void setDataLoaderStatusReady() { + void setDataLoaderStatusCreated() { mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED); } - binder::Status setDataLoaderStatusDestroyed(int32_t id) { + void setDataLoaderStatusStarted() { + mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED); + } + void setDataLoaderStatusDestroyed() { + mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); + } + binder::Status unbindFromDataLoaderOk(int32_t id) { + if (mDataLoader) { + if (auto status = mDataLoader->destroy(id); !status.isOk()) { + return status; + } + mDataLoader = nullptr; + } if (mListener) { mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); } return binder::Status::ok(); } - int32_t setStorageParams(bool enableReadLogs) { - int32_t result = -1; - EXPECT_NE(mServiceConnector.get(), nullptr); - EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk()); - return result; - } private: int mId; sp<IDataLoaderStatusListener> mListener; - sp<IIncrementalServiceConnector> mServiceConnector; - sp<IDataLoader> mDataLoader = sp<IDataLoader>(new FakeDataLoader()); + sp<IDataLoader> mDataLoader; + sp<IDataLoader> mDataLoaderHolder; }; class MockIncFs : public IncFsWrapper { public: + MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb)); + MOCK_CONST_METHOD1(openMount, Control(std::string_view path)); MOCK_CONST_METHOD3(createControl, Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs)); MOCK_CONST_METHOD5(makeFile, ErrorCode(const Control& control, std::string_view path, int mode, FileId id, NewFileParams params)); MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode)); + MOCK_CONST_METHOD3(makeDirs, + ErrorCode(const Control& control, std::string_view path, int mode)); MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid)); MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path)); MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path)); @@ -202,10 +280,13 @@ public: ErrorCode(const Control& control, std::string_view from, std::string_view to)); MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path)); MOCK_CONST_METHOD2(openForSpecialOps, base::unique_fd(const Control& control, FileId id)); - MOCK_CONST_METHOD1(writeBlocks, ErrorCode(Span<const DataBlock> blocks)); + MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks)); + + MockIncFs() { ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return()); } void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); } void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); } + RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) { metadata::Mount m; m.mutable_storage()->set_id(100); @@ -303,7 +384,9 @@ public: void SetUp() override { auto vold = std::make_unique<NiceMock<MockVoldService>>(); mVold = vold.get(); - auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(); + sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>}; + mDataLoader = dataLoader.get(); + auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader); mDataLoaderManager = dataloaderManager.get(); auto incFs = std::make_unique<NiceMock<MockIncFs>>(); mIncFs = incFs.get(); @@ -321,7 +404,7 @@ public: mRootDir.path); mDataLoaderParcel.packageName = "com.test"; mDataLoaderParcel.arguments = "uri"; - mDataLoaderManager->destroyDataLoaderOk(); + mDataLoaderManager->unbindFromDataLoaderSuccess(); mIncrementalService->onSystemReady(); } @@ -352,6 +435,7 @@ protected: NiceMock<MockDataLoaderManager>* mDataLoaderManager; NiceMock<MockAppOpsManager>* mAppOpsManager; NiceMock<MockJniWrapper>* mJni; + NiceMock<MockDataLoader>* mDataLoader; std::unique_ptr<IncrementalService> mIncrementalService; TemporaryDir mRootDir; DataLoaderParamsParcel mDataLoaderParcel; @@ -359,7 +443,7 @@ protected: TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { mVold->mountIncFsFails(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, @@ -369,8 +453,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) { TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) { mVold->mountIncFsInvalidControlParcel(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, @@ -381,8 +465,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileFails(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = @@ -395,8 +479,8 @@ TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountFails(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0); EXPECT_CALL(*mVold, unmountIncFs(_)); TemporaryDir tempDir; int storageId = @@ -409,8 +493,12 @@ TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderFails(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1); + mDataLoaderManager->bindToDataLoaderFails(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0); + EXPECT_CALL(*mDataLoader, start(_)).Times(0); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(0); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = @@ -423,8 +511,13 @@ TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1); + mDataLoaderManager->bindToDataLoaderSuccess(); + mDataLoaderManager->getDataLoaderSuccess(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoader, start(_)).Times(0); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = @@ -434,36 +527,70 @@ TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) { mIncrementalService->deleteStorage(storageId); } -TEST_F(IncrementalServiceTest, testOnStatusNotReady) { +TEST_F(IncrementalServiceTest, testDataLoaderDestroyed) { + mVold->mountIncFsSuccess(); + mIncFs->makeFileSuccess(); + mVold->bindMountSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); + mDataLoaderManager->getDataLoaderSuccess(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2); + EXPECT_CALL(*mDataLoader, start(_)).Times(0); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); + EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); + TemporaryDir tempDir; + int storageId = + mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, + IncrementalService::CreateOptions::CreateNew); + ASSERT_GE(storageId, 0); + // Simulated crash/other connection breakage. + mDataLoaderManager->setDataLoaderStatusDestroyed(); +} + +TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + mDataLoader->initializeCreateOkNoStatus(); + mDataLoaderManager->bindToDataLoaderSuccess(); + mDataLoaderManager->getDataLoaderSuccess(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoader, start(_)).Times(1); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - mDataLoaderManager->setDataLoaderStatusNotReady(); + mDataLoaderManager->setDataLoaderStatusCreated(); + ASSERT_TRUE(mIncrementalService->startLoading(storageId)); + mDataLoaderManager->setDataLoaderStatusStarted(); } -TEST_F(IncrementalServiceTest, testStartDataLoaderSuccess) { +TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoader->initializeCreateOkNoStatus(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2); + EXPECT_CALL(*mDataLoader, start(_)).Times(1); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); TemporaryDir tempDir; int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - mDataLoaderManager->setDataLoaderStatusReady(); ASSERT_TRUE(mIncrementalService->startLoading(storageId)); + mDataLoaderManager->setDataLoaderStatusCreated(); } TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) { @@ -471,10 +598,10 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) { mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mVold->setIncFsMountOptionsSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); mAppOpsManager->checkPermissionSuccess(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); // We are calling setIncFsMountOptions(true). EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1); @@ -487,7 +614,7 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) { mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0); + ASSERT_GE(mDataLoader->setStorageParams(true), 0); } TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) { @@ -495,11 +622,11 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChang mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mVold->setIncFsMountOptionsSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); mAppOpsManager->checkPermissionSuccess(); mAppOpsManager->initializeStartWatchingMode(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); // We are calling setIncFsMountOptions(true). EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1); @@ -514,7 +641,7 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChang mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0); + ASSERT_GE(mDataLoader->setStorageParams(true), 0); ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get()); mAppOpsManager->mStoredCallback->opChanged(0, {}); } @@ -523,10 +650,10 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); mAppOpsManager->checkPermissionFails(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); // checkPermission fails, no calls to set opitions, start or stop WatchingMode. EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0); @@ -537,7 +664,7 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) { mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0); + ASSERT_LT(mDataLoader->setStorageParams(true), 0); } TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) { @@ -545,10 +672,10 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) { mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mVold->setIncFsMountOptionsFails(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); mAppOpsManager->checkPermissionSuccess(); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)); EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); // We are calling setIncFsMountOptions. EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1); @@ -560,14 +687,14 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) { mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, IncrementalService::CreateOptions::CreateNew); ASSERT_GE(storageId, 0); - ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0); + ASSERT_LT(mDataLoader->setStorageParams(true), 0); } TEST_F(IncrementalServiceTest, testMakeDirectory) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = @@ -575,14 +702,14 @@ TEST_F(IncrementalServiceTest, testMakeDirectory) { IncrementalService::CreateOptions::CreateNew); std::string dir_path("test"); - std::string tempPath(tempDir.path); - std::replace(tempPath.begin(), tempPath.end(), '/', '_'); - std::string mount_dir = std::string(mRootDir.path) + "/MT_" + tempPath.substr(1); - std::string normalized_dir_path = mount_dir + "/mount/st_1_0/" + dir_path; - // Expecting incfs to call makeDir on a path like: - // /data/local/tmp/TemporaryDir-06yixG/data_local_tmp_TemporaryDir-xwdFhT/mount/st_1_0/test - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _)); + // <root>/*/mount/<storage>/test + EXPECT_CALL(*mIncFs, + makeDir(_, Truly([&](std::string_view arg) { + return arg.starts_with(mRootDir.path) && + arg.ends_with("/mount/st_1_0/" + dir_path); + }), + _)); auto res = mIncrementalService->makeDir(storageId, dir_path, 0555); ASSERT_EQ(res, 0); } @@ -591,7 +718,7 @@ TEST_F(IncrementalServiceTest, testMakeDirectories) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = @@ -600,29 +727,15 @@ TEST_F(IncrementalServiceTest, testMakeDirectories) { auto first = "first"sv; auto second = "second"sv; auto third = "third"sv; - - std::string tempPath(tempDir.path); - std::replace(tempPath.begin(), tempPath.end(), '/', '_'); - std::string mount_dir = std::string(mRootDir.path) + "/MT_" + tempPath.substr(1); - - InSequence seq; - auto parent_path = std::string(first) + "/" + std::string(second); - auto dir_path = parent_path + "/" + std::string(third); - - std::string normalized_first_path = mount_dir + "/mount/st_1_0/" + std::string(first); - std::string normalized_parent_path = mount_dir + "/mount/st_1_0/" + parent_path; - std::string normalized_dir_path = mount_dir + "/mount/st_1_0/" + dir_path; - - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _)) - .WillOnce(Return(-ENOENT)); - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_parent_path), _)) - .WillOnce(Return(-ENOENT)); - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_first_path), _)) - .WillOnce(Return(0)); - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_parent_path), _)) - .WillOnce(Return(0)); - EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _)).WillOnce(Return(0)); - auto res = mIncrementalService->makeDirs(storageId, normalized_dir_path, 0555); + auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third); + + EXPECT_CALL(*mIncFs, + makeDirs(_, Truly([&](std::string_view arg) { + return arg.starts_with(mRootDir.path) && + arg.ends_with("/mount/st_1_0/" + dir_path); + }), + _)); + auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555); ASSERT_EQ(res, 0); } } // namespace android::os::incremental |