diff options
10 files changed, 195 insertions, 200 deletions
diff --git a/core/java/android/content/pm/DataLoaderManager.java b/core/java/android/content/pm/DataLoaderManager.java index 4a6193888685..e8fb2413bbbe 100644 --- a/core/java/android/content/pm/DataLoaderManager.java +++ b/core/java/android/content/pm/DataLoaderManager.java @@ -41,17 +41,16 @@ public class DataLoaderManager { * @param dataLoaderId ID for the new data loader binder service. * @param params DataLoaderParamsParcel object that contains data loader params, including * its package name, class name, and additional parameters. - * @param control FileSystemControlParcel that contains filesystem control handlers. * @param listener Callback for the data loader service to report status back to the * caller. * @return false if 1) target ID collides with a data loader that is already bound to data * loader manager; 2) package name is not specified; 3) fails to find data loader package; * or 4) fails to bind to the specified data loader service, otherwise return true. */ - public boolean initializeDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params, - @NonNull FileSystemControlParcel control, @NonNull IDataLoaderStatusListener listener) { + public boolean bindToDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params, + @NonNull IDataLoaderStatusListener listener) { try { - return mService.initializeDataLoader(dataLoaderId, params, control, listener); + return mService.bindToDataLoader(dataLoaderId, params, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -70,12 +69,13 @@ public class DataLoaderManager { } /** - * Destroys the data loader binder service and removes it from data loader manager service. + * Unbinds from a data loader binder service, specified by its ID. + * DataLoader will receive destroy notification. */ @Nullable - public void destroyDataLoader(int dataLoaderId) { + public void unbindFromDataLoader(int dataLoaderId) { try { - mService.destroyDataLoader(dataLoaderId); + mService.unbindFromDataLoader(dataLoaderId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/IDataLoaderManager.aidl b/core/java/android/content/pm/IDataLoaderManager.aidl index 1336f7229ee7..93b3de7897c4 100644 --- a/core/java/android/content/pm/IDataLoaderManager.aidl +++ b/core/java/android/content/pm/IDataLoaderManager.aidl @@ -23,8 +23,8 @@ import android.content.pm.IDataLoaderStatusListener; /** @hide */ interface IDataLoaderManager { - boolean initializeDataLoader(int id, in DataLoaderParamsParcel params, - in FileSystemControlParcel control, IDataLoaderStatusListener listener); + boolean bindToDataLoader(int id, in DataLoaderParamsParcel params, + IDataLoaderStatusListener listener); IDataLoader getDataLoader(int dataLoaderId); - void destroyDataLoader(int dataLoaderId); -}
\ No newline at end of file + void unbindFromDataLoader(int dataLoaderId); +} diff --git a/core/java/android/content/pm/IDataLoaderStatusListener.aidl b/core/java/android/content/pm/IDataLoaderStatusListener.aidl index ffe8b183e926..24a62c5638ec 100644 --- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl +++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl @@ -21,30 +21,30 @@ package android.content.pm; * @hide */ oneway interface IDataLoaderStatusListener { - /** When this status is returned from DataLoader, it means that the DataLoader - * process is running, bound to and has handled onCreate(). */ - const int DATA_LOADER_CREATED = 0; - /** Listener will receive this status when the DataLoader process died, - * binder disconnected or class destroyed. */ - const int DATA_LOADER_DESTROYED = 1; + /** The DataLoader process died, binder disconnected or class destroyed. */ + const int DATA_LOADER_DESTROYED = 0; + /** DataLoader process is running and bound to. */ + const int DATA_LOADER_BOUND = 1; + /** DataLoader has handled onCreate(). */ + const int DATA_LOADER_CREATED = 2; /** DataLoader can receive missing pages and read pages notifications, * and ready to provide data. */ - const int DATA_LOADER_STARTED = 2; + const int DATA_LOADER_STARTED = 3; /** DataLoader no longer ready to provide data and is not receiving * any notifications from IncFS. */ - const int DATA_LOADER_STOPPED = 3; + const int DATA_LOADER_STOPPED = 4; /** DataLoader streamed everything necessary to continue installation. */ - const int DATA_LOADER_IMAGE_READY = 4; + const int DATA_LOADER_IMAGE_READY = 5; /** Installation can't continue as DataLoader failed to stream necessary data. */ - const int DATA_LOADER_IMAGE_NOT_READY = 5; + const int DATA_LOADER_IMAGE_NOT_READY = 6; /** DataLoader reports that this instance is invalid and can never be restored. * Warning: this is a terminal status that data loader should use carefully and * the system should almost never use - e.g. only if all recovery attempts * fail and all retry limits are exceeded. */ - const int DATA_LOADER_UNRECOVERABLE = 6; + const int DATA_LOADER_UNRECOVERABLE = 7; /** Data loader status callback */ void onStatusChanged(in int dataLoaderId, in int status); diff --git a/services/core/java/com/android/server/pm/DataLoaderManagerService.java b/services/core/java/com/android/server/pm/DataLoaderManagerService.java index 062e9e15b519..dec3f1a86e01 100644 --- a/services/core/java/com/android/server/pm/DataLoaderManagerService.java +++ b/services/core/java/com/android/server/pm/DataLoaderManagerService.java @@ -23,7 +23,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.DataLoaderParamsParcel; -import android.content.pm.FileSystemControlParcel; import android.content.pm.IDataLoader; import android.content.pm.IDataLoaderManager; import android.content.pm.IDataLoaderStatusListener; @@ -35,11 +34,8 @@ import android.os.UserHandle; import android.util.Slog; import android.util.SparseArray; -import com.android.internal.annotations.GuardedBy; import com.android.server.SystemService; -import libcore.io.IoUtils; - import java.util.List; /** @@ -51,8 +47,6 @@ public class DataLoaderManagerService extends SystemService { private static final String TAG = "DataLoaderManager"; private final Context mContext; private final DataLoaderManagerBinderService mBinderService; - private final Object mLock = new Object(); - @GuardedBy("mLock") private SparseArray<DataLoaderServiceConnection> mServiceConnections = new SparseArray<>(); public DataLoaderManagerService(Context context) { @@ -66,53 +60,35 @@ public class DataLoaderManagerService extends SystemService { publishBinderService(Context.DATA_LOADER_MANAGER_SERVICE, mBinderService); } - private static void closeQuietly(FileSystemControlParcel control) { - if (control == null || control.incremental == null) { - return; - } - IoUtils.closeQuietly(control.incremental.cmd); - IoUtils.closeQuietly(control.incremental.pendingReads); - IoUtils.closeQuietly(control.incremental.log); - } - final class DataLoaderManagerBinderService extends IDataLoaderManager.Stub { @Override - public boolean initializeDataLoader(int dataLoaderId, DataLoaderParamsParcel params, - FileSystemControlParcel control, IDataLoaderStatusListener listener) { - DataLoaderServiceConnection connection = null; - try { - synchronized (mLock) { - if (mServiceConnections.get(dataLoaderId) != null) { - Slog.e(TAG, "Data loader of ID=" + dataLoaderId + " already exists."); - return false; - } - } - ComponentName componentName = - new ComponentName(params.packageName, params.className); - ComponentName dataLoaderComponent = resolveDataLoaderComponentName(componentName); - if (dataLoaderComponent == null) { - return false; - } - // Binds to the specific data loader service - connection = - new DataLoaderServiceConnection(dataLoaderId, params, - control, listener); - control = null; // now connection manages it - Intent intent = new Intent(); - intent.setComponent(dataLoaderComponent); - if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE, - UserHandle.of(UserHandle.getCallingUserId()))) { - Slog.e(TAG, "Failed to bind to data loader binder service."); - mContext.unbindService(connection); - return false; - } - connection = null; - } finally { - DataLoaderManagerService.closeQuietly(control); - if (connection != null) { - connection.close(); + public boolean bindToDataLoader(int dataLoaderId, DataLoaderParamsParcel params, + IDataLoaderStatusListener listener) { + synchronized (mServiceConnections) { + if (mServiceConnections.get(dataLoaderId) != null) { + return true; } } + ComponentName componentName = new ComponentName(params.packageName, params.className); + ComponentName dataLoaderComponent = resolveDataLoaderComponentName(componentName); + if (dataLoaderComponent == null) { + Slog.e(TAG, "Invalid component: " + componentName + " for ID=" + dataLoaderId); + return false; + } + + // Binds to the specific data loader service. + DataLoaderServiceConnection connection = new DataLoaderServiceConnection(dataLoaderId, + listener); + + Intent intent = new Intent(); + intent.setComponent(dataLoaderComponent); + if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE, + UserHandle.of(UserHandle.getCallingUserId()))) { + Slog.e(TAG, + "Failed to bind to: " + dataLoaderComponent + " for ID=" + dataLoaderId); + mContext.unbindService(connection); + return false; + } return true; } @@ -169,7 +145,7 @@ public class DataLoaderManagerService extends SystemService { */ @Override public @Nullable IDataLoader getDataLoader(int dataLoaderId) { - synchronized (mLock) { + synchronized (mServiceConnections) { DataLoaderServiceConnection serviceConnection = mServiceConnections.get( dataLoaderId, null); if (serviceConnection == null) { @@ -180,14 +156,14 @@ public class DataLoaderManagerService extends SystemService { } /** - * Destroys a data loader binder service, specified by its ID. + * Unbinds from a data loader binder service, specified by its ID. DataLoader will receive + * destroy notification. */ @Override - public void destroyDataLoader(int dataLoaderId) { - synchronized (mLock) { + public void unbindFromDataLoader(int dataLoaderId) { + synchronized (mServiceConnections) { DataLoaderServiceConnection serviceConnection = mServiceConnections.get( dataLoaderId, null); - if (serviceConnection == null) { return; } @@ -196,18 +172,13 @@ public class DataLoaderManagerService extends SystemService { } } - class DataLoaderServiceConnection implements ServiceConnection, AutoCloseable { + private class DataLoaderServiceConnection implements ServiceConnection { final int mId; - final DataLoaderParamsParcel mParams; - final FileSystemControlParcel mControl; final IDataLoaderStatusListener mListener; IDataLoader mDataLoader; - DataLoaderServiceConnection(int id, DataLoaderParamsParcel params, - FileSystemControlParcel control, IDataLoaderStatusListener listener) { + DataLoaderServiceConnection(int id, IDataLoaderStatusListener listener) { mId = id; - mParams = params; - mControl = control; mListener = listener; mDataLoader = null; } @@ -215,44 +186,40 @@ public class DataLoaderManagerService extends SystemService { @Override public void onServiceConnected(ComponentName className, IBinder service) { mDataLoader = IDataLoader.Stub.asInterface(service); - synchronized (mLock) { - mServiceConnections.append(mId, this); + if (mDataLoader == null) { + onNullBinding(className); + return; } - try { - mDataLoader.create(mId, mParams, mControl, mListener); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to create data loader service.", e); + synchronized (mServiceConnections) { + if (mServiceConnections.get(mId) != null) { + // Another connection already bound for this ID. + mContext.unbindService(this); + return; + } + mServiceConnections.append(mId, this); } + callListener(IDataLoaderStatusListener.DATA_LOADER_BOUND); } @Override public void onServiceDisconnected(ComponentName arg0) { Slog.i(TAG, "DataLoader " + mId + " disconnected, but will try to recover"); callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - remove(); + destroy(); } @Override public void onBindingDied(ComponentName name) { Slog.i(TAG, "DataLoader " + mId + " died"); callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - mContext.unbindService(this); - close(); - remove(); + destroy(); } @Override public void onNullBinding(ComponentName name) { Slog.i(TAG, "DataLoader " + mId + " failed to start"); callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - mContext.unbindService(this); - close(); - remove(); - } - - @Override - public void close() { - DataLoaderManagerService.closeQuietly(mControl); + destroy(); } IDataLoader getDataLoader() { @@ -260,17 +227,19 @@ public class DataLoaderManagerService extends SystemService { } void destroy() { - try { - mDataLoader.destroy(mId); - } catch (RemoteException ignored) { + if (mDataLoader != null) { + try { + mDataLoader.destroy(mId); + } catch (RemoteException ignored) { + } + mDataLoader = null; } mContext.unbindService(this); - close(); remove(); } private void remove() { - synchronized (mLock) { + synchronized (mServiceConnections) { mServiceConnections.remove(mId); } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 6b1ef3acdf61..8e7eaf6e29fa 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -2601,8 +2601,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { "Failed to find data loader manager service"); } + final DataLoaderParams params = this.params.dataLoaderParams; final boolean manualStartAndDestroy = !isIncrementalInstallation(); - IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() { + final IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() { @Override public void onStatusChanged(int dataLoaderId, int status) { switch (status) { @@ -2629,6 +2630,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } switch (status) { + case IDataLoaderStatusListener.DATA_LOADER_BOUND: { + if (manualStartAndDestroy) { + FileSystemControlParcel control = new FileSystemControlParcel(); + control.callback = new FileSystemConnector(addedFiles); + dataLoader.create(dataLoaderId, params.getData(), control, this); + } + + break; + } case IDataLoaderStatusListener.DATA_LOADER_CREATED: { if (manualStartAndDestroy) { // IncrementalFileStorages will call start after all files are @@ -2680,8 +2690,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (!manualStartAndDestroy) { try { - mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext, - stageDir, params.dataLoaderParams, listener, addedFiles); + mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext, stageDir, + params, listener, addedFiles); return false; } catch (IOException e) { throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE, e.getMessage(), @@ -2689,13 +2699,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } - final FileSystemConnector connector = new FileSystemConnector(addedFiles); - final FileSystemControlParcel control = new FileSystemControlParcel(); - control.callback = connector; - - final DataLoaderParams params = this.params.dataLoaderParams; - if (!dataLoaderManager.initializeDataLoader( - sessionId, params.getData(), control, listener)) { + if (!dataLoaderManager.bindToDataLoader( + sessionId, params.getData(), listener)) { throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE, "Failed to initialize data loader"); } diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index a6c45cc6c26f..a1b4f2442153 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1709,12 +1709,30 @@ bool IncrementalService::DataLoaderStub::waitForStatus(int status, Clock::durati [this, status] { return mCurrentStatus == status; }); } +bool IncrementalService::DataLoaderStub::bind() { + bool result = false; + auto status = mService.mDataLoaderManager->bindToDataLoader(mId, mParams, this, &result); + if (!status.isOk() || !result) { + LOG(ERROR) << "Failed to bind a data loader for mount " << mId; + return false; + } + return true; +} + bool IncrementalService::DataLoaderStub::create() { - bool created = false; - auto status = mService.mDataLoaderManager->initializeDataLoader(mId, mParams, mControl, this, - &created); - if (!status.isOk() || !created) { - LOG(ERROR) << "Failed to create a data loader for mount " << mId; + sp<IDataLoader> dataloader; + auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader); + if (!status.isOk()) { + LOG(ERROR) << "Failed to get dataloader: " << status.toString8(); + return false; + } + if (!dataloader) { + LOG(ERROR) << "DataLoader is null: " << status.toString8(); + return false; + } + status = dataloader->create(mId, mParams, mControl, this); + if (!status.isOk()) { + LOG(ERROR) << "Failed to start DataLoader: " << status.toString8(); return false; } return true; @@ -1740,7 +1758,7 @@ bool IncrementalService::DataLoaderStub::start() { } bool IncrementalService::DataLoaderStub::destroy() { - mService.mDataLoaderManager->destroyDataLoader(mId); + mService.mDataLoaderManager->unbindFromDataLoader(mId); return true; } @@ -1776,6 +1794,8 @@ bool IncrementalService::DataLoaderStub::fsmStep() { case IDataLoaderStatusListener::DATA_LOADER_CREATED: switch (currentStatus) { case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: + return bind(); + case IDataLoaderStatusListener::DATA_LOADER_BOUND: return create(); } break; diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index 0a18e21e9d6d..1de00700cad0 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -180,6 +180,7 @@ private: bool isValid() const { return mId != kInvalidStorageId; } + bool bind(); bool create(); bool start(); bool destroy(); diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp index 1e8c3a1f814b..85f744152ea4 100644 --- a/services/incremental/ServiceWrappers.cpp +++ b/services/incremental/ServiceWrappers.cpp @@ -65,19 +65,18 @@ public: RealDataLoaderManager(sp<content::pm::IDataLoaderManager> manager) : mInterface(std::move(manager)) {} ~RealDataLoaderManager() = default; - binder::Status initializeDataLoader(MountId mountId, - const content::pm::DataLoaderParamsParcel& params, - const content::pm::FileSystemControlParcel& control, - const sp<content::pm::IDataLoaderStatusListener>& listener, - bool* _aidl_return) const final { - return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return); + binder::Status bindToDataLoader(MountId mountId, + const content::pm::DataLoaderParamsParcel& params, + const sp<content::pm::IDataLoaderStatusListener>& listener, + bool* _aidl_return) const final { + return mInterface->bindToDataLoader(mountId, params, listener, _aidl_return); } binder::Status getDataLoader(MountId mountId, sp<content::pm::IDataLoader>* _aidl_return) const final { return mInterface->getDataLoader(mountId, _aidl_return); } - binder::Status destroyDataLoader(MountId mountId) const final { - return mInterface->destroyDataLoader(mountId); + binder::Status unbindFromDataLoader(MountId mountId) const final { + return mInterface->unbindFromDataLoader(mountId); } private: diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h index 6b0f59e9c3e5..37928308b506 100644 --- a/services/incremental/ServiceWrappers.h +++ b/services/incremental/ServiceWrappers.h @@ -55,13 +55,12 @@ public: class DataLoaderManagerWrapper { public: virtual ~DataLoaderManagerWrapper() = default; - virtual binder::Status initializeDataLoader( + virtual binder::Status bindToDataLoader( MountId mountId, const content::pm::DataLoaderParamsParcel& params, - const content::pm::FileSystemControlParcel& control, const sp<content::pm::IDataLoaderStatusListener>& listener, bool* result) const = 0; virtual binder::Status getDataLoader(MountId mountId, sp<content::pm::IDataLoader>* result) const = 0; - virtual binder::Status destroyDataLoader(MountId mountId) const = 0; + virtual binder::Status unbindFromDataLoader(MountId mountId) const = 0; }; class IncFsWrapper { diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index 7a8560221beb..2205bfed15d1 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -131,18 +131,19 @@ public: .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus)); } - binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel&, - const content::pm::FileSystemControlParcel&, + binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params, + const content::pm::FileSystemControlParcel& control, const sp<content::pm::IDataLoaderStatusListener>& listener) { - mListener = 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&, - const content::pm::FileSystemControlParcel&, + 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(); } @@ -173,8 +174,15 @@ public: } 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; }; @@ -184,21 +192,20 @@ public: EXPECT_TRUE(mDataLoaderHolder != nullptr); } - MOCK_CONST_METHOD5(initializeDataLoader, + 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"))))); } @@ -206,20 +213,21 @@ public: ON_CALL(*this, getDataLoader(_, _)) .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk)); } - void destroyDataLoaderSuccess() { - ON_CALL(*this, destroyDataLoader(_)) - .WillByDefault(Invoke(this, &MockDataLoaderManager::destroyDataLoaderOk)); + 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; - return mDataLoader->create(mountId, params, control, listener); + 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; @@ -234,7 +242,7 @@ public: void setDataLoaderStatusDestroyed() { mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); } - binder::Status destroyDataLoaderOk(int32_t id) { + binder::Status unbindFromDataLoaderOk(int32_t id) { if (mDataLoader) { if (auto status = mDataLoader->destroy(id); !status.isOk()) { return status; @@ -246,17 +254,10 @@ public: } 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> mDataLoaderHolder; }; @@ -403,7 +404,7 @@ public: mRootDir.path); mDataLoaderParcel.packageName = "com.test"; mDataLoaderParcel.arguments = "uri"; - mDataLoaderManager->destroyDataLoaderSuccess(); + mDataLoaderManager->unbindFromDataLoaderSuccess(); mIncrementalService->onSystemReady(); } @@ -442,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), {}, @@ -452,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), {}, @@ -464,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 = @@ -478,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 = @@ -492,9 +493,9 @@ TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderFails(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0); + 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); @@ -510,9 +511,10 @@ TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1); - 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); @@ -529,10 +531,10 @@ TEST_F(IncrementalServiceTest, testDataLoaderDestroyed) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(2); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1); + 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); @@ -551,10 +553,10 @@ TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) { mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mDataLoader->initializeCreateOkNoStatus(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1); + 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); @@ -574,10 +576,10 @@ TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) { mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); mDataLoader->initializeCreateOkNoStatus(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); - EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(2); - EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1); + 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); @@ -596,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); @@ -612,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) { @@ -620,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); @@ -639,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, {}); } @@ -648,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); @@ -662,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) { @@ -670,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); @@ -685,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 = @@ -716,7 +718,7 @@ TEST_F(IncrementalServiceTest, testMakeDirectories) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); mVold->bindMountSuccess(); - mDataLoaderManager->initializeDataLoaderSuccess(); + mDataLoaderManager->bindToDataLoaderSuccess(); mDataLoaderManager->getDataLoaderSuccess(); TemporaryDir tempDir; int storageId = |