Merge "Installation hardening: reducing read timeout during installation." into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a8cfbe87c0
@@ -52,6 +52,11 @@ interface IIncrementalService {
|
|||||||
in IStorageHealthListener healthListener,
|
in IStorageHealthListener healthListener,
|
||||||
in PerUidReadTimeouts[] perUidReadTimeouts);
|
in PerUidReadTimeouts[] perUidReadTimeouts);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PM/system is done with this storage, ok to increase timeouts.
|
||||||
|
*/
|
||||||
|
void onInstallationComplete(int storageId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bind-mounts a path under a storage to a full path. Can be permanent or temporary.
|
* Bind-mounts a path under a storage to a full path. Can be permanent or temporary.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -205,16 +205,26 @@ public final class IncrementalFileStorages {
|
|||||||
/**
|
/**
|
||||||
* Resets the states and unbinds storage instances for an installation session.
|
* Resets the states and unbinds storage instances for an installation session.
|
||||||
*/
|
*/
|
||||||
public void cleanUp() {
|
public void cleanUpAndMarkComplete() {
|
||||||
if (mDefaultStorage == null) {
|
IncrementalStorage defaultStorage = cleanUp();
|
||||||
return;
|
if (defaultStorage != null) {
|
||||||
|
defaultStorage.onInstallationComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IncrementalStorage cleanUp() {
|
||||||
|
IncrementalStorage defaultStorage = mDefaultStorage;
|
||||||
|
mInheritedStorage = null;
|
||||||
|
mDefaultStorage = null;
|
||||||
|
if (defaultStorage == null) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mIncrementalManager.unregisterLoadingProgressCallbacks(mStageDir.getAbsolutePath());
|
mIncrementalManager.unregisterLoadingProgressCallbacks(mStageDir.getAbsolutePath());
|
||||||
mDefaultStorage.unBind(mStageDir.getAbsolutePath());
|
defaultStorage.unBind(mStageDir.getAbsolutePath());
|
||||||
} catch (IOException ignored) {
|
} catch (IOException ignored) {
|
||||||
}
|
}
|
||||||
mDefaultStorage = null;
|
return defaultStorage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -398,7 +398,7 @@ public final class IncrementalStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iinitializes and starts the DataLoader.
|
* Initializes and starts the DataLoader.
|
||||||
* This makes sure all install-time parameters are applied.
|
* This makes sure all install-time parameters are applied.
|
||||||
* Does not affect persistent DataLoader params.
|
* Does not affect persistent DataLoader params.
|
||||||
* @return True if start request was successfully queued.
|
* @return True if start request was successfully queued.
|
||||||
@@ -419,6 +419,18 @@ public final class IncrementalStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks the completion of installation.
|
||||||
|
*/
|
||||||
|
public void onInstallationComplete() {
|
||||||
|
try {
|
||||||
|
mService.onInstallationComplete(mId);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static final int UUID_BYTE_SIZE = 16;
|
private static final int UUID_BYTE_SIZE = 16;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4157,7 +4157,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
|
|||||||
if (stageDir != null && !params.isStaged) {
|
if (stageDir != null && !params.isStaged) {
|
||||||
try {
|
try {
|
||||||
if (incrementalFileStorages != null) {
|
if (incrementalFileStorages != null) {
|
||||||
incrementalFileStorages.cleanUp();
|
incrementalFileStorages.cleanUpAndMarkComplete();
|
||||||
}
|
}
|
||||||
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
|
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
|
||||||
} catch (InstallerException ignored) {
|
} catch (InstallerException ignored) {
|
||||||
@@ -4183,7 +4183,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (incrementalFileStorages != null) {
|
if (incrementalFileStorages != null) {
|
||||||
incrementalFileStorages.cleanUp();
|
incrementalFileStorages.cleanUpAndMarkComplete();
|
||||||
}
|
}
|
||||||
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
|
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
|
||||||
} catch (InstallerException ignored) {
|
} catch (InstallerException ignored) {
|
||||||
|
|||||||
@@ -150,6 +150,11 @@ binder::Status BinderIncrementalService::startLoading(
|
|||||||
return ok();
|
return ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binder::Status BinderIncrementalService::onInstallationComplete(int32_t storageId) {
|
||||||
|
mImpl.onInstallationComplete(storageId);
|
||||||
|
return ok();
|
||||||
|
}
|
||||||
|
|
||||||
binder::Status BinderIncrementalService::makeBindMount(int32_t storageId,
|
binder::Status BinderIncrementalService::makeBindMount(int32_t storageId,
|
||||||
const std::string& sourcePath,
|
const std::string& sourcePath,
|
||||||
const std::string& targetFullPath,
|
const std::string& targetFullPath,
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ public:
|
|||||||
const ::android::sp<IStorageHealthListener>& healthListener,
|
const ::android::sp<IStorageHealthListener>& healthListener,
|
||||||
const ::std::vector<::android::os::incremental::PerUidReadTimeouts>& perUidReadTimeouts,
|
const ::std::vector<::android::os::incremental::PerUidReadTimeouts>& perUidReadTimeouts,
|
||||||
bool* _aidl_return) final;
|
bool* _aidl_return) final;
|
||||||
|
binder::Status onInstallationComplete(int32_t storageId) final;
|
||||||
|
|
||||||
binder::Status makeBindMount(int32_t storageId, const std::string& sourcePath,
|
binder::Status makeBindMount(int32_t storageId, const std::string& sourcePath,
|
||||||
const std::string& targetFullPath, int32_t bindType,
|
const std::string& targetFullPath, int32_t bindType,
|
||||||
int32_t* _aidl_return) final;
|
int32_t* _aidl_return) final;
|
||||||
|
|||||||
@@ -100,6 +100,12 @@ static bool isPageAligned(IncFsSize s) {
|
|||||||
return (s & (Constants::blockSize - 1)) == 0;
|
return (s & (Constants::blockSize - 1)) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool getAlwaysEnableReadTimeoutsForSystemDataLoaders() {
|
||||||
|
return android::base::
|
||||||
|
GetBoolProperty("debug.incremental.always_enable_read_timeouts_for_system_dataloaders",
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
static bool getEnforceReadLogsMaxIntervalForSystemDataLoaders() {
|
static bool getEnforceReadLogsMaxIntervalForSystemDataLoaders() {
|
||||||
return android::base::GetBoolProperty("debug.incremental.enforce_readlogs_max_interval_for_"
|
return android::base::GetBoolProperty("debug.incremental.enforce_readlogs_max_interval_for_"
|
||||||
"system_dataloaders",
|
"system_dataloaders",
|
||||||
@@ -315,19 +321,11 @@ void IncrementalService::IncFsMount::cleanupFilesystem(std::string_view root) {
|
|||||||
::rmdir(path::c_str(root));
|
::rmdir(path::c_str(root));
|
||||||
}
|
}
|
||||||
|
|
||||||
void IncrementalService::IncFsMount::setReadLogsEnabled(bool value) {
|
void IncrementalService::IncFsMount::setFlag(StorageFlags flag, bool value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
flags |= StorageFlags::ReadLogsEnabled;
|
flags |= flag;
|
||||||
} else {
|
} else {
|
||||||
flags &= ~StorageFlags::ReadLogsEnabled;
|
flags &= ~flag;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IncrementalService::IncFsMount::setReadLogsRequested(bool value) {
|
|
||||||
if (value) {
|
|
||||||
flags |= StorageFlags::ReadLogsRequested;
|
|
||||||
} else {
|
|
||||||
flags &= ~StorageFlags::ReadLogsRequested;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,10 +726,17 @@ bool IncrementalService::startLoading(StorageId storageId,
|
|||||||
LOG(INFO) << "Skipped data loader stub creation because it already exists";
|
LOG(INFO) << "Skipped data loader stub creation because it already exists";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareDataLoaderLocked(*ifs, std::move(dataLoaderParams), std::move(statusListener),
|
prepareDataLoaderLocked(*ifs, std::move(dataLoaderParams), std::move(statusListener),
|
||||||
healthCheckParams, std::move(healthListener));
|
healthCheckParams, std::move(healthListener));
|
||||||
CHECK(ifs->dataLoaderStub);
|
CHECK(ifs->dataLoaderStub);
|
||||||
dataLoaderStub = ifs->dataLoaderStub;
|
dataLoaderStub = ifs->dataLoaderStub;
|
||||||
|
|
||||||
|
// Disable long read timeouts for non-system dataloaders.
|
||||||
|
// To be re-enabled after installation is complete.
|
||||||
|
ifs->setReadTimeoutsRequested(dataLoaderStub->isSystemDataLoader() &&
|
||||||
|
getAlwaysEnableReadTimeoutsForSystemDataLoaders());
|
||||||
|
applyStorageParamsLocked(*ifs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dataLoaderStub->isSystemDataLoader() &&
|
if (dataLoaderStub->isSystemDataLoader() &&
|
||||||
@@ -765,6 +770,18 @@ bool IncrementalService::startLoading(StorageId storageId,
|
|||||||
return dataLoaderStub->requestStart();
|
return dataLoaderStub->requestStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IncrementalService::onInstallationComplete(StorageId storage) {
|
||||||
|
IfsMountPtr ifs = getIfs(storage);
|
||||||
|
if (!ifs) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always enable long read timeouts after installation is complete.
|
||||||
|
std::unique_lock l(ifs->lock);
|
||||||
|
ifs->setReadTimeoutsRequested(true);
|
||||||
|
applyStorageParamsLocked(*ifs);
|
||||||
|
}
|
||||||
|
|
||||||
IncrementalService::BindPathMap::const_iterator IncrementalService::findStorageLocked(
|
IncrementalService::BindPathMap::const_iterator IncrementalService::findStorageLocked(
|
||||||
std::string_view path) const {
|
std::string_view path) const {
|
||||||
return findParentPath(mBindsByPath, path);
|
return findParentPath(mBindsByPath, path);
|
||||||
@@ -868,7 +885,7 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
|
|||||||
if (!ifs->readLogsRequested()) {
|
if (!ifs->readLogsRequested()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (auto status = applyStorageParamsLocked(*ifs, /*enableReadLogs=*/true); status != 0) {
|
if (auto status = applyStorageParamsLocked(*ifs); status != 0) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -880,10 +897,10 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
|
|||||||
|
|
||||||
int IncrementalService::disableReadLogsLocked(IncFsMount& ifs) {
|
int IncrementalService::disableReadLogsLocked(IncFsMount& ifs) {
|
||||||
ifs.setReadLogsRequested(false);
|
ifs.setReadLogsRequested(false);
|
||||||
return applyStorageParamsLocked(ifs, /*enableReadLogs=*/false);
|
return applyStorageParamsLocked(ifs);
|
||||||
}
|
}
|
||||||
|
|
||||||
int IncrementalService::applyStorageParamsLocked(IncFsMount& ifs, bool enableReadLogs) {
|
int IncrementalService::applyStorageParamsLocked(IncFsMount& ifs) {
|
||||||
os::incremental::IncrementalFileSystemControlParcel control;
|
os::incremental::IncrementalFileSystemControlParcel control;
|
||||||
control.cmd.reset(dup(ifs.control.cmd()));
|
control.cmd.reset(dup(ifs.control.cmd()));
|
||||||
control.pendingReads.reset(dup(ifs.control.pendingReads()));
|
control.pendingReads.reset(dup(ifs.control.pendingReads()));
|
||||||
@@ -892,11 +909,15 @@ int IncrementalService::applyStorageParamsLocked(IncFsMount& ifs, bool enableRea
|
|||||||
control.log.reset(dup(logsFd));
|
control.log.reset(dup(logsFd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool enableReadLogs = ifs.readLogsRequested();
|
||||||
|
bool enableReadTimeouts = ifs.readTimeoutsRequested();
|
||||||
|
|
||||||
std::lock_guard l(mMountOperationLock);
|
std::lock_guard l(mMountOperationLock);
|
||||||
auto status = mVold->setIncFsMountOptions(control, enableReadLogs);
|
auto status = mVold->setIncFsMountOptions(control, enableReadLogs, enableReadTimeouts);
|
||||||
if (status.isOk()) {
|
if (status.isOk()) {
|
||||||
// Store enabled state.
|
// Store states.
|
||||||
ifs.setReadLogsEnabled(enableReadLogs);
|
ifs.setReadLogsEnabled(enableReadLogs);
|
||||||
|
ifs.setReadTimeoutsEnabled(enableReadTimeouts);
|
||||||
} else {
|
} else {
|
||||||
LOG(ERROR) << "applyStorageParams failed: " << status.toString8();
|
LOG(ERROR) << "applyStorageParams failed: " << status.toString8();
|
||||||
}
|
}
|
||||||
@@ -1271,7 +1292,7 @@ void IncrementalService::setUidReadTimeouts(StorageId storage,
|
|||||||
maxPendingTimeUs = std::max(maxPendingTimeUs, microseconds(timeouts.maxPendingTimeUs));
|
maxPendingTimeUs = std::max(maxPendingTimeUs, microseconds(timeouts.maxPendingTimeUs));
|
||||||
}
|
}
|
||||||
if (maxPendingTimeUs < Constants::minPerUidTimeout) {
|
if (maxPendingTimeUs < Constants::minPerUidTimeout) {
|
||||||
LOG(ERROR) << "Skip setting read timeouts (maxPendingTime < Constants::minPerUidTimeout): "
|
LOG(ERROR) << "Skip setting read timeouts (maxPendingTime < Constants::minPerUidTimeout): "
|
||||||
<< duration_cast<milliseconds>(maxPendingTimeUs).count() << "ms < "
|
<< duration_cast<milliseconds>(maxPendingTimeUs).count() << "ms < "
|
||||||
<< Constants::minPerUidTimeout.count() << "ms";
|
<< Constants::minPerUidTimeout.count() << "ms";
|
||||||
return;
|
return;
|
||||||
@@ -2946,8 +2967,10 @@ BootClockTsUs IncrementalService::DataLoaderStub::getOldestPendingReadTs() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(DEBUG) << id() << ": pendingReads: " << control.pendingReads() << ", "
|
LOG(DEBUG) << id() << ": pendingReads: fd(" << control.pendingReads() << "), count("
|
||||||
<< mLastPendingReads.size() << ": " << mLastPendingReads.front().bootClockTsUs;
|
<< mLastPendingReads.size() << "), block: " << mLastPendingReads.front().block
|
||||||
|
<< ", time: " << mLastPendingReads.front().bootClockTsUs
|
||||||
|
<< ", uid: " << mLastPendingReads.front().uid;
|
||||||
|
|
||||||
return getOldestTsFromLastPendingReads();
|
return getOldestTsFromLastPendingReads();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,9 @@ public:
|
|||||||
ReadLogsAllowed = 1 << 0,
|
ReadLogsAllowed = 1 << 0,
|
||||||
ReadLogsEnabled = 1 << 1,
|
ReadLogsEnabled = 1 << 1,
|
||||||
ReadLogsRequested = 1 << 2,
|
ReadLogsRequested = 1 << 2,
|
||||||
|
|
||||||
|
ReadTimeoutsEnabled = 1 << 3,
|
||||||
|
ReadTimeoutsRequested = 1 << 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LoadingProgress {
|
struct LoadingProgress {
|
||||||
@@ -160,6 +163,7 @@ public:
|
|||||||
const StorageHealthCheckParams& healthCheckParams,
|
const StorageHealthCheckParams& healthCheckParams,
|
||||||
StorageHealthListener healthListener,
|
StorageHealthListener healthListener,
|
||||||
std::vector<PerUidReadTimeouts> perUidReadTimeouts);
|
std::vector<PerUidReadTimeouts> perUidReadTimeouts);
|
||||||
|
void onInstallationComplete(StorageId storage);
|
||||||
|
|
||||||
int bind(StorageId storage, std::string_view source, std::string_view target, BindKind kind);
|
int bind(StorageId storage, std::string_view source, std::string_view target, BindKind kind);
|
||||||
int unbind(StorageId storage, std::string_view target);
|
int unbind(StorageId storage, std::string_view target);
|
||||||
@@ -316,7 +320,7 @@ private:
|
|||||||
} mHealthBase = {TimePoint::max(), kMaxBootClockTsUs};
|
} mHealthBase = {TimePoint::max(), kMaxBootClockTsUs};
|
||||||
StorageHealthCheckParams mHealthCheckParams;
|
StorageHealthCheckParams mHealthCheckParams;
|
||||||
int mStreamStatus = content::pm::IDataLoaderStatusListener::STREAM_HEALTHY;
|
int mStreamStatus = content::pm::IDataLoaderStatusListener::STREAM_HEALTHY;
|
||||||
std::vector<incfs::ReadInfo> mLastPendingReads;
|
std::vector<incfs::ReadInfoWithUid> mLastPendingReads;
|
||||||
};
|
};
|
||||||
using DataLoaderStubPtr = sp<DataLoaderStub>;
|
using DataLoaderStubPtr = sp<DataLoaderStub>;
|
||||||
|
|
||||||
@@ -364,13 +368,32 @@ private:
|
|||||||
void disallowReadLogs() { flags &= ~StorageFlags::ReadLogsAllowed; }
|
void disallowReadLogs() { flags &= ~StorageFlags::ReadLogsAllowed; }
|
||||||
int32_t readLogsAllowed() const { return (flags & StorageFlags::ReadLogsAllowed); }
|
int32_t readLogsAllowed() const { return (flags & StorageFlags::ReadLogsAllowed); }
|
||||||
|
|
||||||
void setReadLogsEnabled(bool value);
|
void setReadLogsEnabled(bool value) {
|
||||||
|
return setFlag(StorageFlags::ReadLogsEnabled, value);
|
||||||
|
}
|
||||||
int32_t readLogsEnabled() const { return (flags & StorageFlags::ReadLogsEnabled); }
|
int32_t readLogsEnabled() const { return (flags & StorageFlags::ReadLogsEnabled); }
|
||||||
|
|
||||||
void setReadLogsRequested(bool value);
|
void setReadLogsRequested(bool value) {
|
||||||
|
return setFlag(StorageFlags::ReadLogsRequested, value);
|
||||||
|
}
|
||||||
int32_t readLogsRequested() const { return (flags & StorageFlags::ReadLogsRequested); }
|
int32_t readLogsRequested() const { return (flags & StorageFlags::ReadLogsRequested); }
|
||||||
|
|
||||||
|
void setReadTimeoutsEnabled(bool value) {
|
||||||
|
return setFlag(StorageFlags::ReadTimeoutsEnabled, value);
|
||||||
|
}
|
||||||
|
int32_t readTimeoutsEnabled() const { return (flags & StorageFlags::ReadTimeoutsEnabled); }
|
||||||
|
|
||||||
|
void setReadTimeoutsRequested(bool value) {
|
||||||
|
return setFlag(StorageFlags::ReadTimeoutsRequested, value);
|
||||||
|
}
|
||||||
|
int32_t readTimeoutsRequested() const {
|
||||||
|
return (flags & StorageFlags::ReadTimeoutsRequested);
|
||||||
|
}
|
||||||
|
|
||||||
static void cleanupFilesystem(std::string_view root);
|
static void cleanupFilesystem(std::string_view root);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setFlag(StorageFlags flag, bool value);
|
||||||
};
|
};
|
||||||
|
|
||||||
using IfsMountPtr = std::shared_ptr<IncFsMount>;
|
using IfsMountPtr = std::shared_ptr<IncFsMount>;
|
||||||
@@ -422,7 +445,7 @@ private:
|
|||||||
int makeDirs(const IncFsMount& ifs, StorageId storageId, std::string_view path, int mode);
|
int makeDirs(const IncFsMount& ifs, StorageId storageId, std::string_view path, int mode);
|
||||||
|
|
||||||
int disableReadLogsLocked(IncFsMount& ifs);
|
int disableReadLogsLocked(IncFsMount& ifs);
|
||||||
int applyStorageParamsLocked(IncFsMount& ifs, bool enableReadLogs);
|
int applyStorageParamsLocked(IncFsMount& ifs);
|
||||||
|
|
||||||
LoadingProgress getLoadingProgressFromPath(const IncFsMount& ifs, std::string_view path) const;
|
LoadingProgress getLoadingProgressFromPath(const IncFsMount& ifs, std::string_view path) const;
|
||||||
|
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ public:
|
|||||||
}
|
}
|
||||||
binder::Status setIncFsMountOptions(
|
binder::Status setIncFsMountOptions(
|
||||||
const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
|
const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
|
||||||
bool enableReadLogs) const final {
|
bool enableReadLogs, bool enableReadTimeouts) const final {
|
||||||
return mInterface->setIncFsMountOptions(control, enableReadLogs);
|
return mInterface->setIncFsMountOptions(control, enableReadLogs, enableReadTimeouts);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -233,8 +233,9 @@ public:
|
|||||||
ErrorCode reserveSpace(const Control& control, FileId id, IncFsSize size) const final {
|
ErrorCode reserveSpace(const Control& control, FileId id, IncFsSize size) const final {
|
||||||
return incfs::reserveSpace(control, id, size);
|
return incfs::reserveSpace(control, id, size);
|
||||||
}
|
}
|
||||||
WaitResult waitForPendingReads(const Control& control, std::chrono::milliseconds timeout,
|
WaitResult waitForPendingReads(
|
||||||
std::vector<incfs::ReadInfo>* pendingReadsBuffer) const final {
|
const Control& control, std::chrono::milliseconds timeout,
|
||||||
|
std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) const final {
|
||||||
return incfs::waitForPendingReads(control, timeout, pendingReadsBuffer);
|
return incfs::waitForPendingReads(control, timeout, pendingReadsBuffer);
|
||||||
}
|
}
|
||||||
ErrorCode setUidReadTimeouts(const Control& control,
|
ErrorCode setUidReadTimeouts(const Control& control,
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ public:
|
|||||||
virtual binder::Status bindMount(const std::string& sourceDir,
|
virtual binder::Status bindMount(const std::string& sourceDir,
|
||||||
const std::string& targetDir) const = 0;
|
const std::string& targetDir) const = 0;
|
||||||
virtual binder::Status setIncFsMountOptions(
|
virtual binder::Status setIncFsMountOptions(
|
||||||
const os::incremental::IncrementalFileSystemControlParcel& control,
|
const os::incremental::IncrementalFileSystemControlParcel& control, bool enableReadLogs,
|
||||||
bool enableReadLogs) const = 0;
|
bool enableReadTimeouts) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DataLoaderManagerWrapper {
|
class DataLoaderManagerWrapper {
|
||||||
@@ -117,7 +117,7 @@ public:
|
|||||||
virtual ErrorCode reserveSpace(const Control& control, FileId id, IncFsSize size) const = 0;
|
virtual ErrorCode reserveSpace(const Control& control, FileId id, IncFsSize size) const = 0;
|
||||||
virtual WaitResult waitForPendingReads(
|
virtual WaitResult waitForPendingReads(
|
||||||
const Control& control, std::chrono::milliseconds timeout,
|
const Control& control, std::chrono::milliseconds timeout,
|
||||||
std::vector<incfs::ReadInfo>* pendingReadsBuffer) const = 0;
|
std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) const = 0;
|
||||||
virtual ErrorCode setUidReadTimeouts(
|
virtual ErrorCode setUidReadTimeouts(
|
||||||
const Control& control,
|
const Control& control,
|
||||||
const std::vector<::android::os::incremental::PerUidReadTimeouts>& perUidReadTimeouts)
|
const std::vector<::android::os::incremental::PerUidReadTimeouts>& perUidReadTimeouts)
|
||||||
|
|||||||
@@ -56,10 +56,10 @@ public:
|
|||||||
MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
|
MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
|
||||||
MOCK_CONST_METHOD2(bindMount,
|
MOCK_CONST_METHOD2(bindMount,
|
||||||
binder::Status(const std::string& sourceDir, const std::string& argetDir));
|
binder::Status(const std::string& sourceDir, const std::string& argetDir));
|
||||||
MOCK_CONST_METHOD2(
|
MOCK_CONST_METHOD3(
|
||||||
setIncFsMountOptions,
|
setIncFsMountOptions,
|
||||||
binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
|
binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
|
||||||
bool));
|
bool, bool));
|
||||||
|
|
||||||
void mountIncFsFails() {
|
void mountIncFsFails() {
|
||||||
ON_CALL(*this, mountIncFs(_, _, _, _))
|
ON_CALL(*this, mountIncFs(_, _, _, _))
|
||||||
@@ -83,12 +83,13 @@ public:
|
|||||||
ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
|
ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
|
||||||
}
|
}
|
||||||
void setIncFsMountOptionsFails() const {
|
void setIncFsMountOptionsFails() const {
|
||||||
ON_CALL(*this, setIncFsMountOptions(_, _))
|
ON_CALL(*this, setIncFsMountOptions(_, _, _))
|
||||||
.WillByDefault(Return(
|
.WillByDefault(Return(
|
||||||
binder::Status::fromExceptionCode(1, String8("failed to set options"))));
|
binder::Status::fromExceptionCode(1, String8("failed to set options"))));
|
||||||
}
|
}
|
||||||
void setIncFsMountOptionsSuccess() {
|
void setIncFsMountOptionsSuccess() {
|
||||||
ON_CALL(*this, setIncFsMountOptions(_, _)).WillByDefault(Return(binder::Status::ok()));
|
ON_CALL(*this, setIncFsMountOptions(_, _, _))
|
||||||
|
.WillByDefault(Invoke(this, &MockVoldService::setIncFsMountOptionsOk));
|
||||||
}
|
}
|
||||||
binder::Status getInvalidControlParcel(const std::string& imagePath,
|
binder::Status getInvalidControlParcel(const std::string& imagePath,
|
||||||
const std::string& targetDir, int32_t flags,
|
const std::string& targetDir, int32_t flags,
|
||||||
@@ -103,10 +104,23 @@ public:
|
|||||||
_aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
|
_aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
|
||||||
return binder::Status::ok();
|
return binder::Status::ok();
|
||||||
}
|
}
|
||||||
|
binder::Status setIncFsMountOptionsOk(
|
||||||
|
const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
|
||||||
|
bool enableReadLogs, bool enableReadTimeouts) {
|
||||||
|
mReadLogsEnabled = enableReadLogs;
|
||||||
|
mReadTimeoutsEnabled = enableReadTimeouts;
|
||||||
|
return binder::Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool readLogsEnabled() const { return mReadLogsEnabled; }
|
||||||
|
bool readTimeoutsEnabled() const { return mReadTimeoutsEnabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TemporaryFile cmdFile;
|
TemporaryFile cmdFile;
|
||||||
TemporaryFile logFile;
|
TemporaryFile logFile;
|
||||||
|
|
||||||
|
bool mReadLogsEnabled = false;
|
||||||
|
bool mReadTimeoutsEnabled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MockDataLoader : public IDataLoader {
|
class MockDataLoader : public IDataLoader {
|
||||||
@@ -395,7 +409,7 @@ public:
|
|||||||
MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
|
MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
|
||||||
MOCK_CONST_METHOD3(waitForPendingReads,
|
MOCK_CONST_METHOD3(waitForPendingReads,
|
||||||
WaitResult(const Control& control, std::chrono::milliseconds timeout,
|
WaitResult(const Control& control, std::chrono::milliseconds timeout,
|
||||||
std::vector<incfs::ReadInfo>* pendingReadsBuffer));
|
std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
|
||||||
MOCK_CONST_METHOD2(setUidReadTimeouts,
|
MOCK_CONST_METHOD2(setUidReadTimeouts,
|
||||||
ErrorCode(const Control& control,
|
ErrorCode(const Control& control,
|
||||||
const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
|
const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
|
||||||
@@ -435,7 +449,7 @@ public:
|
|||||||
ON_CALL(*this, waitForPendingReads(_, _, _))
|
ON_CALL(*this, waitForPendingReads(_, _, _))
|
||||||
.WillByDefault(
|
.WillByDefault(
|
||||||
Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
|
Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
|
||||||
std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
|
std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
|
||||||
pendingReadsBuffer->push_back({.bootClockTsUs = ts});
|
pendingReadsBuffer->push_back({.bootClockTsUs = ts});
|
||||||
return android::incfs::WaitResult::HaveData;
|
return android::incfs::WaitResult::HaveData;
|
||||||
}));
|
}));
|
||||||
@@ -1302,8 +1316,10 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
|
|||||||
|
|
||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
|
// on startLoading
|
||||||
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
|
||||||
// We are calling setIncFsMountOptions(true).
|
// We are calling setIncFsMountOptions(true).
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// Not expecting callback removal.
|
// Not expecting callback removal.
|
||||||
@@ -1325,8 +1341,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// Enabling and then disabling readlogs.
|
// Enabling and then disabling readlogs.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// Not expecting callback removal.
|
// Not expecting callback removal.
|
||||||
@@ -1353,8 +1369,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// Enabling and then disabling readlogs.
|
// Enabling and then disabling readlogs.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(2);
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// Not expecting callback removal.
|
// Not expecting callback removal.
|
||||||
@@ -1394,8 +1410,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSy
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// Enabling and then disabling readlogs.
|
// Enabling and then disabling readlogs.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(3);
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// Not expecting callback removal.
|
// Not expecting callback removal.
|
||||||
@@ -1435,8 +1451,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// Enabling and then disabling readlogs.
|
// Enabling and then disabling readlogs.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(5);
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(3);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// Not expecting callback removal.
|
// Not expecting callback removal.
|
||||||
@@ -1448,9 +1464,14 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
|
|||||||
IncrementalService::CreateOptions::CreateNew);
|
IncrementalService::CreateOptions::CreateNew);
|
||||||
ASSERT_GE(storageId, 0);
|
ASSERT_GE(storageId, 0);
|
||||||
|
|
||||||
|
// Before install - long timeouts.
|
||||||
|
ASSERT_TRUE(mVold->readTimeoutsEnabled());
|
||||||
|
|
||||||
auto dataLoaderParcel = mDataLoaderParcel;
|
auto dataLoaderParcel = mDataLoaderParcel;
|
||||||
ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
|
ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
|
||||||
{}, {}));
|
{}, {}));
|
||||||
|
// During install - short timeouts.
|
||||||
|
ASSERT_FALSE(mVold->readTimeoutsEnabled());
|
||||||
|
|
||||||
// Disable readlogs callback present.
|
// Disable readlogs callback present.
|
||||||
ASSERT_EQ(storageId, mTimedQueue->mId);
|
ASSERT_EQ(storageId, mTimedQueue->mId);
|
||||||
@@ -1463,9 +1484,15 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
|
|||||||
mClock->advance(90min);
|
mClock->advance(90min);
|
||||||
ASSERT_GE(mDataLoader->setStorageParams(true), 0);
|
ASSERT_GE(mDataLoader->setStorageParams(true), 0);
|
||||||
|
|
||||||
|
mIncrementalService->onInstallationComplete(storageId);
|
||||||
|
// After install - long timeouts.
|
||||||
|
ASSERT_TRUE(mVold->readTimeoutsEnabled());
|
||||||
|
|
||||||
// New installation.
|
// New installation.
|
||||||
ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
|
ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
|
||||||
{}, {}));
|
{}, {}));
|
||||||
|
// New installation - short timeouts.
|
||||||
|
ASSERT_FALSE(mVold->readTimeoutsEnabled());
|
||||||
|
|
||||||
// New callback present.
|
// New callback present.
|
||||||
ASSERT_EQ(storageId, mTimedQueue->mId);
|
ASSERT_EQ(storageId, mTimedQueue->mId);
|
||||||
@@ -1485,6 +1512,10 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
|
|||||||
// And timeout.
|
// And timeout.
|
||||||
mClock->advance(90min);
|
mClock->advance(90min);
|
||||||
ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
|
ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
|
||||||
|
|
||||||
|
mIncrementalService->onInstallationComplete(storageId);
|
||||||
|
// After install - long timeouts.
|
||||||
|
ASSERT_TRUE(mVold->readTimeoutsEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
|
TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
|
||||||
@@ -1495,9 +1526,9 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChang
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// We are calling setIncFsMountOptions(true).
|
// We are calling setIncFsMountOptions(true).
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
|
||||||
// setIncFsMountOptions(false) is called on the callback.
|
// setIncFsMountOptions(false) is called on the callback.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
|
||||||
// After setIncFsMountOptions succeeded expecting to start watching.
|
// After setIncFsMountOptions succeeded expecting to start watching.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
|
||||||
// After callback is called, disable read logs and remove callback.
|
// After callback is called, disable read logs and remove callback.
|
||||||
@@ -1520,7 +1551,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// checkPermission fails, no calls to set opitions, start or stop WatchingMode.
|
// checkPermission fails, no calls to set opitions, start or stop WatchingMode.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
|
||||||
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
||||||
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
||||||
TemporaryDir tempDir;
|
TemporaryDir tempDir;
|
||||||
@@ -1539,7 +1571,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUse
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// checkPermission fails, no calls to set opitions, start or stop WatchingMode.
|
// checkPermission fails, no calls to set opitions, start or stop WatchingMode.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
|
||||||
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
||||||
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
||||||
TemporaryDir tempDir;
|
TemporaryDir tempDir;
|
||||||
@@ -1559,7 +1592,8 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
|
|||||||
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
|
||||||
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
|
||||||
// We are calling setIncFsMountOptions.
|
// We are calling setIncFsMountOptions.
|
||||||
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
|
||||||
|
EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
|
||||||
// setIncFsMountOptions fails, no calls to start or stop WatchingMode.
|
// setIncFsMountOptions fails, no calls to start or stop WatchingMode.
|
||||||
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
|
||||||
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
|
||||||
|
|||||||
Reference in New Issue
Block a user