blob: 766f713a7d196ad9a4d608d38bfb6d1450210c58 [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));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070059 MOCK_CONST_METHOD3(
Songchun Fan374f7652020-08-20 08:40:29 -070060 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070062 bool, bool));
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 {
Alex Buynytskyyc144cc42021-03-31 22:19:42 -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() {
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070091 ON_CALL(*this, setIncFsMountOptions(_, _, _))
92 .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,
111 bool enableReadLogs, bool enableReadTimeouts) {
112 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));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700420
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700421 MockIncFs() {
422 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
423 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
424 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800425
426 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
427 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700428
429 void countFilledBlocksSuccess() {
430 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
431 }
432
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700433 void countFilledBlocksFullyLoaded() {
434 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
435 }
436
Songchun Fan374f7652020-08-20 08:40:29 -0700437 void countFilledBlocksFails() {
438 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
439 }
440
441 void countFilledBlocksEmpty() {
442 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
443 }
444
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700445 void openMountSuccess() {
446 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
447 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700448
449 // 1000ms
450 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700451 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700452 .WillByDefault(
453 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700454 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700455 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
456 return android::incfs::WaitResult::HaveData;
457 }));
458 }
459
460 void waitForPendingReadsTimeout() {
461 ON_CALL(*this, waitForPendingReads(_, _, _))
462 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700463 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700464
465 static constexpr auto kPendingReadsFd = 42;
466 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800467 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700468 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700469
Songchun Fan20d6ef22020-03-03 09:47:15 -0800470 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800471 metadata::Mount m;
472 m.mutable_storage()->set_id(100);
473 m.mutable_loader()->set_package_name("com.test");
474 m.mutable_loader()->set_arguments("com.uri");
475 const auto metadata = m.SerializeAsString();
476 m.mutable_loader()->release_arguments();
477 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800478 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800479 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800480 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800481 metadata::Storage st;
482 st.set_id(100);
483 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800484 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800485 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800486 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800487 metadata::BindPoint bp;
488 std::string destPath = "dest";
489 std::string srcPath = "src";
490 bp.set_storage_id(100);
491 bp.set_allocated_dest_path(&destPath);
492 bp.set_allocated_source_subdir(&srcPath);
493 const auto metadata = bp.SerializeAsString();
494 bp.release_source_subdir();
495 bp.release_dest_path();
496 return std::vector<char>(metadata.begin(), metadata.end());
497 }
498};
499
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700500class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700501public:
502 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700503 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700504 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
505
506 void checkPermissionSuccess() {
507 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
508 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800509 void checkPermissionNoCrossUsers() {
510 ON_CALL(*this,
511 checkPermission("android.permission.LOADER_USAGE_STATS",
512 "android:loader_usage_stats", _))
513 .WillByDefault(Return(android::incremental::Ok()));
514 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
515 .WillByDefault(
516 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
517 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700518 void checkPermissionFails() {
519 ON_CALL(*this, checkPermission(_, _, _))
520 .WillByDefault(
521 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
522 }
523 void initializeStartWatchingMode() {
524 ON_CALL(*this, startWatchingMode(_, _, _))
525 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
526 }
527 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
528 mStoredCallback = cb;
529 }
530
531 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700532};
533
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700534class MockJniWrapper : public JniWrapper {
535public:
536 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
537
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700538 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700539};
540
541class MockLooperWrapper : public LooperWrapper {
542public:
543 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
544 MOCK_METHOD1(removeFd, int(int));
545 MOCK_METHOD0(wake, void());
546 MOCK_METHOD1(pollAll, int(int));
547
548 MockLooperWrapper() {
549 ON_CALL(*this, addFd(_, _, _, _, _))
550 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
551 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700552 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700553 }
554
555 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
556 mCallback = callback;
557 mCallbackData = data;
558 return 0;
559 }
560
561 int clearCallback(int) {
562 mCallback = nullptr;
563 mCallbackData = nullptr;
564 return 0;
565 }
566
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700567 int wait10Ms(int) {
568 // This is called from a loop in runCmdLooper.
569 // Sleeping for 10ms only to avoid busy looping.
570 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700571 return 0;
572 }
573
574 android::Looper_callbackFunc mCallback = nullptr;
575 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700576};
577
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700578class MockTimedQueueWrapper : public TimedQueueWrapper {
579public:
580 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
581 MOCK_METHOD1(removeJobs, void(MountId));
582 MOCK_METHOD0(stop, void());
583
584 MockTimedQueueWrapper() {
585 ON_CALL(*this, addJob(_, _, _))
586 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
587 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
588 }
589
590 void storeJob(MountId id, Milliseconds after, Job what) {
591 mId = id;
592 mAfter = after;
593 mWhat = std::move(what);
594 }
595
596 void clearJob(MountId id) {
597 if (mId == id) {
598 mAfter = {};
599 mWhat = {};
600 }
601 }
602
603 MountId mId = -1;
604 Milliseconds mAfter;
605 Job mWhat;
606};
607
Songchun Fan374f7652020-08-20 08:40:29 -0700608class MockFsWrapper : public FsWrapper {
609public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800610 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
611 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700612 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800613 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700614 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
615 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800616 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
617 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
618 if (!onFile(file)) break;
619 }
Songchun Fan374f7652020-08-20 08:40:29 -0700620 }
621};
622
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800623class MockClockWrapper : public ClockWrapper {
624public:
625 MOCK_CONST_METHOD0(now, TimePoint());
626
627 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700628
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800629 template <class Delta>
630 void advance(Delta delta) {
631 mClock += delta;
632 }
633
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700634 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
635
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800636 TimePoint getClock() const { return mClock; }
637
638 TimePoint mClock = Clock::now();
639};
640
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700641class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
642public:
643 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
644
645 MockStorageHealthListener() {
646 ON_CALL(*this, onHealthStatus(_, _))
647 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
648 }
649
650 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
651 mStorageId = storageId;
652 mStatus = status;
653 return binder::Status::ok();
654 }
655
656 int32_t mStorageId = -1;
657 int32_t mStatus = -1;
658};
659
Songchun Fana7098592020-09-03 11:45:53 -0700660class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
661public:
662 MockStorageLoadingProgressListener() = default;
663 MOCK_METHOD2(onStorageLoadingProgressChanged,
664 binder::Status(int32_t storageId, float progress));
665 MOCK_METHOD0(onAsBinder, IBinder*());
666};
667
Songchun Fan3c82a302019-11-29 14:23:45 -0800668class MockServiceManager : public ServiceManagerWrapper {
669public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800670 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700671 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700672 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700673 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700674 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700675 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700676 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700677 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800678 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800679 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700680 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700681 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700682 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700683 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700684 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700685 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700686 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800687 mFs(std::move(fs)),
688 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800689 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800690 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
691 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800692 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800693 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700694 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
695 return std::move(mAppOpsManager);
696 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700697 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700698 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700699 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700700 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
701 return std::move(mProgressUpdateJobQueue);
702 }
Songchun Fan374f7652020-08-20 08:40:29 -0700703 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800704 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800705
706private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800707 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800708 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800709 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700710 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700711 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700712 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700713 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700714 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700715 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800716 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800717};
718
719// --- IncrementalServiceTest ---
720
Songchun Fan3c82a302019-11-29 14:23:45 -0800721class IncrementalServiceTest : public testing::Test {
722public:
723 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800724 auto vold = std::make_unique<NiceMock<MockVoldService>>();
725 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700726 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
727 mDataLoader = dataLoader.get();
728 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800729 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800730 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
731 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700732 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
733 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700734 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
735 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700736 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
737 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700738 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
739 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700740 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
741 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700742 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
743 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800744 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
745 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700746 mIncrementalService = std::make_unique<
747 IncrementalService>(MockServiceManager(std::move(vold),
748 std::move(dataloaderManager),
749 std::move(incFs), std::move(appOps),
750 std::move(jni), std::move(looper),
751 std::move(timedQueue),
752 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800753 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700754 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800755 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800756 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700757 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800758 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800759 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700760 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800761 }
762
763 void setUpExistingMountDir(const std::string& rootDir) {
764 const auto dir = rootDir + "/dir1";
765 const auto mountDir = dir + "/mount";
766 const auto backingDir = dir + "/backing_store";
767 const auto storageDir = mountDir + "/st0";
768 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
769 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
770 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
771 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
772 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
773 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
774 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
775 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800776 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
777 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
778 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
779 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
780 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
781 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800782 }
783
Songchun Fan374f7652020-08-20 08:40:29 -0700784 void setupSuccess() {
785 mVold->mountIncFsSuccess();
786 mIncFs->makeFileSuccess();
787 mVold->bindMountSuccess();
788 mDataLoaderManager->bindToDataLoaderSuccess();
789 mDataLoaderManager->getDataLoaderSuccess();
790 }
791
Songchun Fan9471be52021-04-21 17:49:27 -0700792 void checkHealthMetrics(int storageId, long expectedMillisSinceOldestPendingRead,
793 int expectedStorageHealthStatusCode) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000794 android::os::PersistableBundle result{};
795 mIncrementalService->getMetrics(storageId, &result);
Songchun Fan9471be52021-04-21 17:49:27 -0700796 ASSERT_EQ(6, (int)result.size());
797 int64_t millisSinceOldestPendingRead = -1;
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000798 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
799 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
800 .c_str()),
Songchun Fan9471be52021-04-21 17:49:27 -0700801 &millisSinceOldestPendingRead));
802 ASSERT_EQ(expectedMillisSinceOldestPendingRead, millisSinceOldestPendingRead);
803 int storageHealthStatusCode = -1;
804 ASSERT_TRUE(
805 result.getInt(String16(BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE()
806 .c_str()),
807 &storageHealthStatusCode));
808 ASSERT_EQ(expectedStorageHealthStatusCode, storageHealthStatusCode);
809 int dataLoaderStatusCode = -1;
810 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
811 .c_str()),
812 &dataLoaderStatusCode));
813 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatusCode);
814 }
815
816 void checkBindingMetrics(int storageId, int64_t expectedMillisSinceLastDataLoaderBind,
817 int64_t expectedDataLoaderBindDelayMillis) {
818 android::os::PersistableBundle result{};
819 mIncrementalService->getMetrics(storageId, &result);
820 ASSERT_EQ(6, (int)result.size());
821 int dataLoaderStatus = -1;
822 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
823 .c_str()),
824 &dataLoaderStatus));
825 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatus);
826 int64_t millisSinceLastDataLoaderBind = -1;
827 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
828 METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND()
829 .c_str()),
830 &millisSinceLastDataLoaderBind));
831 ASSERT_EQ(expectedMillisSinceLastDataLoaderBind, millisSinceLastDataLoaderBind);
832 int64_t dataLoaderBindDelayMillis = -1;
833 ASSERT_TRUE(
834 result.getLong(String16(
835 BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS()
836 .c_str()),
837 &dataLoaderBindDelayMillis));
838 ASSERT_EQ(expectedDataLoaderBindDelayMillis, dataLoaderBindDelayMillis);
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000839 }
840
Songchun Fan3c82a302019-11-29 14:23:45 -0800841protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700842 NiceMock<MockVoldService>* mVold = nullptr;
843 NiceMock<MockIncFs>* mIncFs = nullptr;
844 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
845 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
846 NiceMock<MockJniWrapper>* mJni = nullptr;
847 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700848 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700849 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700850 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800851 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700852 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800853 std::unique_ptr<IncrementalService> mIncrementalService;
854 TemporaryDir mRootDir;
855 DataLoaderParamsParcel mDataLoaderParcel;
856};
857
Songchun Fan3c82a302019-11-29 14:23:45 -0800858TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
859 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800860 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800861 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800862 int storageId =
863 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
864 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800865 ASSERT_LT(storageId, 0);
866}
867
868TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
869 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800870 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700871 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800872 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800873 int storageId =
874 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
875 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800876 ASSERT_LT(storageId, 0);
877}
878
879TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
880 mVold->mountIncFsSuccess();
881 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800882 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700883 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800884 EXPECT_CALL(*mVold, unmountIncFs(_));
885 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800886 int storageId =
887 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
888 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800889 ASSERT_LT(storageId, 0);
890}
891
892TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
893 mVold->mountIncFsSuccess();
894 mIncFs->makeFileSuccess();
895 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800896 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700897 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800898 EXPECT_CALL(*mVold, unmountIncFs(_));
899 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800900 int storageId =
901 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
902 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800903 ASSERT_LT(storageId, 0);
904}
905
906TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
907 mVold->mountIncFsSuccess();
908 mIncFs->makeFileSuccess();
909 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700910 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800911 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700912 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700913 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
914 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
915 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800916 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
917 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800918 int storageId =
919 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
920 IncrementalService::CreateOptions::CreateNew);
921 ASSERT_GE(storageId, 0);
922 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800923}
924
925TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700926 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800927 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700928 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800929 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
930 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800931 int storageId =
932 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
933 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800934 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800935 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800936 mIncrementalService->deleteStorage(storageId);
937}
938
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800939TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700940 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700941 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700942 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
943 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700944 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800945 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
946 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800947 int storageId =
948 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
949 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800950 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800951 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800952
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700953 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800954
955 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
956 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700957 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700958 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700959 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700960 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700961 mDataLoaderManager->setDataLoaderStatusDestroyed();
962
963 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
964 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800965 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700966 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700967 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700968 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
969 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800970 mDataLoaderManager->setDataLoaderStatusDestroyed();
971
972 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
973 .WillByDefault(Invoke(mDataLoaderManager,
974 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
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::bindToDataLoaderOkWith1000sDelay));
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::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700993 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700994 // Try the reduced delay, just in case.
995 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Songchun Fan9471be52021-04-21 17:49:27 -0700996 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs() / 2,
997 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800998 mDataLoaderManager->setDataLoaderStatusDestroyed();
999
1000 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1001 .WillByDefault(Invoke(mDataLoaderManager,
1002 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -07001003 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001004 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -07001005 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
1006 mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001007 mDataLoaderManager->setDataLoaderStatusDestroyed();
1008}
1009
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001010TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
1011 mIncFs->waitForPendingReadsSuccess();
1012 mIncFs->openMountSuccess();
1013
1014 constexpr auto bindRetryInterval = 5s;
1015
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001016 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001017 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001018 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
1019 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001020 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1021 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001022 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001023 TemporaryDir tempDir;
1024 int storageId =
1025 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1026 IncrementalService::CreateOptions::CreateNew);
1027 ASSERT_GE(storageId, 0);
1028
1029 // First binds to DataLoader fails... because it's restart.
1030 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1031 .WillByDefault(Invoke(mDataLoaderManager,
1032 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
1033
1034 // Request DL start.
1035 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
1036
1037 // Retry callback present.
1038 ASSERT_EQ(storageId, mTimedQueue->mId);
1039 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1040 auto retryCallback = mTimedQueue->mWhat;
1041 mTimedQueue->clearJob(storageId);
1042
1043 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
1044 mClock->advance(5s);
1045
1046 retryCallback();
1047 // Retry callback present.
1048 ASSERT_EQ(storageId, mTimedQueue->mId);
1049 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1050 retryCallback = mTimedQueue->mWhat;
1051 mTimedQueue->clearJob(storageId);
1052
1053 // Returning "binding" so that we can retry.
1054 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1055 .WillByDefault(Invoke(mDataLoaderManager,
1056 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
1057
1058 // Expecting bindToDataLoaderBindingWithNoDelay call.
1059 mClock->advance(5s);
1060
1061 retryCallback();
1062 // No retry callback.
1063 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1064 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1065
1066 // Should not change the bindToDataLoader call count
1067 ASSERT_NE(nullptr, mLooper->mCallback);
1068 ASSERT_NE(nullptr, mLooper->mCallbackData);
1069 auto looperCb = mLooper->mCallback;
1070 auto looperCbData = mLooper->mCallbackData;
1071 looperCb(-1, -1, looperCbData);
1072
1073 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1074 mClock->advance(5s);
1075
1076 // Use pending reads callback to trigger binding.
1077 looperCb(-1, -1, looperCbData);
1078
1079 // No retry callback.
1080 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1081 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1082
1083 // Now we are out of 10m "retry" budget, let's finally bind.
1084 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1085 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1086 mClock->advance(11min);
1087
1088 // Use pending reads callback to trigger binding.
1089 looperCb(-1, -1, looperCbData);
1090
1091 // No retry callback.
1092 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1093 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1094
1095 // And test the rest of the backoff.
1096 // Simulated crash/other connection breakage.
1097 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1098 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001099 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001100 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001101 mDataLoaderManager->setDataLoaderStatusDestroyed();
1102
1103 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1104 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001105 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001106 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001107 mDataLoaderManager->setDataLoaderStatusDestroyed();
1108
1109 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1110 .WillByDefault(Invoke(mDataLoaderManager,
1111 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001112 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001113 mDataLoaderManager->setDataLoaderStatusDestroyed();
1114
1115 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1116 .WillByDefault(Invoke(mDataLoaderManager,
1117 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001118 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001119 mDataLoaderManager->setDataLoaderStatusDestroyed();
1120
1121 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1122 .WillByDefault(Invoke(mDataLoaderManager,
1123 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001124 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001125 mDataLoaderManager->setDataLoaderStatusDestroyed();
1126
1127 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1128 .WillByDefault(Invoke(mDataLoaderManager,
1129 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001130 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001131 mDataLoaderManager->setDataLoaderStatusDestroyed();
1132}
1133
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001134TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001135 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001136 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001137 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001138 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1139 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1140 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1141 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1142 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001143 int storageId =
1144 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1145 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001146 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001147 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1148 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001149 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001150 mDataLoaderManager->setDataLoaderStatusStarted();
1151}
1152
1153TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001154 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001155 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001156 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001157 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001158 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1159 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1160 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1161 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001162 int storageId =
1163 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1164 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001165 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001166 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1167 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001168 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001169}
1170
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001171TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001172 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001173 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001174 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1175 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1176 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1177 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1178 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1179 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001180 int storageId =
1181 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1182 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001183 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001184 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1185 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001186 mDataLoaderManager->setDataLoaderStatusUnavailable();
1187}
1188
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001189TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1190 mDataLoader->initializeCreateOkNoStatus();
1191 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1192 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1193 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1194 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1195 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1196 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1197 TemporaryDir tempDir;
1198 int storageId =
1199 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1200 IncrementalService::CreateOptions::CreateNew);
1201 ASSERT_GE(storageId, 0);
1202 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1203 {}, {}));
1204 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1205}
1206
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001207TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001208 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001209 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001210 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001211
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001212 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001213 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001214 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1215 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001216 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001217 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1218 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1219 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1220 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001221 int storageId =
1222 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1223 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001224 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001225 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1226 {}, {}));
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001227 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1228
1229 // Timed callback present.
1230 ASSERT_EQ(storageId, mTimedQueue->mId);
1231 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1232 auto timedCallback = mTimedQueue->mWhat;
1233 mTimedQueue->clearJob(storageId);
1234
1235 // First callback call to propagate unrecoverable.
1236 timedCallback();
1237
1238 // And second call to trigger recreation.
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001239 ASSERT_NE(nullptr, mLooper->mCallback);
1240 ASSERT_NE(nullptr, mLooper->mCallbackData);
1241 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1242}
1243
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001244TEST_F(IncrementalServiceTest, testStartDataLoaderUnavailable) {
1245 mIncFs->openMountSuccess();
1246 mDataLoader->initializeCreateOkNoStatus();
1247
1248 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(3);
1249 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(3);
1250 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(3);
1251 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1252 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
1253 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1254 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1255 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1256 TemporaryDir tempDir;
1257 int storageId =
1258 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1259 IncrementalService::CreateOptions::CreateNew);
1260 ASSERT_GE(storageId, 0);
1261
1262 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1263 .WillByDefault(Invoke(mDataLoaderManager,
1264 &MockDataLoaderManager::bindToDataLoaderOkWithNoDelay));
1265
1266 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1267 {}, {}));
1268
1269 // Unavailable.
1270 mDataLoaderManager->setDataLoaderStatusUnavailable();
1271
1272 // Timed callback present.
1273 ASSERT_EQ(storageId, mTimedQueue->mId);
1274 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1275 auto timedCallback = mTimedQueue->mWhat;
1276 mTimedQueue->clearJob(storageId);
1277
1278 // Propagating unavailable and expecting it to trigger rebind with 1s retry delay.
1279 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1280 .WillByDefault(Invoke(mDataLoaderManager,
1281 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1282 timedCallback();
1283
1284 // Unavailable #2.
1285 mDataLoaderManager->setDataLoaderStatusUnavailable();
1286
1287 // Timed callback present.
1288 ASSERT_EQ(storageId, mTimedQueue->mId);
1289 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1290 timedCallback = mTimedQueue->mWhat;
1291 mTimedQueue->clearJob(storageId);
1292
1293 // Propagating unavailable and expecting it to trigger rebind with 10s retry delay.
1294 // This time succeed.
1295 mDataLoader->initializeCreateOk();
1296 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1297 .WillByDefault(Invoke(mDataLoaderManager,
1298 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1299 timedCallback();
1300}
1301
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001302TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001303 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001304
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001305 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001306 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1307 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1308 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1309 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1310 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1311 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1312 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001313 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001314
1315 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1316 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1317 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1318 .Times(2);
1319 EXPECT_CALL(*listenerMock,
1320 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1321 .Times(1);
1322 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1323 .Times(1);
1324 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1325 .Times(2);
1326
1327 StorageHealthCheckParams params;
1328 params.blockedTimeoutMs = 10000;
1329 params.unhealthyTimeoutMs = 20000;
1330 params.unhealthyMonitoringMs = 30000;
1331
1332 using MS = std::chrono::milliseconds;
1333 using MCS = std::chrono::microseconds;
1334
1335 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1336 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1337 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1338
1339 const uint64_t kFirstTimestampUs = 1000000000ll;
1340 const uint64_t kBlockedTimestampUs =
1341 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1342 const uint64_t kUnhealthyTimestampUs =
1343 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1344
1345 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001346 int storageId =
1347 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1348 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001349 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001350 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1351 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001352
1353 // Healthy state, registered for pending reads.
1354 ASSERT_NE(nullptr, mLooper->mCallback);
1355 ASSERT_NE(nullptr, mLooper->mCallbackData);
1356 ASSERT_EQ(storageId, listener->mStorageId);
1357 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001358 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001359
1360 // Looper/epoll callback.
1361 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1362 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1363
1364 // Unregister from pending reads and wait.
1365 ASSERT_EQ(nullptr, mLooper->mCallback);
1366 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1367 ASSERT_EQ(storageId, listener->mStorageId);
1368 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1369 // Timed callback present.
1370 ASSERT_EQ(storageId, mTimedQueue->mId);
1371 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1372 auto timedCallback = mTimedQueue->mWhat;
1373 mTimedQueue->clearJob(storageId);
1374
1375 // Timed job callback for blocked.
1376 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1377 timedCallback();
1378
1379 // Still not registered, and blocked.
1380 ASSERT_EQ(nullptr, mLooper->mCallback);
1381 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1382 ASSERT_EQ(storageId, listener->mStorageId);
1383 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001384 checkHealthMetrics(storageId, params.blockedTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001385
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001386 // Timed callback present.
1387 ASSERT_EQ(storageId, mTimedQueue->mId);
1388 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1389 timedCallback = mTimedQueue->mWhat;
1390 mTimedQueue->clearJob(storageId);
1391
1392 // Timed job callback for unhealthy.
1393 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1394 timedCallback();
1395
1396 // Still not registered, and blocked.
1397 ASSERT_EQ(nullptr, mLooper->mCallback);
1398 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1399 ASSERT_EQ(storageId, listener->mStorageId);
1400 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001401 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001402
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001403 // Timed callback present.
1404 ASSERT_EQ(storageId, mTimedQueue->mId);
1405 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1406 timedCallback = mTimedQueue->mWhat;
1407 mTimedQueue->clearJob(storageId);
1408
1409 // One more unhealthy.
1410 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1411 timedCallback();
1412
1413 // Still not registered, and blocked.
1414 ASSERT_EQ(nullptr, mLooper->mCallback);
1415 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1416 ASSERT_EQ(storageId, listener->mStorageId);
1417 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001418 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001419
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001420 // Timed callback present.
1421 ASSERT_EQ(storageId, mTimedQueue->mId);
1422 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1423 timedCallback = mTimedQueue->mWhat;
1424 mTimedQueue->clearJob(storageId);
1425
1426 // And now healthy.
1427 mIncFs->waitForPendingReadsTimeout();
1428 timedCallback();
1429
1430 // Healthy state, registered for pending reads.
1431 ASSERT_NE(nullptr, mLooper->mCallback);
1432 ASSERT_NE(nullptr, mLooper->mCallbackData);
1433 ASSERT_EQ(storageId, listener->mStorageId);
1434 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001435 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001436}
1437
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001438TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001439 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001440 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001441
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001442 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001443 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001444 // on startLoading
1445 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001446 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001447 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001448 // After setIncFsMountOptions succeeded expecting to start watching.
1449 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1450 // Not expecting callback removal.
1451 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001452 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001453 int storageId =
1454 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1455 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001456 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001457 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1458 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001459 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001460}
1461
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001462TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001463 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001464 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001465
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001466 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1467 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1468 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001469 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1470 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001471 // After setIncFsMountOptions succeeded expecting to start watching.
1472 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1473 // Not expecting callback removal.
1474 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1475 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001476 int storageId =
1477 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1478 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001479 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001480 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1481 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001482 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1483 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001484 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001485 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1486}
1487
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001488TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1489 mVold->setIncFsMountOptionsSuccess();
1490 mAppOpsManager->checkPermissionSuccess();
1491
1492 const auto readLogsMaxInterval = 2h;
1493
1494 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1495 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1496 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001497 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(2);
1498 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001499 // After setIncFsMountOptions succeeded expecting to start watching.
1500 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1501 // Not expecting callback removal.
1502 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001503 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001504 TemporaryDir tempDir;
1505 int storageId =
1506 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1507 IncrementalService::CreateOptions::CreateNew);
1508 ASSERT_GE(storageId, 0);
1509 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1510 {}, {}));
1511
1512 // Disable readlogs callback present.
1513 ASSERT_EQ(storageId, mTimedQueue->mId);
1514 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1515 auto callback = mTimedQueue->mWhat;
1516 mTimedQueue->clearJob(storageId);
1517
1518 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1519 // Now advance clock for 1hr.
1520 mClock->advance(1h);
1521 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1522 // Now call the timed callback, it should turn off the readlogs.
1523 callback();
1524 // Now advance clock for 2hrs.
1525 mClock->advance(readLogsMaxInterval);
1526 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1527}
1528
1529TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1530 mVold->setIncFsMountOptionsSuccess();
1531 mAppOpsManager->checkPermissionSuccess();
1532
1533 const auto readLogsMaxInterval = 2h;
1534
1535 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1536 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1537 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001538 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(3);
1539 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001540 // After setIncFsMountOptions succeeded expecting to start watching.
1541 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1542 // Not expecting callback removal.
1543 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001544 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001545 // System data loader.
1546 mDataLoaderParcel.packageName = "android";
1547 TemporaryDir tempDir;
1548 int storageId =
1549 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1550 IncrementalService::CreateOptions::CreateNew);
1551 ASSERT_GE(storageId, 0);
1552 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1553 {}, {}));
1554
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001555 // IfsState callback.
1556 auto callback = mTimedQueue->mWhat;
1557 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001558
1559 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1560 // Now advance clock for 1hr.
1561 mClock->advance(1h);
1562 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1563 // Now advance clock for 2hrs.
1564 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001565 // IfsStorage callback should not affect anything.
1566 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001567 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1568}
1569
1570TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1571 mVold->setIncFsMountOptionsSuccess();
1572 mAppOpsManager->checkPermissionSuccess();
1573
1574 const auto readLogsMaxInterval = 2h;
1575
1576 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1577 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1578 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001579 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(5);
1580 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(3);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001581 // After setIncFsMountOptions succeeded expecting to start watching.
1582 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1583 // Not expecting callback removal.
1584 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001585 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001586 TemporaryDir tempDir;
1587 int storageId =
1588 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1589 IncrementalService::CreateOptions::CreateNew);
1590 ASSERT_GE(storageId, 0);
1591
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001592 // Before install - long timeouts.
1593 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1594
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001595 auto dataLoaderParcel = mDataLoaderParcel;
1596 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1597 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001598 // During install - short timeouts.
1599 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001600
1601 // Disable readlogs callback present.
1602 ASSERT_EQ(storageId, mTimedQueue->mId);
1603 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1604 auto callback = mTimedQueue->mWhat;
1605 mTimedQueue->clearJob(storageId);
1606
1607 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1608 // Now advance clock for 1.5hrs.
1609 mClock->advance(90min);
1610 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1611
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001612 mIncrementalService->onInstallationComplete(storageId);
1613 // After install - long timeouts.
1614 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1615
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001616 // New installation.
1617 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1618 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001619 // New installation - short timeouts.
1620 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001621
1622 // New callback present.
1623 ASSERT_EQ(storageId, mTimedQueue->mId);
1624 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1625 auto callback2 = mTimedQueue->mWhat;
1626 mTimedQueue->clearJob(storageId);
1627
1628 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1629 callback();
1630 // Advance clock for another 1.5hrs.
1631 mClock->advance(90min);
1632 // Still success even it's 3hrs past first install.
1633 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1634
1635 // New one should disable.
1636 callback2();
1637 // And timeout.
1638 mClock->advance(90min);
1639 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001640
1641 mIncrementalService->onInstallationComplete(storageId);
1642 // After install - long timeouts.
1643 ASSERT_TRUE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001644}
1645
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001646TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001647 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001648 mAppOpsManager->checkPermissionSuccess();
1649 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001650
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001651 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001652 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1653 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001654 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001655 // setIncFsMountOptions(false) is called on the callback.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001656 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001657 // After setIncFsMountOptions succeeded expecting to start watching.
1658 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1659 // After callback is called, disable read logs and remove callback.
1660 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1661 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001662 int storageId =
1663 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1664 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001665 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001666 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1667 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001668 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001669 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1670 mAppOpsManager->mStoredCallback->opChanged(0, {});
1671}
1672
1673TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001674 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001675
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001676 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001677 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1678 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001679 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1680 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001681 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1682 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1683 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001684 int storageId =
1685 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1686 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001687 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001688 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1689 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001690 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001691}
1692
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001693TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1694 mAppOpsManager->checkPermissionNoCrossUsers();
1695
1696 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1697 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1698 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001699 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1700 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001701 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1702 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1703 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001704 int storageId =
1705 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1706 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001707 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001708 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1709 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001710 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1711}
1712
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001713TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001714 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001715 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001716
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001717 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001718 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001719 // We are calling setIncFsMountOptions.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001720 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1721 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001722 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1723 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1724 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001725 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001726 int storageId =
1727 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1728 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001729 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001730 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1731 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001732 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001733}
1734
Songchun Fan3c82a302019-11-29 14:23:45 -08001735TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001736 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001737 int storageId =
1738 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1739 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001740 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001741
Songchun Fan103ba1d2020-02-03 17:32:32 -08001742 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001743 // <root>/*/mount/<storage>/test
1744 EXPECT_CALL(*mIncFs,
1745 makeDir(_, Truly([&](std::string_view arg) {
1746 return arg.starts_with(mRootDir.path) &&
1747 arg.ends_with("/mount/st_1_0/" + dir_path);
1748 }),
1749 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001750 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1751 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001752}
1753
1754TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001755 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001756 int storageId =
1757 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1758 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001759 auto first = "first"sv;
1760 auto second = "second"sv;
1761 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001762 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001763
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001764 EXPECT_CALL(*mIncFs,
1765 makeDirs(_, Truly([&](std::string_view arg) {
1766 return arg.starts_with(mRootDir.path) &&
1767 arg.ends_with("/mount/st_1_0/" + dir_path);
1768 }),
1769 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001770 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001771 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001772}
Songchun Fan374f7652020-08-20 08:40:29 -07001773
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001774TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001775 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001776 int storageId =
1777 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1778 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001779 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001780 .Times(1)
1781 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1782 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001783}
1784
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001785TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001786 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001787 int storageId =
1788 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1789 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001790 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001791 .Times(1)
1792 .WillOnce(Return(incfs::LoadingState(-1)));
1793 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001794}
1795
1796TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001797 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001798 int storageId =
1799 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1800 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001801 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001802 .Times(1)
1803 .WillOnce(Return(incfs::LoadingState::Full));
1804 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001805}
1806
Songchun Fan425862f2020-08-25 13:12:16 -07001807TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001808 mIncFs->countFilledBlocksSuccess();
1809 mFs->hasNoFile();
1810
1811 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001812 int storageId =
1813 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1814 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001815 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001816}
1817
1818TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1819 mIncFs->countFilledBlocksFails();
1820 mFs->hasFiles();
1821
1822 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001823 int storageId =
1824 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1825 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001826 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001827 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001828}
1829
Songchun Fan425862f2020-08-25 13:12:16 -07001830TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001831 mIncFs->countFilledBlocksEmpty();
1832 mFs->hasFiles();
1833
1834 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001835 int storageId =
1836 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1837 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001838 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001839 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001840}
1841
1842TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1843 mIncFs->countFilledBlocksSuccess();
1844 mFs->hasFiles();
1845
1846 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001847 int storageId =
1848 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1849 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001850 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001851 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001852}
Songchun Fana7098592020-09-03 11:45:53 -07001853
1854TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1855 mIncFs->countFilledBlocksSuccess();
1856 mFs->hasFiles();
1857
1858 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001859 int storageId =
1860 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1861 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001862 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1863 new NiceMock<MockStorageLoadingProgressListener>};
1864 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1865 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1866 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1867 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1868 // Timed callback present.
1869 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1870 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1871 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1872 timedCallback();
1873 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1874 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1875 mIncrementalService->unregisterLoadingProgressListener(storageId);
1876 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1877}
1878
1879TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1880 mIncFs->countFilledBlocksFails();
1881 mFs->hasFiles();
1882
1883 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001884 int storageId =
1885 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1886 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001887 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1888 new NiceMock<MockStorageLoadingProgressListener>};
1889 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1890 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1891 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1892}
Songchun Fan2570ec02020-10-08 17:22:33 -07001893
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001894TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1895 mFs->hasFiles();
1896
1897 const auto stateUpdateInterval = 1s;
1898
1899 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1900 // No unbinding just yet.
1901 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1902 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1903 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1904 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1905 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1906 // System data loader to get rid of readlog timeout callback.
1907 mDataLoaderParcel.packageName = "android";
1908 TemporaryDir tempDir;
1909 int storageId =
1910 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1911 IncrementalService::CreateOptions::CreateNew);
1912 ASSERT_GE(storageId, 0);
1913 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1914 {}, {}));
1915
1916 // Started.
1917 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1918
1919 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001920 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001921 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1922 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001923 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001924
1925 // Not loaded yet.
1926 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1927 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1928
1929 // Send the callback, should not do anything.
1930 callback();
1931
1932 // Still started.
1933 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1934
1935 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001936 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001937 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1938 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001939 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001940
1941 // Fully loaded.
1942 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1943 // Expect the unbind.
1944 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1945
1946 callback();
1947
1948 // Destroyed.
1949 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1950}
1951
1952TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1953 mFs->hasFiles();
1954
1955 // Readlogs.
1956 mVold->setIncFsMountOptionsSuccess();
1957 mAppOpsManager->checkPermissionSuccess();
1958
1959 const auto stateUpdateInterval = 1s;
1960
1961 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1962 // No unbinding just yet.
1963 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1964 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1965 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1966 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1967 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1968 // System data loader to get rid of readlog timeout callback.
1969 mDataLoaderParcel.packageName = "android";
1970 TemporaryDir tempDir;
1971 int storageId =
1972 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1973 IncrementalService::CreateOptions::CreateNew);
1974 ASSERT_GE(storageId, 0);
1975 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1976 {}, {}));
1977
1978 // Started.
1979 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1980
1981 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001982 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001983 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1984 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001985 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001986
1987 // Not loaded yet.
1988 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1989 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1990
1991 // Send the callback, should not do anything.
1992 callback();
1993
1994 // Still started.
1995 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1996
1997 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001998 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001999 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2000 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002001 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002002
2003 // Fully loaded.
2004 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2005 .WillOnce(Return(incfs::LoadingState::Full))
2006 .WillOnce(Return(incfs::LoadingState::Full));
2007 // But with readlogs.
2008 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2009
2010 // Send the callback, still nothing.
2011 callback();
2012
2013 // Still started.
2014 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2015
2016 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002017 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002018 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2019 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002020 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002021
2022 // Disable readlogs and expect the unbind.
2023 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2024 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2025
2026 callback();
2027
2028 // Destroyed.
2029 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
2030}
2031
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002032static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
2033 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
2034 std::vector<PerUidReadTimeouts> result;
2035 for (auto&& tuple : tuples) {
2036 result.emplace_back();
2037 auto& timeouts = result.back();
2038 timeouts.uid = std::get<0>(tuple);
2039 timeouts.minTimeUs = std::get<1>(tuple);
2040 timeouts.minPendingTimeUs = std::get<2>(tuple);
2041 timeouts.maxPendingTimeUs = std::get<3>(tuple);
2042 }
2043 return result;
2044}
2045
2046static ErrorCode checkPerUidTimeouts(const Control& control,
2047 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2048 std::vector<PerUidReadTimeouts> expected =
2049 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
2050 EXPECT_EQ(expected, perUidReadTimeouts);
2051 return 0;
2052}
2053
2054static ErrorCode checkPerUidTimeoutsEmpty(
2055 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2056 EXPECT_EQ(0u, perUidReadTimeouts.size());
2057 return 0;
2058}
2059
2060TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08002061 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002062 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2063 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002064 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002065 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
2066 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002067 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002068 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
2069 TemporaryDir tempDir;
2070 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002071 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2072 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002073 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002074 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2075 createPerUidTimeouts(
2076 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002077}
2078
2079TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2080 mVold->setIncFsMountOptionsSuccess();
2081 mAppOpsManager->checkPermissionSuccess();
2082 mFs->hasFiles();
2083
2084 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2085 // First call.
2086 .WillOnce(Invoke(&checkPerUidTimeouts))
2087 // Fully loaded and no readlogs.
2088 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2089 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2090
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002091 // Loading storage.
2092 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2093 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2094 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002095 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002096
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07002097 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2098 mDataLoaderParcel.packageName = "android";
2099
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002100 TemporaryDir tempDir;
2101 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002102 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2103 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002104 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002105 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2106 createPerUidTimeouts(
2107 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002108
2109 {
2110 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002111 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002112 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2113 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002114 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002115
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002116 // Call it again.
2117 timedCallback();
2118 }
2119
2120 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002121 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002122 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002123 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2124 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002125 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002126
2127 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002128 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2129
2130 // Call it again.
2131 timedCallback();
2132 }
2133
2134 {
2135 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002136 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002137 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2138 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002139 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002140
2141 // Now disable readlogs.
2142 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2143
2144 // Call it again.
2145 timedCallback();
2146 }
2147
2148 // No callbacks anymore -> fully loaded and no readlogs.
2149 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2150}
2151
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002152TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2153 const auto invalidStorageId = 100;
2154 android::os::PersistableBundle result{};
2155 mIncrementalService->getMetrics(invalidStorageId, &result);
2156 int64_t expected = -1, value = -1;
2157 ASSERT_FALSE(
2158 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2159 .c_str()),
2160 &value));
2161 ASSERT_EQ(expected, value);
2162 ASSERT_TRUE(result.empty());
2163}
2164
Songchun Fan9471be52021-04-21 17:49:27 -07002165TEST_F(IncrementalServiceTest, testNoDataLoaderMetrics) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002166 mVold->setIncFsMountOptionsSuccess();
2167 TemporaryDir tempDir;
2168 int storageId =
2169 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2170 IncrementalService::CreateOptions::CreateNew);
2171 ASSERT_GE(storageId, 0);
2172 android::os::PersistableBundle result{};
2173 mIncrementalService->getMetrics(storageId, &result);
2174 int64_t expected = -1, value = -1;
2175 ASSERT_FALSE(
2176 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2177 .c_str()),
2178 &value));
2179 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002180 ASSERT_EQ(1, (int)result.size());
2181 bool expectedReadLogsEnabled = false;
2182 ASSERT_TRUE(
2183 result.getBoolean(String16(BnIncrementalService::METRICS_READ_LOGS_ENABLED().c_str()),
2184 &expectedReadLogsEnabled));
2185 ASSERT_EQ(mVold->readLogsEnabled(), expectedReadLogsEnabled);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002186}
2187
2188TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2189 mVold->setIncFsMountOptionsSuccess();
2190 TemporaryDir tempDir;
2191 int storageId =
2192 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2193 IncrementalService::CreateOptions::CreateNew);
2194 ASSERT_GE(storageId, 0);
2195 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2196 {}, {}));
2197 android::os::PersistableBundle result{};
2198 mIncrementalService->getMetrics(storageId, &result);
2199 int64_t expected = -1, value = -1;
2200 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2201 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002202 ASSERT_EQ(6, (int)result.size());
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002203}
2204
Songchun Fan3c82a302019-11-29 14:23:45 -08002205} // namespace android::os::incremental