blob: 68586a89ff07575814a2a77410ff442bfc34f7a8 [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:
52 MOCK_CONST_METHOD4(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080053 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080054 int32_t flags,
55 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() {
65 ON_CALL(*this, mountIncFs(_, _, _, _))
66 .WillByDefault(
67 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68 }
69 void mountIncFsInvalidControlParcel() {
70 ON_CALL(*this, mountIncFs(_, _, _, _))
71 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72 }
73 void mountIncFsSuccess() {
74 ON_CALL(*this, mountIncFs(_, _, _, _))
75 .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,
96 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080097 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080098 return binder::Status::ok();
99 }
100 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
101 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800102 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
103 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
104 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800105 return binder::Status::ok();
106 }
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700107 binder::Status setIncFsMountOptionsOk(
108 const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
109 bool enableReadLogs, bool enableReadTimeouts) {
110 mReadLogsEnabled = enableReadLogs;
111 mReadTimeoutsEnabled = enableReadTimeouts;
112 return binder::Status::ok();
113 }
114
115 bool readLogsEnabled() const { return mReadLogsEnabled; }
116 bool readTimeoutsEnabled() const { return mReadTimeoutsEnabled; }
Songchun Fan3c82a302019-11-29 14:23:45 -0800117
118private:
119 TemporaryFile cmdFile;
120 TemporaryFile logFile;
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700121
122 bool mReadLogsEnabled = false;
123 bool mReadTimeoutsEnabled = true;
Songchun Fan3c82a302019-11-29 14:23:45 -0800124};
125
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700126class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800127public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700128 MockDataLoader() {
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700129 initializeCreateOk();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700130 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
131 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
132 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
133 ON_CALL(*this, prepareImage(_, _, _))
134 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700135 }
Songchun Fan68645c42020-02-27 15:57:35 -0800136 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700137 MOCK_METHOD4(create,
138 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
139 const FileSystemControlParcel& control,
140 const sp<IDataLoaderStatusListener>& listener));
141 MOCK_METHOD1(start, binder::Status(int32_t id));
142 MOCK_METHOD1(stop, binder::Status(int32_t id));
143 MOCK_METHOD1(destroy, binder::Status(int32_t id));
144 MOCK_METHOD3(prepareImage,
145 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
146 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700147
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700148 void initializeCreateOk() {
149 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
150 }
151
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700152 void initializeCreateOkNoStatus() {
153 ON_CALL(*this, create(_, _, _, _))
154 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
155 }
156
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700157 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
158 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700159 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700160 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700161 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700162 return binder::Status::ok();
163 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700164 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
165 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700166 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700167 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700168 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700169 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700170 return binder::Status::ok();
171 }
172 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700173 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700174 return binder::Status::ok();
175 }
176 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700177 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700178 return binder::Status::ok();
179 }
180 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700181 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700182 mListener = nullptr;
183 return binder::Status::ok();
184 }
185 binder::Status prepareImageOk(int32_t id,
186 const ::std::vector<content::pm::InstallationFileParcel>&,
187 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700188 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700189 return binder::Status::ok();
190 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700191 int32_t setStorageParams(bool enableReadLogs) {
192 int32_t result = -1;
193 EXPECT_NE(mServiceConnector.get(), nullptr);
194 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
195 return result;
196 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700197 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700198
199private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700200 void setAndReportStatus(int id, int status) {
201 mStatus = status;
202 reportStatus(id);
203 }
204 void reportStatus(int id) {
205 if (mListener) {
206 mListener->onStatusChanged(id, mStatus);
207 }
208 }
209
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700210 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700211 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700212 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800213};
214
215class MockDataLoaderManager : public DataLoaderManagerWrapper {
216public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700217 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
218 EXPECT_TRUE(mDataLoaderHolder != nullptr);
219 }
220
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800221 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800222 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800223 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800224 const sp<IDataLoaderStatusListener>& listener,
225 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800226 MOCK_CONST_METHOD2(getDataLoader,
227 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800229
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700230 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800231 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700232 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700233 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700234 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800235 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700236 .WillByDefault(Return(
237 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
238 }
239 void getDataLoaderSuccess() {
240 ON_CALL(*this, getDataLoader(_, _))
241 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
242 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700243 void unbindFromDataLoaderSuccess() {
244 ON_CALL(*this, unbindFromDataLoader(_))
245 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700246 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700247 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800248 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700249 const sp<IDataLoaderStatusListener>& listener,
250 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800251 mId = mountId;
252 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700253 mDataLoader = mDataLoaderHolder;
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700254 mBindDelayMs = bindDelayMs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800255 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700256 if (mListener) {
257 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
258 }
259 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800260 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800261 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
262 const DataLoaderParamsParcel& params,
263 int bindDelayMs,
264 const sp<IDataLoaderStatusListener>& listener,
265 bool* _aidl_return) {
266 CHECK(bindDelayMs == 0) << bindDelayMs;
267 *_aidl_return = false;
268 return binder::Status::ok();
269 }
270 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
271 const DataLoaderParamsParcel& params,
272 int bindDelayMs,
273 const sp<IDataLoaderStatusListener>& listener,
274 bool* _aidl_return) {
275 CHECK(bindDelayMs == 0) << bindDelayMs;
276 *_aidl_return = true;
277 if (listener) {
278 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
279 }
280 return binder::Status::ok();
281 }
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700282 binder::Status bindToDataLoaderOkWithNoDelay(int32_t mountId,
283 const DataLoaderParamsParcel& params,
284 int bindDelayMs,
285 const sp<IDataLoaderStatusListener>& listener,
286 bool* _aidl_return) {
287 CHECK(bindDelayMs == 0) << bindDelayMs;
288 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
289 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700290 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
291 const DataLoaderParamsParcel& params,
292 int bindDelayMs,
293 const sp<IDataLoaderStatusListener>& listener,
294 bool* _aidl_return) {
295 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
296 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
297 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800298 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
299 const DataLoaderParamsParcel& params,
300 int bindDelayMs,
301 const sp<IDataLoaderStatusListener>& listener,
302 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700303 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800304 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
305 }
306 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
307 const DataLoaderParamsParcel& params,
308 int bindDelayMs,
309 const sp<IDataLoaderStatusListener>& listener,
310 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700311 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800312 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
313 }
314 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
315 const DataLoaderParamsParcel& params,
316 int bindDelayMs,
317 const sp<IDataLoaderStatusListener>& listener,
318 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700319 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
320 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800321 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
322 }
323 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
324 const DataLoaderParamsParcel& params,
325 int bindDelayMs,
326 const sp<IDataLoaderStatusListener>& listener,
327 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700328 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800329 << bindDelayMs;
330 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
331 }
332
Songchun Fan68645c42020-02-27 15:57:35 -0800333 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
334 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800335 return binder::Status::ok();
336 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700337 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800338 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800339 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700340 void setDataLoaderStatusStarted() {
341 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
342 }
343 void setDataLoaderStatusDestroyed() {
344 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
345 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700346 void setDataLoaderStatusUnavailable() {
347 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
348 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800349 void setDataLoaderStatusUnrecoverable() {
350 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
351 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700352 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700353 mBindDelayMs = -1;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700354 if (mDataLoader) {
355 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
356 return status;
357 }
358 mDataLoader = nullptr;
Alex Buynytskyyde4b8232021-04-25 12:43:26 -0700359 } else if (mListener) {
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700360 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
361 }
362 return binder::Status::ok();
363 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700364
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700365 int bindDelayMs() const { return mBindDelayMs; }
366
Songchun Fan3c82a302019-11-29 14:23:45 -0800367private:
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700368 int mId = -1;
369 int mBindDelayMs = -1;
Songchun Fan3c82a302019-11-29 14:23:45 -0800370 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700371 sp<IDataLoader> mDataLoader;
372 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800373};
374
375class MockIncFs : public IncFsWrapper {
376public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800377 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700378 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
379 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800380 MOCK_CONST_METHOD4(createControl,
381 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
382 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800383 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800384 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800385 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800386 MOCK_CONST_METHOD4(makeMappedFile,
387 ErrorCode(const Control& control, std::string_view path, int mode,
388 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800389 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700390 MOCK_CONST_METHOD3(makeDirs,
391 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800392 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
393 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
394 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700395 MOCK_CONST_METHOD2(countFilledBlocks,
396 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
397 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700398 MOCK_CONST_METHOD2(isFileFullyLoaded,
399 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700400 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700401 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800402 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700403 ErrorCode(const Control& control, std::string_view from,
404 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800405 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700406 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700407 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700408 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700409 MOCK_CONST_METHOD3(waitForPendingReads,
410 WaitResult(const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700411 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800412 MOCK_CONST_METHOD2(setUidReadTimeouts,
413 ErrorCode(const Control& control,
414 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700415 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
416 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700417
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700418 MockIncFs() {
419 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
420 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
421 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800422
423 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
424 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700425
426 void countFilledBlocksSuccess() {
427 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
428 }
429
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700430 void countFilledBlocksFullyLoaded() {
431 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
432 }
433
Songchun Fan374f7652020-08-20 08:40:29 -0700434 void countFilledBlocksFails() {
435 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
436 }
437
438 void countFilledBlocksEmpty() {
439 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
440 }
441
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700442 void openMountSuccess() {
443 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
444 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700445
446 // 1000ms
447 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700448 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700449 .WillByDefault(
450 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700451 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700452 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
453 return android::incfs::WaitResult::HaveData;
454 }));
455 }
456
457 void waitForPendingReadsTimeout() {
458 ON_CALL(*this, waitForPendingReads(_, _, _))
459 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700460 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700461
462 static constexpr auto kPendingReadsFd = 42;
463 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800464 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700465 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700466
Songchun Fan20d6ef22020-03-03 09:47:15 -0800467 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800468 metadata::Mount m;
469 m.mutable_storage()->set_id(100);
470 m.mutable_loader()->set_package_name("com.test");
471 m.mutable_loader()->set_arguments("com.uri");
472 const auto metadata = m.SerializeAsString();
473 m.mutable_loader()->release_arguments();
474 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800475 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800476 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800477 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800478 metadata::Storage st;
479 st.set_id(100);
480 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800481 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800482 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800483 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800484 metadata::BindPoint bp;
485 std::string destPath = "dest";
486 std::string srcPath = "src";
487 bp.set_storage_id(100);
488 bp.set_allocated_dest_path(&destPath);
489 bp.set_allocated_source_subdir(&srcPath);
490 const auto metadata = bp.SerializeAsString();
491 bp.release_source_subdir();
492 bp.release_dest_path();
493 return std::vector<char>(metadata.begin(), metadata.end());
494 }
495};
496
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700497class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700498public:
499 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700500 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700501 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
502
503 void checkPermissionSuccess() {
504 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
505 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800506 void checkPermissionNoCrossUsers() {
507 ON_CALL(*this,
508 checkPermission("android.permission.LOADER_USAGE_STATS",
509 "android:loader_usage_stats", _))
510 .WillByDefault(Return(android::incremental::Ok()));
511 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
512 .WillByDefault(
513 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
514 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700515 void checkPermissionFails() {
516 ON_CALL(*this, checkPermission(_, _, _))
517 .WillByDefault(
518 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
519 }
520 void initializeStartWatchingMode() {
521 ON_CALL(*this, startWatchingMode(_, _, _))
522 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
523 }
524 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
525 mStoredCallback = cb;
526 }
527
528 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700529};
530
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700531class MockJniWrapper : public JniWrapper {
532public:
533 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
534
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700535 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700536};
537
538class MockLooperWrapper : public LooperWrapper {
539public:
540 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
541 MOCK_METHOD1(removeFd, int(int));
542 MOCK_METHOD0(wake, void());
543 MOCK_METHOD1(pollAll, int(int));
544
545 MockLooperWrapper() {
546 ON_CALL(*this, addFd(_, _, _, _, _))
547 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
548 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700549 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700550 }
551
552 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
553 mCallback = callback;
554 mCallbackData = data;
555 return 0;
556 }
557
558 int clearCallback(int) {
559 mCallback = nullptr;
560 mCallbackData = nullptr;
561 return 0;
562 }
563
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700564 int wait10Ms(int) {
565 // This is called from a loop in runCmdLooper.
566 // Sleeping for 10ms only to avoid busy looping.
567 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700568 return 0;
569 }
570
571 android::Looper_callbackFunc mCallback = nullptr;
572 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700573};
574
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700575class MockTimedQueueWrapper : public TimedQueueWrapper {
576public:
577 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
578 MOCK_METHOD1(removeJobs, void(MountId));
579 MOCK_METHOD0(stop, void());
580
581 MockTimedQueueWrapper() {
582 ON_CALL(*this, addJob(_, _, _))
583 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
584 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
585 }
586
587 void storeJob(MountId id, Milliseconds after, Job what) {
588 mId = id;
589 mAfter = after;
590 mWhat = std::move(what);
591 }
592
593 void clearJob(MountId id) {
594 if (mId == id) {
595 mAfter = {};
596 mWhat = {};
597 }
598 }
599
600 MountId mId = -1;
601 Milliseconds mAfter;
602 Job mWhat;
603};
604
Songchun Fan374f7652020-08-20 08:40:29 -0700605class MockFsWrapper : public FsWrapper {
606public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800607 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
608 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700609 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800610 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700611 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
612 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800613 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
614 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
615 if (!onFile(file)) break;
616 }
Songchun Fan374f7652020-08-20 08:40:29 -0700617 }
618};
619
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800620class MockClockWrapper : public ClockWrapper {
621public:
622 MOCK_CONST_METHOD0(now, TimePoint());
623
624 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700625
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800626 template <class Delta>
627 void advance(Delta delta) {
628 mClock += delta;
629 }
630
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700631 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
632
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800633 TimePoint getClock() const { return mClock; }
634
635 TimePoint mClock = Clock::now();
636};
637
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700638class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
639public:
640 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
641
642 MockStorageHealthListener() {
643 ON_CALL(*this, onHealthStatus(_, _))
644 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
645 }
646
647 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
648 mStorageId = storageId;
649 mStatus = status;
650 return binder::Status::ok();
651 }
652
653 int32_t mStorageId = -1;
654 int32_t mStatus = -1;
655};
656
Songchun Fana7098592020-09-03 11:45:53 -0700657class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
658public:
659 MockStorageLoadingProgressListener() = default;
660 MOCK_METHOD2(onStorageLoadingProgressChanged,
661 binder::Status(int32_t storageId, float progress));
662 MOCK_METHOD0(onAsBinder, IBinder*());
663};
664
Songchun Fan3c82a302019-11-29 14:23:45 -0800665class MockServiceManager : public ServiceManagerWrapper {
666public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800667 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700668 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700669 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700670 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700671 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700672 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700673 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700674 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800675 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800676 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700677 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700678 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700679 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700680 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700681 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700682 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700683 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800684 mFs(std::move(fs)),
685 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800686 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800687 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
688 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800689 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800690 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700691 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
692 return std::move(mAppOpsManager);
693 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700694 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700695 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700696 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700697 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
698 return std::move(mProgressUpdateJobQueue);
699 }
Songchun Fan374f7652020-08-20 08:40:29 -0700700 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800701 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800702
703private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800704 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800705 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800706 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700707 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700708 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700709 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700710 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700711 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700712 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800713 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800714};
715
716// --- IncrementalServiceTest ---
717
Songchun Fan3c82a302019-11-29 14:23:45 -0800718class IncrementalServiceTest : public testing::Test {
719public:
720 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800721 auto vold = std::make_unique<NiceMock<MockVoldService>>();
722 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700723 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
724 mDataLoader = dataLoader.get();
725 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800726 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800727 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
728 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700729 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
730 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700731 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
732 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700733 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
734 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700735 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
736 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700737 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
738 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700739 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
740 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800741 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
742 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700743 mIncrementalService = std::make_unique<
744 IncrementalService>(MockServiceManager(std::move(vold),
745 std::move(dataloaderManager),
746 std::move(incFs), std::move(appOps),
747 std::move(jni), std::move(looper),
748 std::move(timedQueue),
749 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800750 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700751 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800752 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800753 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700754 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800755 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800756 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700757 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800758 }
759
760 void setUpExistingMountDir(const std::string& rootDir) {
761 const auto dir = rootDir + "/dir1";
762 const auto mountDir = dir + "/mount";
763 const auto backingDir = dir + "/backing_store";
764 const auto storageDir = mountDir + "/st0";
765 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
766 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
767 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
768 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
769 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
770 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
771 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
772 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800773 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
774 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
775 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
776 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
777 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
778 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800779 }
780
Songchun Fan374f7652020-08-20 08:40:29 -0700781 void setupSuccess() {
782 mVold->mountIncFsSuccess();
783 mIncFs->makeFileSuccess();
784 mVold->bindMountSuccess();
785 mDataLoaderManager->bindToDataLoaderSuccess();
786 mDataLoaderManager->getDataLoaderSuccess();
787 }
788
Songchun Fan9471be52021-04-21 17:49:27 -0700789 void checkHealthMetrics(int storageId, long expectedMillisSinceOldestPendingRead,
790 int expectedStorageHealthStatusCode) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000791 android::os::PersistableBundle result{};
792 mIncrementalService->getMetrics(storageId, &result);
Songchun Fan9471be52021-04-21 17:49:27 -0700793 ASSERT_EQ(6, (int)result.size());
794 int64_t millisSinceOldestPendingRead = -1;
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000795 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
796 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
797 .c_str()),
Songchun Fan9471be52021-04-21 17:49:27 -0700798 &millisSinceOldestPendingRead));
799 ASSERT_EQ(expectedMillisSinceOldestPendingRead, millisSinceOldestPendingRead);
800 int storageHealthStatusCode = -1;
801 ASSERT_TRUE(
802 result.getInt(String16(BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE()
803 .c_str()),
804 &storageHealthStatusCode));
805 ASSERT_EQ(expectedStorageHealthStatusCode, storageHealthStatusCode);
806 int dataLoaderStatusCode = -1;
807 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
808 .c_str()),
809 &dataLoaderStatusCode));
810 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatusCode);
811 }
812
813 void checkBindingMetrics(int storageId, int64_t expectedMillisSinceLastDataLoaderBind,
814 int64_t expectedDataLoaderBindDelayMillis) {
815 android::os::PersistableBundle result{};
816 mIncrementalService->getMetrics(storageId, &result);
817 ASSERT_EQ(6, (int)result.size());
818 int dataLoaderStatus = -1;
819 ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
820 .c_str()),
821 &dataLoaderStatus));
822 ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatus);
823 int64_t millisSinceLastDataLoaderBind = -1;
824 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
825 METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND()
826 .c_str()),
827 &millisSinceLastDataLoaderBind));
828 ASSERT_EQ(expectedMillisSinceLastDataLoaderBind, millisSinceLastDataLoaderBind);
829 int64_t dataLoaderBindDelayMillis = -1;
830 ASSERT_TRUE(
831 result.getLong(String16(
832 BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS()
833 .c_str()),
834 &dataLoaderBindDelayMillis));
835 ASSERT_EQ(expectedDataLoaderBindDelayMillis, dataLoaderBindDelayMillis);
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000836 }
837
Songchun Fan3c82a302019-11-29 14:23:45 -0800838protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700839 NiceMock<MockVoldService>* mVold = nullptr;
840 NiceMock<MockIncFs>* mIncFs = nullptr;
841 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
842 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
843 NiceMock<MockJniWrapper>* mJni = nullptr;
844 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700845 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700846 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700847 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800848 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700849 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800850 std::unique_ptr<IncrementalService> mIncrementalService;
851 TemporaryDir mRootDir;
852 DataLoaderParamsParcel mDataLoaderParcel;
853};
854
Songchun Fan3c82a302019-11-29 14:23:45 -0800855TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
856 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800857 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800858 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800859 int storageId =
860 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
861 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800862 ASSERT_LT(storageId, 0);
863}
864
865TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
866 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800867 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700868 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800869 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800870 int storageId =
871 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
872 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800873 ASSERT_LT(storageId, 0);
874}
875
876TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
877 mVold->mountIncFsSuccess();
878 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800879 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700880 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800881 EXPECT_CALL(*mVold, unmountIncFs(_));
882 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800883 int storageId =
884 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
885 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800886 ASSERT_LT(storageId, 0);
887}
888
889TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
890 mVold->mountIncFsSuccess();
891 mIncFs->makeFileSuccess();
892 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800893 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700894 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800895 EXPECT_CALL(*mVold, unmountIncFs(_));
896 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800897 int storageId =
898 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
899 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800900 ASSERT_LT(storageId, 0);
901}
902
903TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
904 mVold->mountIncFsSuccess();
905 mIncFs->makeFileSuccess();
906 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700907 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800908 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700909 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700910 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
911 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
912 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800913 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
914 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800915 int storageId =
916 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
917 IncrementalService::CreateOptions::CreateNew);
918 ASSERT_GE(storageId, 0);
919 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800920}
921
922TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700923 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800924 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700925 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800926 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
927 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800928 int storageId =
929 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
930 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800931 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800932 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800933 mIncrementalService->deleteStorage(storageId);
934}
935
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800936TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700937 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700938 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700939 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
940 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700941 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800942 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
943 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800944 int storageId =
945 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
946 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800947 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800948 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800949
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700950 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800951
952 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
953 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700954 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700955 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700956 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700957 checkBindingMetrics(storageId, 0, 0);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700958 mDataLoaderManager->setDataLoaderStatusDestroyed();
959
960 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
961 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800962 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700963 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700964 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700965 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
966 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800967 mDataLoaderManager->setDataLoaderStatusDestroyed();
968
969 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
970 .WillByDefault(Invoke(mDataLoaderManager,
971 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700972 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700973 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700974 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
975 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800976 mDataLoaderManager->setDataLoaderStatusDestroyed();
977
978 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
979 .WillByDefault(Invoke(mDataLoaderManager,
980 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700981 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700982 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -0700983 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
984 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800985 mDataLoaderManager->setDataLoaderStatusDestroyed();
986
987 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
988 .WillByDefault(Invoke(mDataLoaderManager,
989 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -0700990 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700991 // Try the reduced delay, just in case.
992 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Songchun Fan9471be52021-04-21 17:49:27 -0700993 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs() / 2,
994 mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800995 mDataLoaderManager->setDataLoaderStatusDestroyed();
996
997 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
998 .WillByDefault(Invoke(mDataLoaderManager,
999 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Songchun Fan9471be52021-04-21 17:49:27 -07001000 checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001001 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Songchun Fan9471be52021-04-21 17:49:27 -07001002 checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
1003 mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001004 mDataLoaderManager->setDataLoaderStatusDestroyed();
1005}
1006
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001007TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
1008 mIncFs->waitForPendingReadsSuccess();
1009 mIncFs->openMountSuccess();
1010
1011 constexpr auto bindRetryInterval = 5s;
1012
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001013 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001014 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001015 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
1016 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001017 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1018 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001019 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001020 TemporaryDir tempDir;
1021 int storageId =
1022 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1023 IncrementalService::CreateOptions::CreateNew);
1024 ASSERT_GE(storageId, 0);
1025
1026 // First binds to DataLoader fails... because it's restart.
1027 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1028 .WillByDefault(Invoke(mDataLoaderManager,
1029 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
1030
1031 // Request DL start.
1032 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
1033
1034 // Retry callback present.
1035 ASSERT_EQ(storageId, mTimedQueue->mId);
1036 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1037 auto retryCallback = mTimedQueue->mWhat;
1038 mTimedQueue->clearJob(storageId);
1039
1040 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
1041 mClock->advance(5s);
1042
1043 retryCallback();
1044 // Retry callback present.
1045 ASSERT_EQ(storageId, mTimedQueue->mId);
1046 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1047 retryCallback = mTimedQueue->mWhat;
1048 mTimedQueue->clearJob(storageId);
1049
1050 // Returning "binding" so that we can retry.
1051 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1052 .WillByDefault(Invoke(mDataLoaderManager,
1053 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
1054
1055 // Expecting bindToDataLoaderBindingWithNoDelay call.
1056 mClock->advance(5s);
1057
1058 retryCallback();
1059 // No retry callback.
1060 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1061 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1062
1063 // Should not change the bindToDataLoader call count
1064 ASSERT_NE(nullptr, mLooper->mCallback);
1065 ASSERT_NE(nullptr, mLooper->mCallbackData);
1066 auto looperCb = mLooper->mCallback;
1067 auto looperCbData = mLooper->mCallbackData;
1068 looperCb(-1, -1, looperCbData);
1069
1070 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1071 mClock->advance(5s);
1072
1073 // Use pending reads callback to trigger binding.
1074 looperCb(-1, -1, looperCbData);
1075
1076 // No retry callback.
1077 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1078 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1079
1080 // Now we are out of 10m "retry" budget, let's finally bind.
1081 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1082 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1083 mClock->advance(11min);
1084
1085 // Use pending reads callback to trigger binding.
1086 looperCb(-1, -1, looperCbData);
1087
1088 // No retry callback.
1089 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1090 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1091
1092 // And test the rest of the backoff.
1093 // Simulated crash/other connection breakage.
1094 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1095 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001096 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001097 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001098 mDataLoaderManager->setDataLoaderStatusDestroyed();
1099
1100 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1101 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001102 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001103 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001104 mDataLoaderManager->setDataLoaderStatusDestroyed();
1105
1106 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1107 .WillByDefault(Invoke(mDataLoaderManager,
1108 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001109 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001110 mDataLoaderManager->setDataLoaderStatusDestroyed();
1111
1112 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1113 .WillByDefault(Invoke(mDataLoaderManager,
1114 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001115 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001116 mDataLoaderManager->setDataLoaderStatusDestroyed();
1117
1118 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1119 .WillByDefault(Invoke(mDataLoaderManager,
1120 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001121 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001122 mDataLoaderManager->setDataLoaderStatusDestroyed();
1123
1124 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1125 .WillByDefault(Invoke(mDataLoaderManager,
1126 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001127 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001128 mDataLoaderManager->setDataLoaderStatusDestroyed();
1129}
1130
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001131TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001132 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001133 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001134 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001135 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1136 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1137 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1138 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1139 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001140 int storageId =
1141 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1142 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001143 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001144 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1145 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001146 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001147 mDataLoaderManager->setDataLoaderStatusStarted();
1148}
1149
1150TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001151 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001152 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001153 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001154 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001155 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1156 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1157 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1158 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001159 int storageId =
1160 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1161 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001162 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001163 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1164 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001165 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001166}
1167
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001168TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001169 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001170 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001171 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1172 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1173 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1174 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1175 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1176 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001177 int storageId =
1178 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1179 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001180 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001181 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1182 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001183 mDataLoaderManager->setDataLoaderStatusUnavailable();
1184}
1185
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001186TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1187 mDataLoader->initializeCreateOkNoStatus();
1188 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1189 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1190 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1191 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1192 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1193 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1194 TemporaryDir tempDir;
1195 int storageId =
1196 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1197 IncrementalService::CreateOptions::CreateNew);
1198 ASSERT_GE(storageId, 0);
1199 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1200 {}, {}));
1201 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1202}
1203
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001204TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001205 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001206 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001207 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001208
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001209 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001210 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001211 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1212 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001213 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001214 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1215 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1216 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1217 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001218 int storageId =
1219 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1220 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001221 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001222 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1223 {}, {}));
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001224 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1225
1226 // Timed callback present.
1227 ASSERT_EQ(storageId, mTimedQueue->mId);
1228 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1229 auto timedCallback = mTimedQueue->mWhat;
1230 mTimedQueue->clearJob(storageId);
1231
1232 // First callback call to propagate unrecoverable.
1233 timedCallback();
1234
1235 // And second call to trigger recreation.
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001236 ASSERT_NE(nullptr, mLooper->mCallback);
1237 ASSERT_NE(nullptr, mLooper->mCallbackData);
1238 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1239}
1240
Alex Buynytskyyde4b8232021-04-25 12:43:26 -07001241TEST_F(IncrementalServiceTest, testStartDataLoaderUnavailable) {
1242 mIncFs->openMountSuccess();
1243 mDataLoader->initializeCreateOkNoStatus();
1244
1245 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(3);
1246 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(3);
1247 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(3);
1248 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1249 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
1250 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1251 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1252 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1253 TemporaryDir tempDir;
1254 int storageId =
1255 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1256 IncrementalService::CreateOptions::CreateNew);
1257 ASSERT_GE(storageId, 0);
1258
1259 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1260 .WillByDefault(Invoke(mDataLoaderManager,
1261 &MockDataLoaderManager::bindToDataLoaderOkWithNoDelay));
1262
1263 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1264 {}, {}));
1265
1266 // Unavailable.
1267 mDataLoaderManager->setDataLoaderStatusUnavailable();
1268
1269 // Timed callback present.
1270 ASSERT_EQ(storageId, mTimedQueue->mId);
1271 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1272 auto timedCallback = mTimedQueue->mWhat;
1273 mTimedQueue->clearJob(storageId);
1274
1275 // Propagating unavailable and expecting it to trigger rebind with 1s retry delay.
1276 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1277 .WillByDefault(Invoke(mDataLoaderManager,
1278 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1279 timedCallback();
1280
1281 // Unavailable #2.
1282 mDataLoaderManager->setDataLoaderStatusUnavailable();
1283
1284 // Timed callback present.
1285 ASSERT_EQ(storageId, mTimedQueue->mId);
1286 ASSERT_GE(mTimedQueue->mAfter, 10ms);
1287 timedCallback = mTimedQueue->mWhat;
1288 mTimedQueue->clearJob(storageId);
1289
1290 // Propagating unavailable and expecting it to trigger rebind with 10s retry delay.
1291 // This time succeed.
1292 mDataLoader->initializeCreateOk();
1293 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1294 .WillByDefault(Invoke(mDataLoaderManager,
1295 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1296 timedCallback();
1297}
1298
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001299TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001300 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001301
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001302 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001303 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1304 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1305 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1306 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1307 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1308 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1309 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001310 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001311
1312 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1313 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1314 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1315 .Times(2);
1316 EXPECT_CALL(*listenerMock,
1317 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1318 .Times(1);
1319 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1320 .Times(1);
1321 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1322 .Times(2);
1323
1324 StorageHealthCheckParams params;
1325 params.blockedTimeoutMs = 10000;
1326 params.unhealthyTimeoutMs = 20000;
1327 params.unhealthyMonitoringMs = 30000;
1328
1329 using MS = std::chrono::milliseconds;
1330 using MCS = std::chrono::microseconds;
1331
1332 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1333 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1334 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1335
1336 const uint64_t kFirstTimestampUs = 1000000000ll;
1337 const uint64_t kBlockedTimestampUs =
1338 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1339 const uint64_t kUnhealthyTimestampUs =
1340 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1341
1342 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001343 int storageId =
1344 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1345 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001346 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001347 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1348 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001349
1350 // Healthy state, registered for pending reads.
1351 ASSERT_NE(nullptr, mLooper->mCallback);
1352 ASSERT_NE(nullptr, mLooper->mCallbackData);
1353 ASSERT_EQ(storageId, listener->mStorageId);
1354 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001355 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001356
1357 // Looper/epoll callback.
1358 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1359 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1360
1361 // Unregister from pending reads and wait.
1362 ASSERT_EQ(nullptr, mLooper->mCallback);
1363 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1364 ASSERT_EQ(storageId, listener->mStorageId);
1365 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1366 // Timed callback present.
1367 ASSERT_EQ(storageId, mTimedQueue->mId);
1368 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1369 auto timedCallback = mTimedQueue->mWhat;
1370 mTimedQueue->clearJob(storageId);
1371
1372 // Timed job callback for blocked.
1373 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1374 timedCallback();
1375
1376 // Still not registered, and blocked.
1377 ASSERT_EQ(nullptr, mLooper->mCallback);
1378 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1379 ASSERT_EQ(storageId, listener->mStorageId);
1380 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001381 checkHealthMetrics(storageId, params.blockedTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001382
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001383 // Timed callback present.
1384 ASSERT_EQ(storageId, mTimedQueue->mId);
1385 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1386 timedCallback = mTimedQueue->mWhat;
1387 mTimedQueue->clearJob(storageId);
1388
1389 // Timed job callback for unhealthy.
1390 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1391 timedCallback();
1392
1393 // Still not registered, and blocked.
1394 ASSERT_EQ(nullptr, mLooper->mCallback);
1395 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1396 ASSERT_EQ(storageId, listener->mStorageId);
1397 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001398 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001399
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001400 // Timed callback present.
1401 ASSERT_EQ(storageId, mTimedQueue->mId);
1402 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1403 timedCallback = mTimedQueue->mWhat;
1404 mTimedQueue->clearJob(storageId);
1405
1406 // One more unhealthy.
1407 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1408 timedCallback();
1409
1410 // Still not registered, and blocked.
1411 ASSERT_EQ(nullptr, mLooper->mCallback);
1412 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1413 ASSERT_EQ(storageId, listener->mStorageId);
1414 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001415 checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001416
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001417 // Timed callback present.
1418 ASSERT_EQ(storageId, mTimedQueue->mId);
1419 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1420 timedCallback = mTimedQueue->mWhat;
1421 mTimedQueue->clearJob(storageId);
1422
1423 // And now healthy.
1424 mIncFs->waitForPendingReadsTimeout();
1425 timedCallback();
1426
1427 // Healthy state, registered for pending reads.
1428 ASSERT_NE(nullptr, mLooper->mCallback);
1429 ASSERT_NE(nullptr, mLooper->mCallbackData);
1430 ASSERT_EQ(storageId, listener->mStorageId);
1431 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan9471be52021-04-21 17:49:27 -07001432 checkHealthMetrics(storageId, 0, listener->mStatus);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001433}
1434
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001435TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001436 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001437 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001438
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001439 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001440 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001441 // on startLoading
1442 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001443 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001444 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001445 // After setIncFsMountOptions succeeded expecting to start watching.
1446 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1447 // Not expecting callback removal.
1448 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001449 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001450 int storageId =
1451 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1452 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001453 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001454 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1455 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001456 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001457}
1458
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001459TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001460 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001461 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001462
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001463 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1464 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1465 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001466 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1467 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001468 // After setIncFsMountOptions succeeded expecting to start watching.
1469 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1470 // Not expecting callback removal.
1471 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1472 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001473 int storageId =
1474 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1475 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001476 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001477 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1478 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001479 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1480 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001481 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001482 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1483}
1484
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001485TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1486 mVold->setIncFsMountOptionsSuccess();
1487 mAppOpsManager->checkPermissionSuccess();
1488
1489 const auto readLogsMaxInterval = 2h;
1490
1491 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1492 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1493 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001494 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(2);
1495 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001496 // After setIncFsMountOptions succeeded expecting to start watching.
1497 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1498 // Not expecting callback removal.
1499 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001500 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001501 TemporaryDir tempDir;
1502 int storageId =
1503 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1504 IncrementalService::CreateOptions::CreateNew);
1505 ASSERT_GE(storageId, 0);
1506 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1507 {}, {}));
1508
1509 // Disable readlogs callback present.
1510 ASSERT_EQ(storageId, mTimedQueue->mId);
1511 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1512 auto callback = mTimedQueue->mWhat;
1513 mTimedQueue->clearJob(storageId);
1514
1515 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1516 // Now advance clock for 1hr.
1517 mClock->advance(1h);
1518 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1519 // Now call the timed callback, it should turn off the readlogs.
1520 callback();
1521 // Now advance clock for 2hrs.
1522 mClock->advance(readLogsMaxInterval);
1523 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1524}
1525
1526TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1527 mVold->setIncFsMountOptionsSuccess();
1528 mAppOpsManager->checkPermissionSuccess();
1529
1530 const auto readLogsMaxInterval = 2h;
1531
1532 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1533 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1534 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001535 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(3);
1536 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001537 // After setIncFsMountOptions succeeded expecting to start watching.
1538 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1539 // Not expecting callback removal.
1540 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001541 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001542 // System data loader.
1543 mDataLoaderParcel.packageName = "android";
1544 TemporaryDir tempDir;
1545 int storageId =
1546 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1547 IncrementalService::CreateOptions::CreateNew);
1548 ASSERT_GE(storageId, 0);
1549 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1550 {}, {}));
1551
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001552 // IfsState callback.
1553 auto callback = mTimedQueue->mWhat;
1554 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001555
1556 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1557 // Now advance clock for 1hr.
1558 mClock->advance(1h);
1559 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1560 // Now advance clock for 2hrs.
1561 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001562 // IfsStorage callback should not affect anything.
1563 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001564 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1565}
1566
1567TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1568 mVold->setIncFsMountOptionsSuccess();
1569 mAppOpsManager->checkPermissionSuccess();
1570
1571 const auto readLogsMaxInterval = 2h;
1572
1573 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1574 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1575 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001576 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(5);
1577 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(3);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001578 // After setIncFsMountOptions succeeded expecting to start watching.
1579 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1580 // Not expecting callback removal.
1581 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001582 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001583 TemporaryDir tempDir;
1584 int storageId =
1585 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1586 IncrementalService::CreateOptions::CreateNew);
1587 ASSERT_GE(storageId, 0);
1588
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001589 // Before install - long timeouts.
1590 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1591
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001592 auto dataLoaderParcel = mDataLoaderParcel;
1593 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1594 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001595 // During install - short timeouts.
1596 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001597
1598 // Disable readlogs callback present.
1599 ASSERT_EQ(storageId, mTimedQueue->mId);
1600 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1601 auto callback = mTimedQueue->mWhat;
1602 mTimedQueue->clearJob(storageId);
1603
1604 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1605 // Now advance clock for 1.5hrs.
1606 mClock->advance(90min);
1607 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1608
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001609 mIncrementalService->onInstallationComplete(storageId);
1610 // After install - long timeouts.
1611 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1612
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001613 // New installation.
1614 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1615 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001616 // New installation - short timeouts.
1617 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001618
1619 // New callback present.
1620 ASSERT_EQ(storageId, mTimedQueue->mId);
1621 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1622 auto callback2 = mTimedQueue->mWhat;
1623 mTimedQueue->clearJob(storageId);
1624
1625 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1626 callback();
1627 // Advance clock for another 1.5hrs.
1628 mClock->advance(90min);
1629 // Still success even it's 3hrs past first install.
1630 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1631
1632 // New one should disable.
1633 callback2();
1634 // And timeout.
1635 mClock->advance(90min);
1636 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001637
1638 mIncrementalService->onInstallationComplete(storageId);
1639 // After install - long timeouts.
1640 ASSERT_TRUE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001641}
1642
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001643TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001644 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001645 mAppOpsManager->checkPermissionSuccess();
1646 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001647
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001648 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001649 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1650 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001651 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001652 // setIncFsMountOptions(false) is called on the callback.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001653 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001654 // After setIncFsMountOptions succeeded expecting to start watching.
1655 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1656 // After callback is called, disable read logs and remove callback.
1657 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1658 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001659 int storageId =
1660 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1661 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001662 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001663 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1664 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001665 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001666 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1667 mAppOpsManager->mStoredCallback->opChanged(0, {});
1668}
1669
1670TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001671 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001672
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001673 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001674 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1675 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001676 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1677 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001678 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1679 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1680 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001681 int storageId =
1682 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1683 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001684 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001685 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1686 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001687 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001688}
1689
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001690TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1691 mAppOpsManager->checkPermissionNoCrossUsers();
1692
1693 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1694 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1695 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001696 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1697 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001698 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1699 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1700 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001701 int storageId =
1702 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1703 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001704 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001705 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1706 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001707 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1708}
1709
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001710TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001711 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001712 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001713
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001714 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001715 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001716 // We are calling setIncFsMountOptions.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001717 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1718 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001719 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1720 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1721 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001722 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001723 int storageId =
1724 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1725 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001726 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001727 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1728 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001729 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001730}
1731
Songchun Fan3c82a302019-11-29 14:23:45 -08001732TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001733 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001734 int storageId =
1735 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1736 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001737 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001738
Songchun Fan103ba1d2020-02-03 17:32:32 -08001739 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001740 // <root>/*/mount/<storage>/test
1741 EXPECT_CALL(*mIncFs,
1742 makeDir(_, Truly([&](std::string_view arg) {
1743 return arg.starts_with(mRootDir.path) &&
1744 arg.ends_with("/mount/st_1_0/" + dir_path);
1745 }),
1746 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001747 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1748 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001749}
1750
1751TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001752 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001753 int storageId =
1754 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1755 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001756 auto first = "first"sv;
1757 auto second = "second"sv;
1758 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001759 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001760
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001761 EXPECT_CALL(*mIncFs,
1762 makeDirs(_, Truly([&](std::string_view arg) {
1763 return arg.starts_with(mRootDir.path) &&
1764 arg.ends_with("/mount/st_1_0/" + dir_path);
1765 }),
1766 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001767 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001768 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001769}
Songchun Fan374f7652020-08-20 08:40:29 -07001770
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001771TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001772 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001773 int storageId =
1774 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1775 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001776 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001777 .Times(1)
1778 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1779 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001780}
1781
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001782TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001783 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001784 int storageId =
1785 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1786 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001787 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001788 .Times(1)
1789 .WillOnce(Return(incfs::LoadingState(-1)));
1790 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001791}
1792
1793TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001794 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001795 int storageId =
1796 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1797 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001798 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001799 .Times(1)
1800 .WillOnce(Return(incfs::LoadingState::Full));
1801 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001802}
1803
Songchun Fan425862f2020-08-25 13:12:16 -07001804TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001805 mIncFs->countFilledBlocksSuccess();
1806 mFs->hasNoFile();
1807
1808 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001809 int storageId =
1810 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1811 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001812 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001813}
1814
1815TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1816 mIncFs->countFilledBlocksFails();
1817 mFs->hasFiles();
1818
1819 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001820 int storageId =
1821 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1822 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001823 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001824 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001825}
1826
Songchun Fan425862f2020-08-25 13:12:16 -07001827TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001828 mIncFs->countFilledBlocksEmpty();
1829 mFs->hasFiles();
1830
1831 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001832 int storageId =
1833 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1834 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001835 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001836 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001837}
1838
1839TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1840 mIncFs->countFilledBlocksSuccess();
1841 mFs->hasFiles();
1842
1843 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001844 int storageId =
1845 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1846 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001847 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001848 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001849}
Songchun Fana7098592020-09-03 11:45:53 -07001850
1851TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1852 mIncFs->countFilledBlocksSuccess();
1853 mFs->hasFiles();
1854
1855 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001856 int storageId =
1857 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1858 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001859 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1860 new NiceMock<MockStorageLoadingProgressListener>};
1861 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1862 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1863 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1864 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1865 // Timed callback present.
1866 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1867 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1868 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1869 timedCallback();
1870 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1871 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1872 mIncrementalService->unregisterLoadingProgressListener(storageId);
1873 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1874}
1875
1876TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1877 mIncFs->countFilledBlocksFails();
1878 mFs->hasFiles();
1879
1880 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001881 int storageId =
1882 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1883 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001884 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1885 new NiceMock<MockStorageLoadingProgressListener>};
1886 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1887 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1888 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1889}
Songchun Fan2570ec02020-10-08 17:22:33 -07001890
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001891TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1892 mFs->hasFiles();
1893
1894 const auto stateUpdateInterval = 1s;
1895
1896 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1897 // No unbinding just yet.
1898 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1899 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1900 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1901 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1902 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1903 // System data loader to get rid of readlog timeout callback.
1904 mDataLoaderParcel.packageName = "android";
1905 TemporaryDir tempDir;
1906 int storageId =
1907 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1908 IncrementalService::CreateOptions::CreateNew);
1909 ASSERT_GE(storageId, 0);
1910 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1911 {}, {}));
1912
1913 // Started.
1914 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1915
1916 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001917 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001918 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1919 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001920 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001921
1922 // Not loaded yet.
1923 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1924 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1925
1926 // Send the callback, should not do anything.
1927 callback();
1928
1929 // Still started.
1930 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1931
1932 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001933 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001934 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1935 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001936 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001937
1938 // Fully loaded.
1939 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1940 // Expect the unbind.
1941 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1942
1943 callback();
1944
1945 // Destroyed.
1946 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1947}
1948
1949TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1950 mFs->hasFiles();
1951
1952 // Readlogs.
1953 mVold->setIncFsMountOptionsSuccess();
1954 mAppOpsManager->checkPermissionSuccess();
1955
1956 const auto stateUpdateInterval = 1s;
1957
1958 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1959 // No unbinding just yet.
1960 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1961 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1962 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1963 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1964 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1965 // System data loader to get rid of readlog timeout callback.
1966 mDataLoaderParcel.packageName = "android";
1967 TemporaryDir tempDir;
1968 int storageId =
1969 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1970 IncrementalService::CreateOptions::CreateNew);
1971 ASSERT_GE(storageId, 0);
1972 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1973 {}, {}));
1974
1975 // Started.
1976 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1977
1978 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001979 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001980 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1981 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001982 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001983
1984 // Not loaded yet.
1985 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1986 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1987
1988 // Send the callback, should not do anything.
1989 callback();
1990
1991 // Still started.
1992 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1993
1994 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001995 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001996 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1997 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001998 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001999
2000 // Fully loaded.
2001 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2002 .WillOnce(Return(incfs::LoadingState::Full))
2003 .WillOnce(Return(incfs::LoadingState::Full));
2004 // But with readlogs.
2005 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2006
2007 // Send the callback, still nothing.
2008 callback();
2009
2010 // Still started.
2011 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2012
2013 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002014 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002015 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2016 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002017 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002018
2019 // Disable readlogs and expect the unbind.
2020 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2021 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2022
2023 callback();
2024
2025 // Destroyed.
2026 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
2027}
2028
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002029static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
2030 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
2031 std::vector<PerUidReadTimeouts> result;
2032 for (auto&& tuple : tuples) {
2033 result.emplace_back();
2034 auto& timeouts = result.back();
2035 timeouts.uid = std::get<0>(tuple);
2036 timeouts.minTimeUs = std::get<1>(tuple);
2037 timeouts.minPendingTimeUs = std::get<2>(tuple);
2038 timeouts.maxPendingTimeUs = std::get<3>(tuple);
2039 }
2040 return result;
2041}
2042
2043static ErrorCode checkPerUidTimeouts(const Control& control,
2044 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2045 std::vector<PerUidReadTimeouts> expected =
2046 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
2047 EXPECT_EQ(expected, perUidReadTimeouts);
2048 return 0;
2049}
2050
2051static ErrorCode checkPerUidTimeoutsEmpty(
2052 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2053 EXPECT_EQ(0u, perUidReadTimeouts.size());
2054 return 0;
2055}
2056
2057TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08002058 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002059 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2060 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002061 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002062 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
2063 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002064 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002065 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
2066 TemporaryDir tempDir;
2067 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002068 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2069 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002070 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002071 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2072 createPerUidTimeouts(
2073 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002074}
2075
2076TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2077 mVold->setIncFsMountOptionsSuccess();
2078 mAppOpsManager->checkPermissionSuccess();
2079 mFs->hasFiles();
2080
2081 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2082 // First call.
2083 .WillOnce(Invoke(&checkPerUidTimeouts))
2084 // Fully loaded and no readlogs.
2085 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2086 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2087
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002088 // Loading storage.
2089 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2090 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2091 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002092 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002093
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07002094 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2095 mDataLoaderParcel.packageName = "android";
2096
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002097 TemporaryDir tempDir;
2098 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002099 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2100 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002101 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002102 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2103 createPerUidTimeouts(
2104 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002105
2106 {
2107 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002108 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002109 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2110 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002111 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002112
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002113 // Call it again.
2114 timedCallback();
2115 }
2116
2117 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002118 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002119 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002120 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2121 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002122 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002123
2124 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002125 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2126
2127 // Call it again.
2128 timedCallback();
2129 }
2130
2131 {
2132 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002133 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002134 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2135 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002136 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002137
2138 // Now disable readlogs.
2139 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2140
2141 // Call it again.
2142 timedCallback();
2143 }
2144
2145 // No callbacks anymore -> fully loaded and no readlogs.
2146 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2147}
2148
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002149TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2150 const auto invalidStorageId = 100;
2151 android::os::PersistableBundle result{};
2152 mIncrementalService->getMetrics(invalidStorageId, &result);
2153 int64_t expected = -1, value = -1;
2154 ASSERT_FALSE(
2155 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2156 .c_str()),
2157 &value));
2158 ASSERT_EQ(expected, value);
2159 ASSERT_TRUE(result.empty());
2160}
2161
Songchun Fan9471be52021-04-21 17:49:27 -07002162TEST_F(IncrementalServiceTest, testNoDataLoaderMetrics) {
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002163 mVold->setIncFsMountOptionsSuccess();
2164 TemporaryDir tempDir;
2165 int storageId =
2166 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2167 IncrementalService::CreateOptions::CreateNew);
2168 ASSERT_GE(storageId, 0);
2169 android::os::PersistableBundle result{};
2170 mIncrementalService->getMetrics(storageId, &result);
2171 int64_t expected = -1, value = -1;
2172 ASSERT_FALSE(
2173 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2174 .c_str()),
2175 &value));
2176 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002177 ASSERT_EQ(1, (int)result.size());
2178 bool expectedReadLogsEnabled = false;
2179 ASSERT_TRUE(
2180 result.getBoolean(String16(BnIncrementalService::METRICS_READ_LOGS_ENABLED().c_str()),
2181 &expectedReadLogsEnabled));
2182 ASSERT_EQ(mVold->readLogsEnabled(), expectedReadLogsEnabled);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002183}
2184
2185TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2186 mVold->setIncFsMountOptionsSuccess();
2187 TemporaryDir tempDir;
2188 int storageId =
2189 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2190 IncrementalService::CreateOptions::CreateNew);
2191 ASSERT_GE(storageId, 0);
2192 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2193 {}, {}));
2194 android::os::PersistableBundle result{};
2195 mIncrementalService->getMetrics(storageId, &result);
2196 int64_t expected = -1, value = -1;
2197 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2198 ASSERT_EQ(expected, value);
Songchun Fan9471be52021-04-21 17:49:27 -07002199 ASSERT_EQ(6, (int)result.size());
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002200}
2201
Songchun Fan3c82a302019-11-29 14:23:45 -08002202} // namespace android::os::incremental