Keep only service binding in DataLoaderManager.
This simplifies:
- resource management - no extra copies of controls,
- state management - all states in one place, no more hidden (bound but
not created) state.
Bug: b/153874006
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest
Change-Id: I3d16a099c7f42fcf14637c5a8e96bd6f99e073d1
diff --git a/core/java/android/content/pm/DataLoaderManager.java b/core/java/android/content/pm/DataLoaderManager.java
index 4a61938..e8fb241 100644
--- a/core/java/android/content/pm/DataLoaderManager.java
+++ b/core/java/android/content/pm/DataLoaderManager.java
@@ -41,17 +41,16 @@
* @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 @@
}
/**
- * 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 1336f72..93b3de7 100644
--- a/core/java/android/content/pm/IDataLoaderManager.aidl
+++ b/core/java/android/content/pm/IDataLoaderManager.aidl
@@ -23,8 +23,8 @@
/** @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 ffe8b18..24a62c5 100644
--- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl
+++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
@@ -21,30 +21,30 @@
* @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 062e9e1..dec3f1a 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.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.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 @@
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,52 +60,34 @@
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;
- }
+ 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) {
- 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();
- }
+ }
+ 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 @@
*/
@Override
public @Nullable IDataLoader getDataLoader(int dataLoaderId) {
- synchronized (mLock) {
+ synchronized (mServiceConnections) {
DataLoaderServiceConnection serviceConnection = mServiceConnections.get(
dataLoaderId, null);
if (serviceConnection == null) {
@@ -180,14 +156,14 @@
}
/**
- * 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 @@
}
}
- 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 @@
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mDataLoader = IDataLoader.Stub.asInterface(service);
- synchronized (mLock) {
+ if (mDataLoader == null) {
+ onNullBinding(className);
+ return;
+ }
+ synchronized (mServiceConnections) {
+ if (mServiceConnections.get(mId) != null) {
+ // Another connection already bound for this ID.
+ mContext.unbindService(this);
+ return;
+ }
mServiceConnections.append(mId, this);
}
- try {
- mDataLoader.create(mId, mParams, mControl, mListener);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to create data loader service.", e);
- }
+ 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 @@
}
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 6b1ef3a..8e7eaf6 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 @@
"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 @@
}
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 @@
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 @@
}
}
- 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 a6c45cc..a1b4f24 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -1709,12 +1709,30 @@
[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::destroy() {
- mService.mDataLoaderManager->destroyDataLoader(mId);
+ mService.mDataLoaderManager->unbindFromDataLoader(mId);
return true;
}
@@ -1776,6 +1794,8 @@
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 0a18e21..1de0070 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -180,6 +180,7 @@
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 1e8c3a1..85f7441 100644
--- a/services/incremental/ServiceWrappers.cpp
+++ b/services/incremental/ServiceWrappers.cpp
@@ -65,19 +65,18 @@
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 6b0f59e..3792830 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -55,13 +55,12 @@
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 7a85602..2205bfe 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -131,18 +131,19 @@
.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 @@
}
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 @@
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 @@
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 @@
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 @@
}
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 @@
mRootDir.path);
mDataLoaderParcel.packageName = "com.test";
mDataLoaderParcel.arguments = "uri";
- mDataLoaderManager->destroyDataLoaderSuccess();
+ mDataLoaderManager->unbindFromDataLoaderSuccess();
mIncrementalService->onSystemReady();
}
@@ -442,7 +443,7 @@
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, 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, 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
mVold->mountIncFsSuccess();
mIncFs->makeFileSuccess();
mVold->bindMountSuccess();
- mDataLoaderManager->initializeDataLoaderSuccess();
+ mDataLoaderManager->bindToDataLoaderSuccess();
mDataLoaderManager->getDataLoaderSuccess();
TemporaryDir tempDir;
int storageId =