blob: fae654edf6b42dfc50a442ecd7bd62ab6ce118ea [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/file.h>
18#include <android-base/logging.h>
19#include <android-base/unique_fd.h>
20#include <binder/ParcelFileDescriptor.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <utils/Log.h>
Songchun Fan1b76ccf2021-02-24 22:25:59 +000024#include <utils/String16.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080025
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -070026#include <chrono>
Songchun Fan3c82a302019-11-29 14:23:45 -080027#include <future>
28
29#include "IncrementalService.h"
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070030#include "IncrementalServiceValidation.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080031#include "Metadata.pb.h"
32#include "ServiceWrappers.h"
33
34using namespace testing;
35using namespace android::incremental;
36using namespace std::literals;
37using testing::_;
38using testing::Invoke;
39using testing::NiceMock;
40
41#undef LOG_TAG
42#define LOG_TAG "IncrementalServiceTest"
43
44using namespace android::incfs;
45using namespace android::content::pm;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -080046using PerUidReadTimeouts = android::os::incremental::PerUidReadTimeouts;
Songchun Fan3c82a302019-11-29 14:23:45 -080047
48namespace android::os::incremental {
49
50class MockVoldService : public VoldServiceWrapper {
51public:
Songchun Fanf949c372021-04-27 11:26:25 -070052 MOCK_CONST_METHOD5(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080053 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fanf949c372021-04-27 11:26:25 -070054 int32_t flags, const std::string& sysfsName,
Songchun Fan3c82a302019-11-29 14:23:45 -080055 IncrementalFileSystemControlParcel* _aidl_return));
56 MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
57 MOCK_CONST_METHOD2(bindMount,
58 binder::Status(const std::string& sourceDir, const std::string& argetDir));
Songchun Fanf6c65bb2021-05-10 16:17:30 -070059 MOCK_CONST_METHOD4(
Songchun Fan374f7652020-08-20 08:40:29 -070060 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
Songchun Fanf6c65bb2021-05-10 16:17:30 -070062 bool, bool, const std::string&));
Songchun Fan3c82a302019-11-29 14:23:45 -080063
64 void mountIncFsFails() {
Songchun Fanf949c372021-04-27 11:26:25 -070065 ON_CALL(*this, mountIncFs(_, _, _, _, _))
Songchun Fan3c82a302019-11-29 14:23:45 -080066 .WillByDefault(
67 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68 }
69 void mountIncFsInvalidControlParcel() {
Songchun Fanf949c372021-04-27 11:26:25 -070070 ON_CALL(*this, mountIncFs(_, _, _, _, _))
Songchun Fan3c82a302019-11-29 14:23:45 -080071 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72 }
73 void mountIncFsSuccess() {
Songchun Fanf949c372021-04-27 11:26:25 -070074 ON_CALL(*this, mountIncFs(_, _, _, _, _))
Songchun Fan3c82a302019-11-29 14:23:45 -080075 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
76 }
77 void bindMountFails() {
78 ON_CALL(*this, bindMount(_, _))
79 .WillByDefault(Return(
80 binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
81 }
82 void bindMountSuccess() {
83 ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
84 }
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070085 void setIncFsMountOptionsFails() const {
Songchun Fanf6c65bb2021-05-10 16:17:30 -070086 ON_CALL(*this, setIncFsMountOptions(_, _, _, _))
Songchun Fan374f7652020-08-20 08:40:29 -070087 .WillByDefault(Return(
88 binder::Status::fromExceptionCode(1, String8("failed to set options"))));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070089 }
90 void setIncFsMountOptionsSuccess() {
Songchun Fanf6c65bb2021-05-10 16:17:30 -070091 ON_CALL(*this, setIncFsMountOptions(_, _, _, _))
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070092 .WillByDefault(Invoke(this, &MockVoldService::setIncFsMountOptionsOk));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070093 }
Songchun Fan3c82a302019-11-29 14:23:45 -080094 binder::Status getInvalidControlParcel(const std::string& imagePath,
95 const std::string& targetDir, int32_t flags,
Songchun Fanf949c372021-04-27 11:26:25 -070096 const std::string& sysfsName,
Songchun Fan3c82a302019-11-29 14:23:45 -080097 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080098 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080099 return binder::Status::ok();
100 }
101 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
Songchun Fanf949c372021-04-27 11:26:25 -0700102 int32_t flags, const std::string& sysfsName,
103 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800104 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
105 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
106 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800107 return binder::Status::ok();
108 }
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700109 binder::Status setIncFsMountOptionsOk(
110 const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
Songchun Fanf6c65bb2021-05-10 16:17:30 -0700111 bool enableReadLogs, bool enableReadTimeouts, const std::string& sysfsName) {
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700112 mReadLogsEnabled = enableReadLogs;
113 mReadTimeoutsEnabled = enableReadTimeouts;
114 return binder::Status::ok();
115 }
116
117 bool readLogsEnabled() const { return mReadLogsEnabled; }
118 bool readTimeoutsEnabled() const { return mReadTimeoutsEnabled; }
Songchun Fan3c82a302019-11-29 14:23:45 -0800119
120private:
121 TemporaryFile cmdFile;
122 TemporaryFile logFile;
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700123
124 bool mReadLogsEnabled = false;
125 bool mReadTimeoutsEnabled = true;
Songchun Fan3c82a302019-11-29 14:23:45 -0800126};
127
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700128class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800129public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700130 MockDataLoader() {
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700131 initializeCreateOk();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700132 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
133 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
134 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
135 ON_CALL(*this, prepareImage(_, _, _))
136 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700137 }
Songchun Fan68645c42020-02-27 15:57:35 -0800138 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700139 MOCK_METHOD4(create,
140 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
141 const FileSystemControlParcel& control,
142 const sp<IDataLoaderStatusListener>& listener));
143 MOCK_METHOD1(start, binder::Status(int32_t id));
144 MOCK_METHOD1(stop, binder::Status(int32_t id));
145 MOCK_METHOD1(destroy, binder::Status(int32_t id));
146 MOCK_METHOD3(prepareImage,
147 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
148 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700149
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700150 void initializeCreateOk() {
151 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
152 }
153
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700154 void initializeCreateOkNoStatus() {
155 ON_CALL(*this, create(_, _, _, _))
156 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
157 }
158
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700159 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
160 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700161 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700162 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700163 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700164 return binder::Status::ok();
165 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700166 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
167 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700168 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700169 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700170 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700171 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700172 return binder::Status::ok();
173 }
174 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700175 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700176 return binder::Status::ok();
177 }
178 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700179 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700180 return binder::Status::ok();
181 }
182 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700183 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700184 mListener = nullptr;
185 return binder::Status::ok();
186 }
187 binder::Status prepareImageOk(int32_t id,
188 const ::std::vector<content::pm::InstallationFileParcel>&,
189 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700190 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700191 return binder::Status::ok();
192 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700193 int32_t setStorageParams(bool enableReadLogs) {
194 int32_t result = -1;
195 EXPECT_NE(mServiceConnector.get(), nullptr);
196 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
197 return result;
198 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700199 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700200
201private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700202 void setAndReportStatus(int id, int status) {
203 mStatus = status;
204 reportStatus(id);
205 }
206 void reportStatus(int id) {
207 if (mListener) {
208 mListener->onStatusChanged(id, mStatus);
209 }
210 }
211
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700212 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700213 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700214 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800215};
216
217class MockDataLoaderManager : public DataLoaderManagerWrapper {
218public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700219 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
220 EXPECT_TRUE(mDataLoaderHolder != nullptr);
221 }
222
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800223 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800224 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800225 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800226 const sp<IDataLoaderStatusListener>& listener,
227 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800228 MOCK_CONST_METHOD2(getDataLoader,
229 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700230 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800231
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700232 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800233 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700234 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700235 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700236 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800237 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700238 .WillByDefault(Return(
239 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
240 }
241 void getDataLoaderSuccess() {
242 ON_CALL(*this, getDataLoader(_, _))
243 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
244 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700245 void unbindFromDataLoaderSuccess() {
246 ON_CALL(*this, unbindFromDataLoader(_))
247 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700248 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700249 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800250 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700251 const sp<IDataLoaderStatusListener>& listener,
252 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800253 mId = mountId;
254 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700255 mDataLoader = mDataLoaderHolder;
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700256 mBindDelayMs = bindDelayMs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800257 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700258 if (mListener) {
259 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
260 }
261 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800262 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800263 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
264 const DataLoaderParamsParcel& params,
265 int bindDelayMs,
266 const sp<IDataLoaderStatusListener>& listener,
267 bool* _aidl_return) {
268 CHECK(bindDelayMs == 0) << bindDelayMs;
269 *_aidl_return = false;
270 return binder::Status::ok();
271 }
272 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
273 const DataLoaderParamsParcel& params,
274 int bindDelayMs,
275 const sp<IDataLoaderStatusListener>& listener,
276 bool* _aidl_return) {
277 CHECK(bindDelayMs == 0) << bindDelayMs;
278 *_aidl_return = true;
279 if (listener) {
280 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
281 }
282 return binder::Status::ok();
283 }
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700284 binder::Status bindToDataLoaderOkWithNoDelay(int32_t mountId,
285 const DataLoaderParamsParcel& params,
286 int bindDelayMs,
287 const sp<IDataLoaderStatusListener>& listener,
288 bool* _aidl_return) {
289 CHECK(bindDelayMs == 0) << bindDelayMs;
290 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
291 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700292 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
293 const DataLoaderParamsParcel& params,
294 int bindDelayMs,
295 const sp<IDataLoaderStatusListener>& listener,
296 bool* _aidl_return) {
297 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
298 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
299 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800300 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
301 const DataLoaderParamsParcel& params,
302 int bindDelayMs,
303 const sp<IDataLoaderStatusListener>& listener,
304 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700305 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800306 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
307 }
308 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
309 const DataLoaderParamsParcel& params,
310 int bindDelayMs,
311 const sp<IDataLoaderStatusListener>& listener,
312 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700313 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800314 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
315 }
316 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
317 const DataLoaderParamsParcel& params,
318 int bindDelayMs,
319 const sp<IDataLoaderStatusListener>& listener,
320 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700321 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
322 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800323 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
324 }
325 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
326 const DataLoaderParamsParcel& params,
327 int bindDelayMs,
328 const sp<IDataLoaderStatusListener>& listener,
329 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700330 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800331 << bindDelayMs;
332 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
333 }
334
Songchun Fan68645c42020-02-27 15:57:35 -0800335 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
336 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800337 return binder::Status::ok();
338 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700339 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800340 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800341 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700342 void setDataLoaderStatusStarted() {
343 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
344 }
345 void setDataLoaderStatusDestroyed() {
346 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
347 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700348 void setDataLoaderStatusUnavailable() {
349 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
350 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800351 void setDataLoaderStatusUnrecoverable() {
352 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
353 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700354 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700355 mBindDelayMs = -1;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700356 if (mDataLoader) {
357 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
358 return status;
359 }
360 mDataLoader = nullptr;
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700361 } else if (mListener) {
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700362 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
363 }
364 return binder::Status::ok();
365 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700366
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700367 int bindDelayMs() const { return mBindDelayMs; }
368
Songchun Fan3c82a302019-11-29 14:23:45 -0800369private:
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700370 int mId = -1;
371 int mBindDelayMs = -1;
Songchun Fan3c82a302019-11-29 14:23:45 -0800372 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700373 sp<IDataLoader> mDataLoader;
374 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800375};
376
377class MockIncFs : public IncFsWrapper {
378public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800379 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700380 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
381 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800382 MOCK_CONST_METHOD4(createControl,
383 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
384 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800385 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800386 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800387 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800388 MOCK_CONST_METHOD4(makeMappedFile,
389 ErrorCode(const Control& control, std::string_view path, int mode,
390 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800391 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700392 MOCK_CONST_METHOD3(makeDirs,
393 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800394 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
395 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
396 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700397 MOCK_CONST_METHOD2(countFilledBlocks,
398 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
399 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700400 MOCK_CONST_METHOD2(isFileFullyLoaded,
401 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700402 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700403 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800404 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700405 ErrorCode(const Control& control, std::string_view from,
406 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800407 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700408 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700409 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700410 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700411 MOCK_CONST_METHOD3(waitForPendingReads,
412 WaitResult(const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700413 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800414 MOCK_CONST_METHOD2(setUidReadTimeouts,
415 ErrorCode(const Control& control,
416 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700417 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
418 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Songchun Fanf949c372021-04-27 11:26:25 -0700419 MOCK_CONST_METHOD1(getMetrics, std::optional<Metrics>(std::string_view path));
Songchun Fand48a25e2021-04-30 09:50:58 -0700420 MOCK_CONST_METHOD1(getLastReadError, std::optional<LastReadError>(const Control& control));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700421
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700422 MockIncFs() {
423 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
424 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
425 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800426
427 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
428 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700429
430 void countFilledBlocksSuccess() {
431 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
432 }
433
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700434 void countFilledBlocksFullyLoaded() {
435 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
436 }
437
Songchun Fan374f7652020-08-20 08:40:29 -0700438 void countFilledBlocksFails() {
439 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
440 }
441
442 void countFilledBlocksEmpty() {
443 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
444 }
445
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700446 void openMountSuccess() {
447 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
448 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700449
450 // 1000ms
451 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700452 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700453 .WillByDefault(
454 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700455 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700456 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
457 return android::incfs::WaitResult::HaveData;
458 }));
459 }
460
461 void waitForPendingReadsTimeout() {
462 ON_CALL(*this, waitForPendingReads(_, _, _))
463 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700464 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700465
466 static constexpr auto kPendingReadsFd = 42;
467 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800468 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700469 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700470
Songchun Fan20d6ef22020-03-03 09:47:15 -0800471 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800472 metadata::Mount m;
473 m.mutable_storage()->set_id(100);
474 m.mutable_loader()->set_package_name("com.test");
475 m.mutable_loader()->set_arguments("com.uri");
476 const auto metadata = m.SerializeAsString();
477 m.mutable_loader()->release_arguments();
478 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800479 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800480 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800481 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800482 metadata::Storage st;
483 st.set_id(100);
484 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800485 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800486 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800487 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800488 metadata::BindPoint bp;
489 std::string destPath = "dest";
490 std::string srcPath = "src";
491 bp.set_storage_id(100);
492 bp.set_allocated_dest_path(&destPath);
493 bp.set_allocated_source_subdir(&srcPath);
494 const auto metadata = bp.SerializeAsString();
495 bp.release_source_subdir();
496 bp.release_dest_path();
497 return std::vector<char>(metadata.begin(), metadata.end());
498 }
499};
500
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700501class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700502public:
503 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700504 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700505 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
506
507 void checkPermissionSuccess() {
508 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
509 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800510 void checkPermissionNoCrossUsers() {
511 ON_CALL(*this,
512 checkPermission("android.permission.LOADER_USAGE_STATS",
513 "android:loader_usage_stats", _))
514 .WillByDefault(Return(android::incremental::Ok()));
515 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
516 .WillByDefault(
517 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
518 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700519 void checkPermissionFails() {
520 ON_CALL(*this, checkPermission(_, _, _))
521 .WillByDefault(
522 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
523 }
524 void initializeStartWatchingMode() {
525 ON_CALL(*this, startWatchingMode(_, _, _))
526 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
527 }
528 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
529 mStoredCallback = cb;
530 }
531
532 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700533};
534
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700535class MockJniWrapper : public JniWrapper {
536public:
537 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
538
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700539 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700540};
541
542class MockLooperWrapper : public LooperWrapper {
543public:
544 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
545 MOCK_METHOD1(removeFd, int(int));
546 MOCK_METHOD0(wake, void());
547 MOCK_METHOD1(pollAll, int(int));
548
549 MockLooperWrapper() {
550 ON_CALL(*this, addFd(_, _, _, _, _))
551 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
552 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700553 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700554 }
555
556 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
557 mCallback = callback;
558 mCallbackData = data;
559 return 0;
560 }
561
562 int clearCallback(int) {
563 mCallback = nullptr;
564 mCallbackData = nullptr;
565 return 0;
566 }
567
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700568 int wait10Ms(int) {
569 // This is called from a loop in runCmdLooper.
570 // Sleeping for 10ms only to avoid busy looping.
571 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700572 return 0;
573 }
574
575 android::Looper_callbackFunc mCallback = nullptr;
576 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700577};
578
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700579class MockTimedQueueWrapper : public TimedQueueWrapper {
580public:
581 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
582 MOCK_METHOD1(removeJobs, void(MountId));
583 MOCK_METHOD0(stop, void());
584
585 MockTimedQueueWrapper() {
586 ON_CALL(*this, addJob(_, _, _))
587 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
588 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
589 }
590
591 void storeJob(MountId id, Milliseconds after, Job what) {
592 mId = id;
593 mAfter = after;
594 mWhat = std::move(what);
595 }
596
597 void clearJob(MountId id) {
598 if (mId == id) {
599 mAfter = {};
600 mWhat = {};
601 }
602 }
603
604 MountId mId = -1;
605 Milliseconds mAfter;
606 Job mWhat;
607};
608
Songchun Fan374f7652020-08-20 08:40:29 -0700609class MockFsWrapper : public FsWrapper {
610public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800611 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
612 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700613 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800614 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700615 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
616 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800617 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
618 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
619 if (!onFile(file)) break;
620 }
Songchun Fan374f7652020-08-20 08:40:29 -0700621 }
622};
623
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800624class MockClockWrapper : public ClockWrapper {
625public:
626 MOCK_CONST_METHOD0(now, TimePoint());
627
628 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700629
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800630 template <class Delta>
631 void advance(Delta delta) {
632 mClock += delta;
633 }
634
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700635 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
636
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800637 TimePoint getClock() const { return mClock; }
Songchun Fan0dc77722021-05-03 17:13:52 -0700638 std::optional<timespec> getClockMono() const {
639 const auto nsSinceEpoch =
640 std::chrono::duration_cast<std::chrono::nanoseconds>(mClock.time_since_epoch())
641 .count();
642 timespec ts = {.tv_sec = static_cast<time_t>(nsSinceEpoch / 1000000000LL),
643 .tv_nsec = static_cast<long>(nsSinceEpoch % 1000000000LL)};
644 return ts;
645 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800646
647 TimePoint mClock = Clock::now();
648};
649
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700650class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
651public:
652 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
653
654 MockStorageHealthListener() {
655 ON_CALL(*this, onHealthStatus(_, _))
656 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
657 }
658
659 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
660 mStorageId = storageId;
661 mStatus = status;
662 return binder::Status::ok();
663 }
664
665 int32_t mStorageId = -1;
666 int32_t mStatus = -1;
667};
668
Songchun Fana7098592020-09-03 11:45:53 -0700669class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
670public:
671 MockStorageLoadingProgressListener() = default;
672 MOCK_METHOD2(onStorageLoadingProgressChanged,
673 binder::Status(int32_t storageId, float progress));
674 MOCK_METHOD0(onAsBinder, IBinder*());
675};
676
Songchun Fan3c82a302019-11-29 14:23:45 -0800677class MockServiceManager : public ServiceManagerWrapper {
678public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800679 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700680 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700681 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700682 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700683 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700684 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700685 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700686 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800687 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800688 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700689 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700690 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700691 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700692 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700693 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700694 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700695 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800696 mFs(std::move(fs)),
697 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800698 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800699 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
700 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800701 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800702 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700703 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
704 return std::move(mAppOpsManager);
705 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700706 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700707 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700708 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700709 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
710 return std::move(mProgressUpdateJobQueue);
711 }
Songchun Fan374f7652020-08-20 08:40:29 -0700712 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800713 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800714
715private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800716 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800717 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800718 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700719 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700720 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700721 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700722 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700723 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700724 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800725 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800726};
727
728// --- IncrementalServiceTest ---
729
Songchun Fan3c82a302019-11-29 14:23:45 -0800730class IncrementalServiceTest : public testing::Test {
731public:
732 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800733 auto vold = std::make_unique<NiceMock<MockVoldService>>();
734 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700735 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
736 mDataLoader = dataLoader.get();
737 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800738 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800739 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
740 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700741 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
742 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700743 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
744 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700745 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
746 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700747 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
748 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700749 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
750 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700751 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
752 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800753 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
754 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700755 mIncrementalService = std::make_unique<
756 IncrementalService>(MockServiceManager(std::move(vold),
757 std::move(dataloaderManager),
758 std::move(incFs), std::move(appOps),
759 std::move(jni), std::move(looper),
760 std::move(timedQueue),
761 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800762 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700763 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800764 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800765 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700766 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800767 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800768 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700769 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800770 }
771
772 void setUpExistingMountDir(const std::string& rootDir) {
773 const auto dir = rootDir + "/dir1";
774 const auto mountDir = dir + "/mount";
775 const auto backingDir = dir + "/backing_store";
776 const auto storageDir = mountDir + "/st0";
777 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
778 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
779 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
780 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
781 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
782 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
783 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
784 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800785 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
786 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
787 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
788 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
789 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
790 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800791 }
792
Songchun Fan374f7652020-08-20 08:40:29 -0700793 void setupSuccess() {
794 mVold->mountIncFsSuccess();
795 mIncFs->makeFileSuccess();
796 mVold->bindMountSuccess();
797 mDataLoaderManager->bindToDataLoaderSuccess();
798 mDataLoaderManager->getDataLoaderSuccess();
799 }
800
Songchun Fan9471be52021-04-21 17:49:27 -0700801 void checkHealthMetrics(int storageId, long expectedMillisSinceOldestPendingRead,
802 int expectedStorageHealthStatusCode) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000803 android::os::PersistableBundle result{};
804 mIncrementalService->getMetrics(storageId, &result);
Songchun Fan9471be52021-04-21 17:49:27 -0700805 ASSERT_EQ(6, (int)result.size());
806 int64_t millisSinceOldestPendingRead = -1;
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000807 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
808 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
809 .c_str()),
Songchun Fan9471be52021-04-21 17:49:27 -0700810 &millisSinceOldestPendingRead));
811 ASSERT_EQ(expectedMillisSinceOldestPendingRead, millisSinceOldestPendingRead);
812 int storageHealthStatusCode = -1;
813 ASSERT_TRUE(
814 result.getInt(String16(BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE()
815 .c_str()),
816 &storageHealthStatusCode));
817 ASSERT_EQ(expectedStorageHealthStatusCode, storageHealthStatusCode);
818 int dataLoaderStatusCode = -1;
819 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
820 .c_str()),
821 &dataLoaderStatusCode));
822 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatusCode);
823 }
824
825 void checkBindingMetrics(int storageId, int64_t expectedMillisSinceLastDataLoaderBind,
826 int64_t expectedDataLoaderBindDelayMillis) {
827 android::os::PersistableBundle result{};
828 mIncrementalService->getMetrics(storageId, &result);
829 ASSERT_EQ(6, (int)result.size());
830 int dataLoaderStatus = -1;
831 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
832 .c_str()),
833 &dataLoaderStatus));
834 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatus);
835 int64_t millisSinceLastDataLoaderBind = -1;
836 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
837 METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND()
838 .c_str()),
839 &millisSinceLastDataLoaderBind));
840 ASSERT_EQ(expectedMillisSinceLastDataLoaderBind, millisSinceLastDataLoaderBind);
841 int64_t dataLoaderBindDelayMillis = -1;
842 ASSERT_TRUE(
843 result.getLong(String16(
844 BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS()
845 .c_str()),
846 &dataLoaderBindDelayMillis));
847 ASSERT_EQ(expectedDataLoaderBindDelayMillis, dataLoaderBindDelayMillis);
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000848 }
849
Songchun Fan3c82a302019-11-29 14:23:45 -0800850protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700851 NiceMock<MockVoldService>* mVold = nullptr;
852 NiceMock<MockIncFs>* mIncFs = nullptr;
853 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
854 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
855 NiceMock<MockJniWrapper>* mJni = nullptr;
856 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700857 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700858 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700859 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800860 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700861 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800862 std::unique_ptr<IncrementalService> mIncrementalService;
863 TemporaryDir mRootDir;
864 DataLoaderParamsParcel mDataLoaderParcel;
865};
866
Songchun Fan3c82a302019-11-29 14:23:45 -0800867TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
868 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800869 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800870 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800871 int storageId =
872 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
873 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800874 ASSERT_LT(storageId, 0);
875}
876
877TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
878 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800879 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700880 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800881 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800882 int storageId =
883 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
884 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800885 ASSERT_LT(storageId, 0);
886}
887
888TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
889 mVold->mountIncFsSuccess();
890 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800891 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700892 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800893 EXPECT_CALL(*mVold, unmountIncFs(_));
894 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800895 int storageId =
896 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
897 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800898 ASSERT_LT(storageId, 0);
899}
900
901TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
902 mVold->mountIncFsSuccess();
903 mIncFs->makeFileSuccess();
904 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800905 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700906 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800907 EXPECT_CALL(*mVold, unmountIncFs(_));
908 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800909 int storageId =
910 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
911 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800912 ASSERT_LT(storageId, 0);
913}
914
915TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
916 mVold->mountIncFsSuccess();
917 mIncFs->makeFileSuccess();
918 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700919 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800920 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700921 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700922 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
923 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
924 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800925 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
926 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800927 int storageId =
928 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
929 IncrementalService::CreateOptions::CreateNew);
930 ASSERT_GE(storageId, 0);
931 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800932}
933
934TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700935 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800936 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700937 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800938 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
939 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800940 int storageId =
941 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
942 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800943 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800944 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800945 mIncrementalService->deleteStorage(storageId);
946}
947
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800948TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700949 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700950 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700951 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
952 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700953 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800954 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
955 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800956 int storageId =
957 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
958 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800959 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800960 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800961
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700962 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800963
964 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
965 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700966 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700967 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700968 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700969 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700970 mDataLoaderManager->setDataLoaderStatusDestroyed();
971
972 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
973 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800974 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700975 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700976 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700977 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
978 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800979 mDataLoaderManager->setDataLoaderStatusDestroyed();
980
981 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
982 .WillByDefault(Invoke(mDataLoaderManager,
983 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700984 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700985 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700986 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
987 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800988 mDataLoaderManager->setDataLoaderStatusDestroyed();
989
990 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
991 .WillByDefault(Invoke(mDataLoaderManager,
992 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700993 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700994 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700995 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
996 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800997 mDataLoaderManager->setDataLoaderStatusDestroyed();
998
999 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1000 .WillByDefault(Invoke(mDataLoaderManager,
1001 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -07001002 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001003 // Try the reduced delay, just in case.
1004 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Songchun Fan9471be52021-04-21 17:49:27 -07001005 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs() / 2,
1006 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001007 mDataLoaderManager->setDataLoaderStatusDestroyed();
1008
1009 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1010 .WillByDefault(Invoke(mDataLoaderManager,
1011 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -07001012 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001013 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -07001014 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
1015 mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001016 mDataLoaderManager->setDataLoaderStatusDestroyed();
1017}
1018
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001019TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
1020 mIncFs->waitForPendingReadsSuccess();
1021 mIncFs->openMountSuccess();
1022
1023 constexpr auto bindRetryInterval = 5s;
1024
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001025 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001026 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001027 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
1028 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001029 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1030 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001031 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001032 TemporaryDir tempDir;
1033 int storageId =
1034 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1035 IncrementalService::CreateOptions::CreateNew);
1036 ASSERT_GE(storageId, 0);
1037
1038 // First binds to DataLoader fails... because it's restart.
1039 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1040 .WillByDefault(Invoke(mDataLoaderManager,
1041 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
1042
1043 // Request DL start.
1044 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
1045
1046 // Retry callback present.
1047 ASSERT_EQ(storageId, mTimedQueue->mId);
1048 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1049 auto retryCallback = mTimedQueue->mWhat;
1050 mTimedQueue->clearJob(storageId);
1051
1052 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
1053 mClock->advance(5s);
1054
1055 retryCallback();
1056 // Retry callback present.
1057 ASSERT_EQ(storageId, mTimedQueue->mId);
1058 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1059 retryCallback = mTimedQueue->mWhat;
1060 mTimedQueue->clearJob(storageId);
1061
1062 // Returning "binding" so that we can retry.
1063 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1064 .WillByDefault(Invoke(mDataLoaderManager,
1065 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
1066
1067 // Expecting bindToDataLoaderBindingWithNoDelay call.
1068 mClock->advance(5s);
1069
1070 retryCallback();
1071 // No retry callback.
1072 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1073 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1074
1075 // Should not change the bindToDataLoader call count
1076 ASSERT_NE(nullptr, mLooper->mCallback);
1077 ASSERT_NE(nullptr, mLooper->mCallbackData);
1078 auto looperCb = mLooper->mCallback;
1079 auto looperCbData = mLooper->mCallbackData;
1080 looperCb(-1, -1, looperCbData);
1081
1082 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1083 mClock->advance(5s);
1084
1085 // Use pending reads callback to trigger binding.
1086 looperCb(-1, -1, looperCbData);
1087
1088 // No retry callback.
1089 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1090 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1091
1092 // Now we are out of 10m "retry" budget, let's finally bind.
1093 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1094 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1095 mClock->advance(11min);
1096
1097 // Use pending reads callback to trigger binding.
1098 looperCb(-1, -1, looperCbData);
1099
1100 // No retry callback.
1101 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1102 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1103
1104 // And test the rest of the backoff.
1105 // Simulated crash/other connection breakage.
1106 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1107 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001108 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001109 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001110 mDataLoaderManager->setDataLoaderStatusDestroyed();
1111
1112 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1113 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001114 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001115 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001116 mDataLoaderManager->setDataLoaderStatusDestroyed();
1117
1118 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1119 .WillByDefault(Invoke(mDataLoaderManager,
1120 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001121 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001122 mDataLoaderManager->setDataLoaderStatusDestroyed();
1123
1124 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1125 .WillByDefault(Invoke(mDataLoaderManager,
1126 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001127 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001128 mDataLoaderManager->setDataLoaderStatusDestroyed();
1129
1130 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1131 .WillByDefault(Invoke(mDataLoaderManager,
1132 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001133 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001134 mDataLoaderManager->setDataLoaderStatusDestroyed();
1135
1136 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1137 .WillByDefault(Invoke(mDataLoaderManager,
1138 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001139 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001140 mDataLoaderManager->setDataLoaderStatusDestroyed();
1141}
1142
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001143TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001144 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001145 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001146 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001147 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1148 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1149 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1150 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1151 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001152 int storageId =
1153 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1154 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001155 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001156 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1157 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001158 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001159 mDataLoaderManager->setDataLoaderStatusStarted();
1160}
1161
1162TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001163 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001164 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001165 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001166 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001167 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1168 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1169 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1170 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001171 int storageId =
1172 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1173 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001174 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001175 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1176 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001177 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001178}
1179
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001180TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001181 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001182 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001183 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1184 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1185 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1186 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1187 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1188 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001189 int storageId =
1190 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1191 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001192 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001193 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1194 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001195 mDataLoaderManager->setDataLoaderStatusUnavailable();
1196}
1197
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001198TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1199 mDataLoader->initializeCreateOkNoStatus();
1200 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1201 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1202 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1203 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1204 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1205 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1206 TemporaryDir tempDir;
1207 int storageId =
1208 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1209 IncrementalService::CreateOptions::CreateNew);
1210 ASSERT_GE(storageId, 0);
1211 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1212 {}, {}));
1213 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1214}
1215
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001216TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001217 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001218 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001219 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001220
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001221 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001222 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001223 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1224 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001225 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001226 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1227 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1228 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1229 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001230 int storageId =
1231 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1232 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001233 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001234 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1235 {}, {}));
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001236 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1237
1238 // Timed callback present.
1239 ASSERT_EQ(storageId, mTimedQueue->mId);
1240 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1241 auto timedCallback = mTimedQueue->mWhat;
1242 mTimedQueue->clearJob(storageId);
1243
1244 // First callback call to propagate unrecoverable.
1245 timedCallback();
1246
1247 // And second call to trigger recreation.
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001248 ASSERT_NE(nullptr, mLooper->mCallback);
1249 ASSERT_NE(nullptr, mLooper->mCallbackData);
1250 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1251}
1252
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001253TEST_F(IncrementalServiceTest, testStartDataLoaderUnavailable) {
1254 mIncFs->openMountSuccess();
1255 mDataLoader->initializeCreateOkNoStatus();
1256
1257 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(3);
1258 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(3);
1259 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(3);
1260 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1261 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
1262 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1263 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1264 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1265 TemporaryDir tempDir;
1266 int storageId =
1267 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1268 IncrementalService::CreateOptions::CreateNew);
1269 ASSERT_GE(storageId, 0);
1270
1271 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1272 .WillByDefault(Invoke(mDataLoaderManager,
1273 &MockDataLoaderManager::bindToDataLoaderOkWithNoDelay));
1274
1275 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1276 {}, {}));
1277
1278 // Unavailable.
1279 mDataLoaderManager->setDataLoaderStatusUnavailable();
1280
1281 // Timed callback present.
1282 ASSERT_EQ(storageId, mTimedQueue->mId);
1283 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1284 auto timedCallback = mTimedQueue->mWhat;
1285 mTimedQueue->clearJob(storageId);
1286
1287 // Propagating unavailable and expecting it to trigger rebind with 1s retry delay.
1288 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1289 .WillByDefault(Invoke(mDataLoaderManager,
1290 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1291 timedCallback();
1292
1293 // Unavailable #2.
1294 mDataLoaderManager->setDataLoaderStatusUnavailable();
1295
1296 // Timed callback present.
1297 ASSERT_EQ(storageId, mTimedQueue->mId);
1298 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1299 timedCallback = mTimedQueue->mWhat;
1300 mTimedQueue->clearJob(storageId);
1301
1302 // Propagating unavailable and expecting it to trigger rebind with 10s retry delay.
1303 // This time succeed.
1304 mDataLoader->initializeCreateOk();
1305 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1306 .WillByDefault(Invoke(mDataLoaderManager,
1307 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1308 timedCallback();
1309}
1310
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001311TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001312 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001313
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001314 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001315 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1316 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1317 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1318 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1319 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1320 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1321 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001322 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001323
1324 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1325 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1326 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1327 .Times(2);
1328 EXPECT_CALL(*listenerMock,
1329 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1330 .Times(1);
1331 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1332 .Times(1);
1333 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1334 .Times(2);
1335
1336 StorageHealthCheckParams params;
1337 params.blockedTimeoutMs = 10000;
1338 params.unhealthyTimeoutMs = 20000;
1339 params.unhealthyMonitoringMs = 30000;
1340
1341 using MS = std::chrono::milliseconds;
1342 using MCS = std::chrono::microseconds;
1343
1344 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1345 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1346 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1347
1348 const uint64_t kFirstTimestampUs = 1000000000ll;
1349 const uint64_t kBlockedTimestampUs =
1350 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1351 const uint64_t kUnhealthyTimestampUs =
1352 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1353
1354 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001355 int storageId =
1356 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1357 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001358 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001359 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1360 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001361
1362 // Healthy state, registered for pending reads.
1363 ASSERT_NE(nullptr, mLooper->mCallback);
1364 ASSERT_NE(nullptr, mLooper->mCallbackData);
1365 ASSERT_EQ(storageId, listener->mStorageId);
1366 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001367 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001368
1369 // Looper/epoll callback.
1370 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1371 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1372
1373 // Unregister from pending reads and wait.
1374 ASSERT_EQ(nullptr, mLooper->mCallback);
1375 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1376 ASSERT_EQ(storageId, listener->mStorageId);
1377 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1378 // Timed callback present.
1379 ASSERT_EQ(storageId, mTimedQueue->mId);
1380 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1381 auto timedCallback = mTimedQueue->mWhat;
1382 mTimedQueue->clearJob(storageId);
1383
1384 // Timed job callback for blocked.
1385 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1386 timedCallback();
1387
1388 // Still not registered, and blocked.
1389 ASSERT_EQ(nullptr, mLooper->mCallback);
1390 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1391 ASSERT_EQ(storageId, listener->mStorageId);
1392 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001393 checkHealthMetrics(storageId, params.blockedTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001394
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001395 // Timed callback present.
1396 ASSERT_EQ(storageId, mTimedQueue->mId);
1397 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1398 timedCallback = mTimedQueue->mWhat;
1399 mTimedQueue->clearJob(storageId);
1400
1401 // Timed job callback for unhealthy.
1402 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1403 timedCallback();
1404
1405 // Still not registered, and blocked.
1406 ASSERT_EQ(nullptr, mLooper->mCallback);
1407 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1408 ASSERT_EQ(storageId, listener->mStorageId);
1409 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001410 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001411
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001412 // Timed callback present.
1413 ASSERT_EQ(storageId, mTimedQueue->mId);
1414 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1415 timedCallback = mTimedQueue->mWhat;
1416 mTimedQueue->clearJob(storageId);
1417
1418 // One more unhealthy.
1419 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1420 timedCallback();
1421
1422 // Still not registered, and blocked.
1423 ASSERT_EQ(nullptr, mLooper->mCallback);
1424 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1425 ASSERT_EQ(storageId, listener->mStorageId);
1426 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001427 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001428
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001429 // Timed callback present.
1430 ASSERT_EQ(storageId, mTimedQueue->mId);
1431 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1432 timedCallback = mTimedQueue->mWhat;
1433 mTimedQueue->clearJob(storageId);
1434
1435 // And now healthy.
1436 mIncFs->waitForPendingReadsTimeout();
1437 timedCallback();
1438
1439 // Healthy state, registered for pending reads.
1440 ASSERT_NE(nullptr, mLooper->mCallback);
1441 ASSERT_NE(nullptr, mLooper->mCallbackData);
1442 ASSERT_EQ(storageId, listener->mStorageId);
1443 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001444 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001445}
1446
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001447TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001448 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001449 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001450
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001451 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001452 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001453 // on startLoading
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001454 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001455 // We are calling setIncFsMountOptions(true).
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001456 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001457 // After setIncFsMountOptions succeeded expecting to start watching.
1458 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1459 // Not expecting callback removal.
1460 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001461 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001462 int storageId =
1463 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1464 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001465 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001466 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1467 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001468 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001469}
1470
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001471TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001472 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001473 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001474
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001475 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1476 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1477 // Enabling and then disabling readlogs.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001478 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1479 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001480 // After setIncFsMountOptions succeeded expecting to start watching.
1481 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1482 // Not expecting callback removal.
1483 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1484 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001485 int storageId =
1486 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1487 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001488 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001489 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1490 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001491 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1492 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001493 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001494 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1495}
1496
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001497TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1498 mVold->setIncFsMountOptionsSuccess();
1499 mAppOpsManager->checkPermissionSuccess();
1500
1501 const auto readLogsMaxInterval = 2h;
1502
1503 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1504 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1505 // Enabling and then disabling readlogs.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001506 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(2);
1507 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001508 // After setIncFsMountOptions succeeded expecting to start watching.
1509 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1510 // Not expecting callback removal.
1511 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001512 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001513 TemporaryDir tempDir;
1514 int storageId =
1515 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1516 IncrementalService::CreateOptions::CreateNew);
1517 ASSERT_GE(storageId, 0);
1518 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1519 {}, {}));
1520
1521 // Disable readlogs callback present.
1522 ASSERT_EQ(storageId, mTimedQueue->mId);
1523 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1524 auto callback = mTimedQueue->mWhat;
1525 mTimedQueue->clearJob(storageId);
1526
1527 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1528 // Now advance clock for 1hr.
1529 mClock->advance(1h);
1530 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1531 // Now call the timed callback, it should turn off the readlogs.
1532 callback();
1533 // Now advance clock for 2hrs.
1534 mClock->advance(readLogsMaxInterval);
1535 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1536}
1537
1538TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1539 mVold->setIncFsMountOptionsSuccess();
1540 mAppOpsManager->checkPermissionSuccess();
1541
1542 const auto readLogsMaxInterval = 2h;
1543
1544 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1545 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1546 // Enabling and then disabling readlogs.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001547 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(3);
1548 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001549 // After setIncFsMountOptions succeeded expecting to start watching.
1550 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1551 // Not expecting callback removal.
1552 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001553 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001554 // System data loader.
1555 mDataLoaderParcel.packageName = "android";
1556 TemporaryDir tempDir;
1557 int storageId =
1558 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1559 IncrementalService::CreateOptions::CreateNew);
1560 ASSERT_GE(storageId, 0);
1561 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1562 {}, {}));
1563
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001564 // IfsState callback.
1565 auto callback = mTimedQueue->mWhat;
1566 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001567
1568 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1569 // Now advance clock for 1hr.
1570 mClock->advance(1h);
1571 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1572 // Now advance clock for 2hrs.
1573 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001574 // IfsStorage callback should not affect anything.
1575 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001576 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1577}
1578
1579TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1580 mVold->setIncFsMountOptionsSuccess();
1581 mAppOpsManager->checkPermissionSuccess();
1582
1583 const auto readLogsMaxInterval = 2h;
1584
1585 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1586 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1587 // Enabling and then disabling readlogs.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001588 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(5);
1589 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(3);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001590 // After setIncFsMountOptions succeeded expecting to start watching.
1591 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1592 // Not expecting callback removal.
1593 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001594 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001595 TemporaryDir tempDir;
1596 int storageId =
1597 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1598 IncrementalService::CreateOptions::CreateNew);
1599 ASSERT_GE(storageId, 0);
1600
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001601 // Before install - long timeouts.
1602 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1603
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001604 auto dataLoaderParcel = mDataLoaderParcel;
1605 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1606 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001607 // During install - short timeouts.
1608 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001609
1610 // Disable readlogs callback present.
1611 ASSERT_EQ(storageId, mTimedQueue->mId);
1612 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1613 auto callback = mTimedQueue->mWhat;
1614 mTimedQueue->clearJob(storageId);
1615
1616 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1617 // Now advance clock for 1.5hrs.
1618 mClock->advance(90min);
1619 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1620
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001621 mIncrementalService->onInstallationComplete(storageId);
1622 // After install - long timeouts.
1623 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1624
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001625 // New installation.
1626 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1627 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001628 // New installation - short timeouts.
1629 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001630
1631 // New callback present.
1632 ASSERT_EQ(storageId, mTimedQueue->mId);
1633 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1634 auto callback2 = mTimedQueue->mWhat;
1635 mTimedQueue->clearJob(storageId);
1636
1637 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1638 callback();
1639 // Advance clock for another 1.5hrs.
1640 mClock->advance(90min);
1641 // Still success even it's 3hrs past first install.
1642 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1643
1644 // New one should disable.
1645 callback2();
1646 // And timeout.
1647 mClock->advance(90min);
1648 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001649
1650 mIncrementalService->onInstallationComplete(storageId);
1651 // After install - long timeouts.
1652 ASSERT_TRUE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001653}
1654
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001655TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001656 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001657 mAppOpsManager->checkPermissionSuccess();
1658 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001659
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001660 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001661 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1662 // We are calling setIncFsMountOptions(true).
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001663 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001664 // setIncFsMountOptions(false) is called on the callback.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001665 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001666 // After setIncFsMountOptions succeeded expecting to start watching.
1667 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1668 // After callback is called, disable read logs and remove callback.
1669 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1670 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001671 int storageId =
1672 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1673 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001674 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001675 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1676 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001677 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001678 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1679 mAppOpsManager->mStoredCallback->opChanged(0, {});
1680}
1681
1682TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001683 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001684
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001685 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001686 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1687 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001688 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(0);
1689 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001690 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1691 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1692 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001693 int storageId =
1694 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1695 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001696 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001697 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1698 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001699 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001700}
1701
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001702TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1703 mAppOpsManager->checkPermissionNoCrossUsers();
1704
1705 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1706 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1707 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001708 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(0);
1709 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001710 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1711 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1712 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001713 int storageId =
1714 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1715 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001716 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001717 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1718 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001719 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1720}
1721
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001722TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001723 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001724 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001725
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001726 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001727 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001728 // We are calling setIncFsMountOptions.
Songchun Fanf6c65bb2021-05-10 16:17:30 -07001729 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1730 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001731 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1732 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1733 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001734 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001735 int storageId =
1736 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1737 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001738 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001739 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1740 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001741 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001742}
1743
Songchun Fan3c82a302019-11-29 14:23:45 -08001744TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001745 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001746 int storageId =
1747 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1748 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001749 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001750
Songchun Fan103ba1d2020-02-03 17:32:32 -08001751 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001752 // <root>/*/mount/<storage>/test
1753 EXPECT_CALL(*mIncFs,
1754 makeDir(_, Truly([&](std::string_view arg) {
1755 return arg.starts_with(mRootDir.path) &&
1756 arg.ends_with("/mount/st_1_0/" + dir_path);
1757 }),
1758 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001759 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1760 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001761}
1762
1763TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001764 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001765 int storageId =
1766 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1767 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001768 auto first = "first"sv;
1769 auto second = "second"sv;
1770 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001771 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001772
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001773 EXPECT_CALL(*mIncFs,
1774 makeDirs(_, Truly([&](std::string_view arg) {
1775 return arg.starts_with(mRootDir.path) &&
1776 arg.ends_with("/mount/st_1_0/" + dir_path);
1777 }),
1778 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001779 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001780 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001781}
Songchun Fan374f7652020-08-20 08:40:29 -07001782
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001783TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001784 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001785 int storageId =
1786 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1787 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001788 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001789 .Times(1)
1790 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1791 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001792}
1793
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001794TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001795 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001796 int storageId =
1797 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1798 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001799 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001800 .Times(1)
1801 .WillOnce(Return(incfs::LoadingState(-1)));
1802 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001803}
1804
1805TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001806 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001807 int storageId =
1808 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1809 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001810 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001811 .Times(1)
1812 .WillOnce(Return(incfs::LoadingState::Full));
1813 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001814}
1815
Songchun Fan425862f2020-08-25 13:12:16 -07001816TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001817 mIncFs->countFilledBlocksSuccess();
1818 mFs->hasNoFile();
1819
1820 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001821 int storageId =
1822 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1823 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001824 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001825}
1826
1827TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1828 mIncFs->countFilledBlocksFails();
1829 mFs->hasFiles();
1830
1831 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001832 int storageId =
1833 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1834 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001835 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001836 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001837}
1838
Songchun Fan425862f2020-08-25 13:12:16 -07001839TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001840 mIncFs->countFilledBlocksEmpty();
1841 mFs->hasFiles();
1842
1843 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001844 int storageId =
1845 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1846 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001847 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001848 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001849}
1850
1851TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1852 mIncFs->countFilledBlocksSuccess();
1853 mFs->hasFiles();
1854
1855 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001856 int storageId =
1857 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1858 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001859 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001860 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001861}
Songchun Fana7098592020-09-03 11:45:53 -07001862
1863TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1864 mIncFs->countFilledBlocksSuccess();
1865 mFs->hasFiles();
1866
1867 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001868 int storageId =
1869 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1870 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001871 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1872 new NiceMock<MockStorageLoadingProgressListener>};
1873 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1874 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1875 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1876 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1877 // Timed callback present.
1878 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1879 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1880 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1881 timedCallback();
1882 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1883 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1884 mIncrementalService->unregisterLoadingProgressListener(storageId);
1885 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1886}
1887
1888TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1889 mIncFs->countFilledBlocksFails();
1890 mFs->hasFiles();
1891
1892 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001893 int storageId =
1894 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1895 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001896 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1897 new NiceMock<MockStorageLoadingProgressListener>};
1898 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1899 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1900 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1901}
Songchun Fan2570ec02020-10-08 17:22:33 -07001902
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001903TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1904 mFs->hasFiles();
1905
1906 const auto stateUpdateInterval = 1s;
1907
1908 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1909 // No unbinding just yet.
1910 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1911 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1912 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1913 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1914 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1915 // System data loader to get rid of readlog timeout callback.
1916 mDataLoaderParcel.packageName = "android";
1917 TemporaryDir tempDir;
1918 int storageId =
1919 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1920 IncrementalService::CreateOptions::CreateNew);
1921 ASSERT_GE(storageId, 0);
1922 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1923 {}, {}));
1924
1925 // Started.
1926 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1927
1928 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001929 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001930 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1931 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001932 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001933
1934 // Not loaded yet.
1935 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1936 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1937
1938 // Send the callback, should not do anything.
1939 callback();
1940
1941 // Still started.
1942 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1943
1944 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001945 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001946 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1947 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001948 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001949
1950 // Fully loaded.
1951 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1952 // Expect the unbind.
1953 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1954
1955 callback();
1956
1957 // Destroyed.
1958 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1959}
1960
1961TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1962 mFs->hasFiles();
1963
1964 // Readlogs.
1965 mVold->setIncFsMountOptionsSuccess();
1966 mAppOpsManager->checkPermissionSuccess();
1967
1968 const auto stateUpdateInterval = 1s;
1969
1970 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1971 // No unbinding just yet.
1972 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1973 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1974 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1975 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1976 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1977 // System data loader to get rid of readlog timeout callback.
1978 mDataLoaderParcel.packageName = "android";
1979 TemporaryDir tempDir;
1980 int storageId =
1981 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1982 IncrementalService::CreateOptions::CreateNew);
1983 ASSERT_GE(storageId, 0);
1984 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1985 {}, {}));
1986
1987 // Started.
1988 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1989
1990 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001991 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001992 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1993 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001994 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001995
1996 // Not loaded yet.
1997 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1998 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1999
2000 // Send the callback, should not do anything.
2001 callback();
2002
2003 // Still started.
2004 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2005
2006 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002007 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002008 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2009 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002010 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002011
2012 // Fully loaded.
2013 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2014 .WillOnce(Return(incfs::LoadingState::Full))
2015 .WillOnce(Return(incfs::LoadingState::Full));
2016 // But with readlogs.
2017 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2018
2019 // Send the callback, still nothing.
2020 callback();
2021
2022 // Still started.
2023 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2024
2025 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002026 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002027 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2028 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002029 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002030
2031 // Disable readlogs and expect the unbind.
2032 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2033 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2034
2035 callback();
2036
2037 // Destroyed.
2038 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
2039}
2040
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002041static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
2042 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
2043 std::vector<PerUidReadTimeouts> result;
2044 for (auto&& tuple : tuples) {
2045 result.emplace_back();
2046 auto& timeouts = result.back();
2047 timeouts.uid = std::get<0>(tuple);
2048 timeouts.minTimeUs = std::get<1>(tuple);
2049 timeouts.minPendingTimeUs = std::get<2>(tuple);
2050 timeouts.maxPendingTimeUs = std::get<3>(tuple);
2051 }
2052 return result;
2053}
2054
2055static ErrorCode checkPerUidTimeouts(const Control& control,
2056 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2057 std::vector<PerUidReadTimeouts> expected =
2058 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
2059 EXPECT_EQ(expected, perUidReadTimeouts);
2060 return 0;
2061}
2062
2063static ErrorCode checkPerUidTimeoutsEmpty(
2064 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2065 EXPECT_EQ(0u, perUidReadTimeouts.size());
2066 return 0;
2067}
2068
2069TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08002070 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002071 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2072 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002073 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002074 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
2075 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002076 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002077 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
2078 TemporaryDir tempDir;
2079 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002080 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2081 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002082 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002083 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2084 createPerUidTimeouts(
2085 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002086}
2087
2088TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2089 mVold->setIncFsMountOptionsSuccess();
2090 mAppOpsManager->checkPermissionSuccess();
2091 mFs->hasFiles();
2092
2093 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2094 // First call.
2095 .WillOnce(Invoke(&checkPerUidTimeouts))
2096 // Fully loaded and no readlogs.
2097 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2098 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2099
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002100 // Loading storage.
2101 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2102 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2103 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002104 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002105
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07002106 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2107 mDataLoaderParcel.packageName = "android";
2108
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002109 TemporaryDir tempDir;
2110 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002111 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2112 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002113 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002114 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2115 createPerUidTimeouts(
2116 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002117
2118 {
2119 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002120 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002121 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2122 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002123 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002124
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002125 // Call it again.
2126 timedCallback();
2127 }
2128
2129 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002130 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002131 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002132 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2133 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002134 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002135
2136 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002137 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2138
2139 // Call it again.
2140 timedCallback();
2141 }
2142
2143 {
2144 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002145 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002146 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2147 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002148 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002149
2150 // Now disable readlogs.
2151 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2152
2153 // Call it again.
2154 timedCallback();
2155 }
2156
2157 // No callbacks anymore -> fully loaded and no readlogs.
2158 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2159}
2160
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002161TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2162 const auto invalidStorageId = 100;
2163 android::os::PersistableBundle result{};
2164 mIncrementalService->getMetrics(invalidStorageId, &result);
2165 int64_t expected = -1, value = -1;
2166 ASSERT_FALSE(
2167 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2168 .c_str()),
2169 &value));
2170 ASSERT_EQ(expected, value);
2171 ASSERT_TRUE(result.empty());
2172}
2173
Songchun Fan9471be52021-04-21 17:49:27 -07002174TEST_F(IncrementalServiceTest, testNoDataLoaderMetrics) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002175 mVold->setIncFsMountOptionsSuccess();
2176 TemporaryDir tempDir;
2177 int storageId =
2178 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2179 IncrementalService::CreateOptions::CreateNew);
2180 ASSERT_GE(storageId, 0);
2181 android::os::PersistableBundle result{};
2182 mIncrementalService->getMetrics(storageId, &result);
2183 int64_t expected = -1, value = -1;
2184 ASSERT_FALSE(
2185 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2186 .c_str()),
2187 &value));
2188 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002189 ASSERT_EQ(1, (int)result.size());
2190 bool expectedReadLogsEnabled = false;
2191 ASSERT_TRUE(
2192 result.getBoolean(String16(BnIncrementalService::METRICS_READ_LOGS_ENABLED().c_str()),
2193 &expectedReadLogsEnabled));
2194 ASSERT_EQ(mVold->readLogsEnabled(), expectedReadLogsEnabled);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002195}
2196
2197TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2198 mVold->setIncFsMountOptionsSuccess();
2199 TemporaryDir tempDir;
2200 int storageId =
2201 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2202 IncrementalService::CreateOptions::CreateNew);
2203 ASSERT_GE(storageId, 0);
2204 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2205 {}, {}));
2206 android::os::PersistableBundle result{};
2207 mIncrementalService->getMetrics(storageId, &result);
2208 int64_t expected = -1, value = -1;
2209 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2210 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002211 ASSERT_EQ(6, (int)result.size());
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002212}
2213
Songchun Fan0dc77722021-05-03 17:13:52 -07002214TEST_F(IncrementalServiceTest, testMetricsWithNoLastReadError) {
2215 mVold->setIncFsMountOptionsSuccess();
2216 ON_CALL(*mIncFs, getMetrics(_))
2217 .WillByDefault(Return(Metrics{
2218 .readsDelayedMin = 10,
2219 .readsDelayedMinUs = 5000,
2220 .readsDelayedPending = 10,
2221 .readsDelayedPendingUs = 5000,
2222 .readsFailedHashVerification = 10,
2223 .readsFailedOther = 10,
2224 .readsFailedTimedOut = 10,
2225 }));
2226 ON_CALL(*mIncFs, getLastReadError(_)).WillByDefault(Return(LastReadError{}));
2227 TemporaryDir tempDir;
2228 int storageId =
2229 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2230 IncrementalService::CreateOptions::CreateNew);
2231 ASSERT_GE(storageId, 0);
2232 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2233 {}, {}));
2234 android::os::PersistableBundle result{};
2235 mIncrementalService->getMetrics(storageId, &result);
2236 ASSERT_EQ(9, (int)result.size());
2237
2238 int expectedtotalDelayedReads = 20, totalDelayedReads = -1;
2239 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_TOTAL_DELAYED_READS().c_str()),
2240 &totalDelayedReads));
2241 ASSERT_EQ(expectedtotalDelayedReads, totalDelayedReads);
2242 int expectedtotalFailedReads = 30, totalFailedReads = -1;
2243 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_TOTAL_FAILED_READS().c_str()),
2244 &totalFailedReads));
2245 ASSERT_EQ(expectedtotalFailedReads, totalFailedReads);
2246 int64_t expectedtotalDelayedReadsMillis = 10, totalDelayedReadsMillis = -1;
2247 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::METRICS_TOTAL_DELAYED_READS_MILLIS()
2248 .c_str()),
2249 &totalDelayedReadsMillis));
2250 ASSERT_EQ(expectedtotalDelayedReadsMillis, totalDelayedReadsMillis);
2251
2252 int64_t expectedMillisSinceLastReadError = -1, millisSinceLastReadError = -1;
2253 ASSERT_FALSE(
2254 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_LAST_READ_ERROR()
2255 .c_str()),
2256 &millisSinceLastReadError));
2257 ASSERT_EQ(expectedMillisSinceLastReadError, millisSinceLastReadError);
2258 int expectedLastReadErrorNumber = -1, lastReadErrorNumber = -1;
2259 ASSERT_FALSE(
2260 result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_NUMBER().c_str()),
2261 &lastReadErrorNumber));
2262 ASSERT_EQ(expectedLastReadErrorNumber, lastReadErrorNumber);
2263}
2264
2265TEST_F(IncrementalServiceTest, testMetricsWithLastReadError) {
2266 mVold->setIncFsMountOptionsSuccess();
2267 ON_CALL(*mIncFs, getMetrics(_)).WillByDefault(Return(Metrics{}));
2268 mClock->advanceMs(5);
2269 const auto now = mClock->getClock();
2270 ON_CALL(*mIncFs, getLastReadError(_))
2271 .WillByDefault(Return(LastReadError{.timestampUs = static_cast<uint64_t>(
2272 duration_cast<std::chrono::microseconds>(
2273 now.time_since_epoch())
2274 .count()),
2275 .errorNo = static_cast<uint32_t>(-ETIME)}));
2276 TemporaryDir tempDir;
2277 int storageId =
2278 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2279 IncrementalService::CreateOptions::CreateNew);
2280 ASSERT_GE(storageId, 0);
2281 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2282 {}, {}));
2283 mClock->advanceMs(10);
2284 android::os::PersistableBundle result{};
2285 mIncrementalService->getMetrics(storageId, &result);
2286 ASSERT_EQ(11, (int)result.size());
2287 int64_t expectedMillisSinceLastReadError = 10, millisSinceLastReadError = -1;
2288 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_LAST_READ_ERROR()
2289 .c_str()),
2290 &millisSinceLastReadError));
2291 ASSERT_EQ(expectedMillisSinceLastReadError, millisSinceLastReadError);
2292 int expectedLastReadErrorNumber = -ETIME, lastReadErrorNumber = -1;
2293 ASSERT_TRUE(
2294 result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_NUMBER().c_str()),
2295 &lastReadErrorNumber));
2296 ASSERT_EQ(expectedLastReadErrorNumber, lastReadErrorNumber);
2297}
2298
Songchun Fan3c82a302019-11-29 14:23:45 -08002299} // namespace android::os::incremental