blob: 1ec446dff6a3d75ff39f56f7efd6a13ed934306a [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));
Songchun Fan374f7652020-08-20 08:40:29 -070059 MOCK_CONST_METHOD2(
60 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
62 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 {
86 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() {
91 ON_CALL(*this, setIncFsMountOptions(_, _)).WillByDefault(Return(binder::Status::ok()));
92 }
Songchun Fan3c82a302019-11-29 14:23:45 -080093 binder::Status getInvalidControlParcel(const std::string& imagePath,
94 const std::string& targetDir, int32_t flags,
95 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080096 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080097 return binder::Status::ok();
98 }
99 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
100 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800101 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
102 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
103 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800104 return binder::Status::ok();
105 }
106
107private:
108 TemporaryFile cmdFile;
109 TemporaryFile logFile;
Songchun Fan3c82a302019-11-29 14:23:45 -0800110};
111
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700112class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800113public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700114 MockDataLoader() {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700115 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
116 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
117 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
118 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
119 ON_CALL(*this, prepareImage(_, _, _))
120 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700121 }
Songchun Fan68645c42020-02-27 15:57:35 -0800122 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700123 MOCK_METHOD4(create,
124 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
125 const FileSystemControlParcel& control,
126 const sp<IDataLoaderStatusListener>& listener));
127 MOCK_METHOD1(start, binder::Status(int32_t id));
128 MOCK_METHOD1(stop, binder::Status(int32_t id));
129 MOCK_METHOD1(destroy, binder::Status(int32_t id));
130 MOCK_METHOD3(prepareImage,
131 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
132 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700133
134 void initializeCreateOkNoStatus() {
135 ON_CALL(*this, create(_, _, _, _))
136 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
137 }
138
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700139 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
140 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700141 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700142 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700143 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700144 return binder::Status::ok();
145 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700146 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
147 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700148 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700149 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700150 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700151 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700152 return binder::Status::ok();
153 }
154 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700155 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700156 return binder::Status::ok();
157 }
158 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700159 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700160 return binder::Status::ok();
161 }
162 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700163 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700164 mListener = nullptr;
165 return binder::Status::ok();
166 }
167 binder::Status prepareImageOk(int32_t id,
168 const ::std::vector<content::pm::InstallationFileParcel>&,
169 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700170 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700171 return binder::Status::ok();
172 }
Songchun Fan2570ec02020-10-08 17:22:33 -0700173 binder::Status storageError(int32_t id) {
174 if (mListener) {
175 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
176 }
177 return binder::Status::ok();
178 }
179 binder::Status transportError(int32_t id) {
180 if (mListener) {
181 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
182 }
183 return binder::Status::ok();
184 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700185 int32_t setStorageParams(bool enableReadLogs) {
186 int32_t result = -1;
187 EXPECT_NE(mServiceConnector.get(), nullptr);
188 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
189 return result;
190 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700191 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700192
193private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700194 void setAndReportStatus(int id, int status) {
195 mStatus = status;
196 reportStatus(id);
197 }
198 void reportStatus(int id) {
199 if (mListener) {
200 mListener->onStatusChanged(id, mStatus);
201 }
202 }
203
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700204 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700205 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700206 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800207};
208
209class MockDataLoaderManager : public DataLoaderManagerWrapper {
210public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700211 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
212 EXPECT_TRUE(mDataLoaderHolder != nullptr);
213 }
214
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800215 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800216 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800217 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800218 const sp<IDataLoaderStatusListener>& listener,
219 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800220 MOCK_CONST_METHOD2(getDataLoader,
221 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700222 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800223
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700224 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800225 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700226 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700227 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800229 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700230 .WillByDefault(Return(
231 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
232 }
233 void getDataLoaderSuccess() {
234 ON_CALL(*this, getDataLoader(_, _))
235 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
236 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700237 void unbindFromDataLoaderSuccess() {
238 ON_CALL(*this, unbindFromDataLoader(_))
239 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700240 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700241 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800242 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700243 const sp<IDataLoaderStatusListener>& listener,
244 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800245 mId = mountId;
246 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700247 mDataLoader = mDataLoaderHolder;
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700248 mBindDelayMs = bindDelayMs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800249 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700250 if (mListener) {
251 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
252 }
253 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800254 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800255 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
256 const DataLoaderParamsParcel& params,
257 int bindDelayMs,
258 const sp<IDataLoaderStatusListener>& listener,
259 bool* _aidl_return) {
260 CHECK(bindDelayMs == 0) << bindDelayMs;
261 *_aidl_return = false;
262 return binder::Status::ok();
263 }
264 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
265 const DataLoaderParamsParcel& params,
266 int bindDelayMs,
267 const sp<IDataLoaderStatusListener>& listener,
268 bool* _aidl_return) {
269 CHECK(bindDelayMs == 0) << bindDelayMs;
270 *_aidl_return = true;
271 if (listener) {
272 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
273 }
274 return binder::Status::ok();
275 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700276 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
277 const DataLoaderParamsParcel& params,
278 int bindDelayMs,
279 const sp<IDataLoaderStatusListener>& listener,
280 bool* _aidl_return) {
281 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
282 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
283 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800284 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
285 const DataLoaderParamsParcel& params,
286 int bindDelayMs,
287 const sp<IDataLoaderStatusListener>& listener,
288 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700289 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800290 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
291 }
292 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
293 const DataLoaderParamsParcel& params,
294 int bindDelayMs,
295 const sp<IDataLoaderStatusListener>& listener,
296 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700297 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800298 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
299 }
300 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
301 const DataLoaderParamsParcel& params,
302 int bindDelayMs,
303 const sp<IDataLoaderStatusListener>& listener,
304 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700305 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
306 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800307 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
308 }
309 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
310 const DataLoaderParamsParcel& params,
311 int bindDelayMs,
312 const sp<IDataLoaderStatusListener>& listener,
313 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700314 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800315 << bindDelayMs;
316 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
317 }
318
Songchun Fan68645c42020-02-27 15:57:35 -0800319 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
320 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800321 return binder::Status::ok();
322 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700323 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800324 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800325 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700326 void setDataLoaderStatusStarted() {
327 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
328 }
329 void setDataLoaderStatusDestroyed() {
330 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
331 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700332 void setDataLoaderStatusUnavailable() {
333 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
334 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800335 void setDataLoaderStatusUnrecoverable() {
336 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
337 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700338 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700339 if (mDataLoader) {
340 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
341 return status;
342 }
343 mDataLoader = nullptr;
344 }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700345 mBindDelayMs = -1;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700346 if (mListener) {
347 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
348 }
349 return binder::Status::ok();
350 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700351
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700352 int bindDelayMs() const { return mBindDelayMs; }
353
Songchun Fan3c82a302019-11-29 14:23:45 -0800354private:
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700355 int mId = -1;
356 int mBindDelayMs = -1;
Songchun Fan3c82a302019-11-29 14:23:45 -0800357 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700358 sp<IDataLoader> mDataLoader;
359 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800360};
361
362class MockIncFs : public IncFsWrapper {
363public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800364 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700365 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
366 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800367 MOCK_CONST_METHOD4(createControl,
368 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
369 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800370 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800371 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800372 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800373 MOCK_CONST_METHOD4(makeMappedFile,
374 ErrorCode(const Control& control, std::string_view path, int mode,
375 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800376 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700377 MOCK_CONST_METHOD3(makeDirs,
378 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800379 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
380 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
381 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700382 MOCK_CONST_METHOD2(countFilledBlocks,
383 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
384 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700385 MOCK_CONST_METHOD2(isFileFullyLoaded,
386 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700387 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700388 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800389 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700390 ErrorCode(const Control& control, std::string_view from,
391 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800392 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700393 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700394 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700395 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700396 MOCK_CONST_METHOD3(waitForPendingReads,
397 WaitResult(const Control& control, std::chrono::milliseconds timeout,
398 std::vector<incfs::ReadInfo>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800399 MOCK_CONST_METHOD2(setUidReadTimeouts,
400 ErrorCode(const Control& control,
401 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700402 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
403 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700404
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700405 MockIncFs() {
406 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
407 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
408 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800409
410 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
411 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700412
413 void countFilledBlocksSuccess() {
414 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
415 }
416
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700417 void countFilledBlocksFullyLoaded() {
418 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
419 }
420
Songchun Fan374f7652020-08-20 08:40:29 -0700421 void countFilledBlocksFails() {
422 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
423 }
424
425 void countFilledBlocksEmpty() {
426 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
427 }
428
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700429 void openMountSuccess() {
430 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
431 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700432
433 // 1000ms
434 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700435 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700436 .WillByDefault(
437 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
438 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
439 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
440 return android::incfs::WaitResult::HaveData;
441 }));
442 }
443
444 void waitForPendingReadsTimeout() {
445 ON_CALL(*this, waitForPendingReads(_, _, _))
446 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700447 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700448
449 static constexpr auto kPendingReadsFd = 42;
450 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800451 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700452 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700453
Songchun Fan20d6ef22020-03-03 09:47:15 -0800454 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800455 metadata::Mount m;
456 m.mutable_storage()->set_id(100);
457 m.mutable_loader()->set_package_name("com.test");
458 m.mutable_loader()->set_arguments("com.uri");
459 const auto metadata = m.SerializeAsString();
460 m.mutable_loader()->release_arguments();
461 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800462 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800463 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800464 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800465 metadata::Storage st;
466 st.set_id(100);
467 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800468 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800469 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800470 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800471 metadata::BindPoint bp;
472 std::string destPath = "dest";
473 std::string srcPath = "src";
474 bp.set_storage_id(100);
475 bp.set_allocated_dest_path(&destPath);
476 bp.set_allocated_source_subdir(&srcPath);
477 const auto metadata = bp.SerializeAsString();
478 bp.release_source_subdir();
479 bp.release_dest_path();
480 return std::vector<char>(metadata.begin(), metadata.end());
481 }
482};
483
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700484class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700485public:
486 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700487 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700488 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
489
490 void checkPermissionSuccess() {
491 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
492 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800493 void checkPermissionNoCrossUsers() {
494 ON_CALL(*this,
495 checkPermission("android.permission.LOADER_USAGE_STATS",
496 "android:loader_usage_stats", _))
497 .WillByDefault(Return(android::incremental::Ok()));
498 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
499 .WillByDefault(
500 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
501 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700502 void checkPermissionFails() {
503 ON_CALL(*this, checkPermission(_, _, _))
504 .WillByDefault(
505 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
506 }
507 void initializeStartWatchingMode() {
508 ON_CALL(*this, startWatchingMode(_, _, _))
509 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
510 }
511 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
512 mStoredCallback = cb;
513 }
514
515 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700516};
517
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700518class MockJniWrapper : public JniWrapper {
519public:
520 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
521
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700522 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700523};
524
525class MockLooperWrapper : public LooperWrapper {
526public:
527 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
528 MOCK_METHOD1(removeFd, int(int));
529 MOCK_METHOD0(wake, void());
530 MOCK_METHOD1(pollAll, int(int));
531
532 MockLooperWrapper() {
533 ON_CALL(*this, addFd(_, _, _, _, _))
534 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
535 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700536 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700537 }
538
539 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
540 mCallback = callback;
541 mCallbackData = data;
542 return 0;
543 }
544
545 int clearCallback(int) {
546 mCallback = nullptr;
547 mCallbackData = nullptr;
548 return 0;
549 }
550
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700551 int wait10Ms(int) {
552 // This is called from a loop in runCmdLooper.
553 // Sleeping for 10ms only to avoid busy looping.
554 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700555 return 0;
556 }
557
558 android::Looper_callbackFunc mCallback = nullptr;
559 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700560};
561
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700562class MockTimedQueueWrapper : public TimedQueueWrapper {
563public:
564 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
565 MOCK_METHOD1(removeJobs, void(MountId));
566 MOCK_METHOD0(stop, void());
567
568 MockTimedQueueWrapper() {
569 ON_CALL(*this, addJob(_, _, _))
570 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
571 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
572 }
573
574 void storeJob(MountId id, Milliseconds after, Job what) {
575 mId = id;
576 mAfter = after;
577 mWhat = std::move(what);
578 }
579
580 void clearJob(MountId id) {
581 if (mId == id) {
582 mAfter = {};
583 mWhat = {};
584 }
585 }
586
587 MountId mId = -1;
588 Milliseconds mAfter;
589 Job mWhat;
590};
591
Songchun Fan374f7652020-08-20 08:40:29 -0700592class MockFsWrapper : public FsWrapper {
593public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800594 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
595 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700596 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800597 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700598 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
599 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800600 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
601 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
602 if (!onFile(file)) break;
603 }
Songchun Fan374f7652020-08-20 08:40:29 -0700604 }
605};
606
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800607class MockClockWrapper : public ClockWrapper {
608public:
609 MOCK_CONST_METHOD0(now, TimePoint());
610
611 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700612
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800613 template <class Delta>
614 void advance(Delta delta) {
615 mClock += delta;
616 }
617
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700618 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
619
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800620 TimePoint getClock() const { return mClock; }
621
622 TimePoint mClock = Clock::now();
623};
624
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700625class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
626public:
627 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
628
629 MockStorageHealthListener() {
630 ON_CALL(*this, onHealthStatus(_, _))
631 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
632 }
633
634 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
635 mStorageId = storageId;
636 mStatus = status;
637 return binder::Status::ok();
638 }
639
640 int32_t mStorageId = -1;
641 int32_t mStatus = -1;
642};
643
Songchun Fana7098592020-09-03 11:45:53 -0700644class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
645public:
646 MockStorageLoadingProgressListener() = default;
647 MOCK_METHOD2(onStorageLoadingProgressChanged,
648 binder::Status(int32_t storageId, float progress));
649 MOCK_METHOD0(onAsBinder, IBinder*());
650};
651
Songchun Fan3c82a302019-11-29 14:23:45 -0800652class MockServiceManager : public ServiceManagerWrapper {
653public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800654 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700655 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700656 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700657 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700658 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700659 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700660 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700661 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800662 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800663 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700664 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700665 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700666 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700667 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700668 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700669 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700670 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800671 mFs(std::move(fs)),
672 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800673 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800674 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
675 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800676 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800677 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700678 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
679 return std::move(mAppOpsManager);
680 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700681 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700682 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700683 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700684 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
685 return std::move(mProgressUpdateJobQueue);
686 }
Songchun Fan374f7652020-08-20 08:40:29 -0700687 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800688 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800689
690private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800691 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800692 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800693 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700694 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700695 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700696 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700697 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700698 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700699 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800700 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800701};
702
703// --- IncrementalServiceTest ---
704
Songchun Fan3c82a302019-11-29 14:23:45 -0800705class IncrementalServiceTest : public testing::Test {
706public:
707 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800708 auto vold = std::make_unique<NiceMock<MockVoldService>>();
709 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700710 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
711 mDataLoader = dataLoader.get();
712 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800713 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800714 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
715 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700716 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
717 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700718 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
719 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700720 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
721 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700722 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
723 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700724 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
725 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700726 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
727 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800728 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
729 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700730 mIncrementalService = std::make_unique<
731 IncrementalService>(MockServiceManager(std::move(vold),
732 std::move(dataloaderManager),
733 std::move(incFs), std::move(appOps),
734 std::move(jni), std::move(looper),
735 std::move(timedQueue),
736 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800737 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700738 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800739 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800740 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700741 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800742 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800743 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700744 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800745 }
746
747 void setUpExistingMountDir(const std::string& rootDir) {
748 const auto dir = rootDir + "/dir1";
749 const auto mountDir = dir + "/mount";
750 const auto backingDir = dir + "/backing_store";
751 const auto storageDir = mountDir + "/st0";
752 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
753 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
754 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
755 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
756 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
757 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
758 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
759 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800760 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
761 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
762 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
763 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
764 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
765 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800766 }
767
Songchun Fan374f7652020-08-20 08:40:29 -0700768 void setupSuccess() {
769 mVold->mountIncFsSuccess();
770 mIncFs->makeFileSuccess();
771 mVold->bindMountSuccess();
772 mDataLoaderManager->bindToDataLoaderSuccess();
773 mDataLoaderManager->getDataLoaderSuccess();
774 }
775
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000776 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
777 android::os::PersistableBundle result{};
778 mIncrementalService->getMetrics(storageId, &result);
779 int64_t value = -1;
780 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
781 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
782 .c_str()),
783 &value));
784 ASSERT_EQ(expected, value);
785 ASSERT_EQ(1, (int)result.size());
786 }
787
Songchun Fan3c82a302019-11-29 14:23:45 -0800788protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700789 NiceMock<MockVoldService>* mVold = nullptr;
790 NiceMock<MockIncFs>* mIncFs = nullptr;
791 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
792 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
793 NiceMock<MockJniWrapper>* mJni = nullptr;
794 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700795 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700796 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700797 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800798 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700799 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800800 std::unique_ptr<IncrementalService> mIncrementalService;
801 TemporaryDir mRootDir;
802 DataLoaderParamsParcel mDataLoaderParcel;
803};
804
Songchun Fan3c82a302019-11-29 14:23:45 -0800805TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
806 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800807 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800808 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800809 int storageId =
810 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
811 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800812 ASSERT_LT(storageId, 0);
813}
814
815TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
816 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800817 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700818 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800819 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800820 int storageId =
821 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
822 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800823 ASSERT_LT(storageId, 0);
824}
825
826TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
827 mVold->mountIncFsSuccess();
828 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800829 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700830 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800831 EXPECT_CALL(*mVold, unmountIncFs(_));
832 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800833 int storageId =
834 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
835 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800836 ASSERT_LT(storageId, 0);
837}
838
839TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
840 mVold->mountIncFsSuccess();
841 mIncFs->makeFileSuccess();
842 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800843 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700844 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800845 EXPECT_CALL(*mVold, unmountIncFs(_));
846 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800847 int storageId =
848 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
849 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800850 ASSERT_LT(storageId, 0);
851}
852
853TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
854 mVold->mountIncFsSuccess();
855 mIncFs->makeFileSuccess();
856 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700857 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800858 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700859 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700860 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
861 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
862 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800863 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
864 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800865 int storageId =
866 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
867 IncrementalService::CreateOptions::CreateNew);
868 ASSERT_GE(storageId, 0);
869 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800870}
871
872TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700873 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800874 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700875 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800876 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
877 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800878 int storageId =
879 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
880 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800881 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800882 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800883 mIncrementalService->deleteStorage(storageId);
884}
885
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800886TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700887 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700888 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700889 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
890 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700891 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800892 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
893 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800894 int storageId =
895 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
896 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800897 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800898 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800899
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700900 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800901
902 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
903 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700904 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700905 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700906 mDataLoaderManager->setDataLoaderStatusDestroyed();
907
908 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
909 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800910 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700911 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800912 mDataLoaderManager->setDataLoaderStatusDestroyed();
913
914 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
915 .WillByDefault(Invoke(mDataLoaderManager,
916 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700917 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800918 mDataLoaderManager->setDataLoaderStatusDestroyed();
919
920 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
921 .WillByDefault(Invoke(mDataLoaderManager,
922 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700923 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800924 mDataLoaderManager->setDataLoaderStatusDestroyed();
925
926 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
927 .WillByDefault(Invoke(mDataLoaderManager,
928 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700929 // Try the reduced delay, just in case.
930 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800931 mDataLoaderManager->setDataLoaderStatusDestroyed();
932
933 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
934 .WillByDefault(Invoke(mDataLoaderManager,
935 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700936 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700937 mDataLoaderManager->setDataLoaderStatusDestroyed();
938}
939
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800940TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
941 mIncFs->waitForPendingReadsSuccess();
942 mIncFs->openMountSuccess();
943
944 constexpr auto bindRetryInterval = 5s;
945
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700946 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800947 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700948 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
949 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800950 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
951 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700952 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800953 TemporaryDir tempDir;
954 int storageId =
955 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
956 IncrementalService::CreateOptions::CreateNew);
957 ASSERT_GE(storageId, 0);
958
959 // First binds to DataLoader fails... because it's restart.
960 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
961 .WillByDefault(Invoke(mDataLoaderManager,
962 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
963
964 // Request DL start.
965 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
966
967 // Retry callback present.
968 ASSERT_EQ(storageId, mTimedQueue->mId);
969 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
970 auto retryCallback = mTimedQueue->mWhat;
971 mTimedQueue->clearJob(storageId);
972
973 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
974 mClock->advance(5s);
975
976 retryCallback();
977 // Retry callback present.
978 ASSERT_EQ(storageId, mTimedQueue->mId);
979 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
980 retryCallback = mTimedQueue->mWhat;
981 mTimedQueue->clearJob(storageId);
982
983 // Returning "binding" so that we can retry.
984 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
985 .WillByDefault(Invoke(mDataLoaderManager,
986 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
987
988 // Expecting bindToDataLoaderBindingWithNoDelay call.
989 mClock->advance(5s);
990
991 retryCallback();
992 // No retry callback.
993 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
994 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
995
996 // Should not change the bindToDataLoader call count
997 ASSERT_NE(nullptr, mLooper->mCallback);
998 ASSERT_NE(nullptr, mLooper->mCallbackData);
999 auto looperCb = mLooper->mCallback;
1000 auto looperCbData = mLooper->mCallbackData;
1001 looperCb(-1, -1, looperCbData);
1002
1003 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1004 mClock->advance(5s);
1005
1006 // Use pending reads callback to trigger binding.
1007 looperCb(-1, -1, looperCbData);
1008
1009 // No retry callback.
1010 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1011 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1012
1013 // Now we are out of 10m "retry" budget, let's finally bind.
1014 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1015 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1016 mClock->advance(11min);
1017
1018 // Use pending reads callback to trigger binding.
1019 looperCb(-1, -1, looperCbData);
1020
1021 // No retry callback.
1022 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1023 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1024
1025 // And test the rest of the backoff.
1026 // Simulated crash/other connection breakage.
1027 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1028 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001029 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001030 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001031 mDataLoaderManager->setDataLoaderStatusDestroyed();
1032
1033 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1034 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001035 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001036 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001037 mDataLoaderManager->setDataLoaderStatusDestroyed();
1038
1039 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1040 .WillByDefault(Invoke(mDataLoaderManager,
1041 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001042 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001043 mDataLoaderManager->setDataLoaderStatusDestroyed();
1044
1045 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1046 .WillByDefault(Invoke(mDataLoaderManager,
1047 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001048 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001049 mDataLoaderManager->setDataLoaderStatusDestroyed();
1050
1051 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1052 .WillByDefault(Invoke(mDataLoaderManager,
1053 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001054 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001055 mDataLoaderManager->setDataLoaderStatusDestroyed();
1056
1057 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1058 .WillByDefault(Invoke(mDataLoaderManager,
1059 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001060 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001061 mDataLoaderManager->setDataLoaderStatusDestroyed();
1062}
1063
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001064TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001065 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001066 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001067 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001068 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1069 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1070 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1071 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1072 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001073 int storageId =
1074 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1075 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001076 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001077 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1078 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001079 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001080 mDataLoaderManager->setDataLoaderStatusStarted();
1081}
1082
1083TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001084 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001085 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001086 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001087 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001088 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1089 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1090 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1091 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001092 int storageId =
1093 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1094 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001095 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001096 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1097 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001098 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001099}
1100
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001101TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001102 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001103 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001104 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1105 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1106 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1107 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1108 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1109 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001110 int storageId =
1111 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1112 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001113 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001114 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1115 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001116 mDataLoaderManager->setDataLoaderStatusUnavailable();
1117}
1118
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001119TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1120 mDataLoader->initializeCreateOkNoStatus();
1121 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1122 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1123 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1124 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1125 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1126 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1127 TemporaryDir tempDir;
1128 int storageId =
1129 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1130 IncrementalService::CreateOptions::CreateNew);
1131 ASSERT_GE(storageId, 0);
1132 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1133 {}, {}));
1134 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1135}
1136
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001137TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001138 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001139 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001140 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001141
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001142 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001143 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001144 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1145 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001146 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001147 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1148 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1149 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1150 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001151 int storageId =
1152 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1153 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001154 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001155 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1156 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001157 mDataLoaderManager->setDataLoaderStatusUnavailable();
1158 ASSERT_NE(nullptr, mLooper->mCallback);
1159 ASSERT_NE(nullptr, mLooper->mCallbackData);
1160 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1161}
1162
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001163TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001164 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001165
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001166 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001167 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1168 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1169 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1170 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1171 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1172 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1173 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001174 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001175
1176 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1177 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1178 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1179 .Times(2);
1180 EXPECT_CALL(*listenerMock,
1181 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1182 .Times(1);
1183 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1184 .Times(1);
1185 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1186 .Times(2);
1187
1188 StorageHealthCheckParams params;
1189 params.blockedTimeoutMs = 10000;
1190 params.unhealthyTimeoutMs = 20000;
1191 params.unhealthyMonitoringMs = 30000;
1192
1193 using MS = std::chrono::milliseconds;
1194 using MCS = std::chrono::microseconds;
1195
1196 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1197 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1198 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1199
1200 const uint64_t kFirstTimestampUs = 1000000000ll;
1201 const uint64_t kBlockedTimestampUs =
1202 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1203 const uint64_t kUnhealthyTimestampUs =
1204 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1205
1206 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001207 int storageId =
1208 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1209 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001210 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001211 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1212 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001213
1214 // Healthy state, registered for pending reads.
1215 ASSERT_NE(nullptr, mLooper->mCallback);
1216 ASSERT_NE(nullptr, mLooper->mCallbackData);
1217 ASSERT_EQ(storageId, listener->mStorageId);
1218 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001219 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001220
1221 // Looper/epoll callback.
1222 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1223 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1224
1225 // Unregister from pending reads and wait.
1226 ASSERT_EQ(nullptr, mLooper->mCallback);
1227 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1228 ASSERT_EQ(storageId, listener->mStorageId);
1229 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1230 // Timed callback present.
1231 ASSERT_EQ(storageId, mTimedQueue->mId);
1232 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1233 auto timedCallback = mTimedQueue->mWhat;
1234 mTimedQueue->clearJob(storageId);
1235
1236 // Timed job callback for blocked.
1237 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1238 timedCallback();
1239
1240 // Still not registered, and blocked.
1241 ASSERT_EQ(nullptr, mLooper->mCallback);
1242 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1243 ASSERT_EQ(storageId, listener->mStorageId);
1244 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001245 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1246
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001247 // Timed callback present.
1248 ASSERT_EQ(storageId, mTimedQueue->mId);
1249 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1250 timedCallback = mTimedQueue->mWhat;
1251 mTimedQueue->clearJob(storageId);
1252
1253 // Timed job callback for unhealthy.
1254 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1255 timedCallback();
1256
1257 // Still not registered, and blocked.
1258 ASSERT_EQ(nullptr, mLooper->mCallback);
1259 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1260 ASSERT_EQ(storageId, listener->mStorageId);
1261 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001262 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1263
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001264 // Timed callback present.
1265 ASSERT_EQ(storageId, mTimedQueue->mId);
1266 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1267 timedCallback = mTimedQueue->mWhat;
1268 mTimedQueue->clearJob(storageId);
1269
1270 // One more unhealthy.
1271 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1272 timedCallback();
1273
1274 // Still not registered, and blocked.
1275 ASSERT_EQ(nullptr, mLooper->mCallback);
1276 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1277 ASSERT_EQ(storageId, listener->mStorageId);
1278 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001279 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1280
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001281 // Timed callback present.
1282 ASSERT_EQ(storageId, mTimedQueue->mId);
1283 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1284 timedCallback = mTimedQueue->mWhat;
1285 mTimedQueue->clearJob(storageId);
1286
1287 // And now healthy.
1288 mIncFs->waitForPendingReadsTimeout();
1289 timedCallback();
1290
1291 // Healthy state, registered for pending reads.
1292 ASSERT_NE(nullptr, mLooper->mCallback);
1293 ASSERT_NE(nullptr, mLooper->mCallbackData);
1294 ASSERT_EQ(storageId, listener->mStorageId);
1295 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001296 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001297}
1298
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001299TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001300 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001301 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001302
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001303 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001304 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001305 // We are calling setIncFsMountOptions(true).
1306 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1307 // After setIncFsMountOptions succeeded expecting to start watching.
1308 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1309 // Not expecting callback removal.
1310 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001311 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001312 int storageId =
1313 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1314 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001315 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001316 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1317 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001318 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001319}
1320
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001321TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001322 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001323 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001324
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001325 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1326 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1327 // Enabling and then disabling readlogs.
1328 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1329 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1330 // After setIncFsMountOptions succeeded expecting to start watching.
1331 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1332 // Not expecting callback removal.
1333 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1334 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001335 int storageId =
1336 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1337 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001338 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001339 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1340 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001341 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1342 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001343 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001344 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1345}
1346
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001347TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1348 mVold->setIncFsMountOptionsSuccess();
1349 mAppOpsManager->checkPermissionSuccess();
1350
1351 const auto readLogsMaxInterval = 2h;
1352
1353 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1354 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1355 // Enabling and then disabling readlogs.
1356 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
1357 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1358 // After setIncFsMountOptions succeeded expecting to start watching.
1359 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1360 // Not expecting callback removal.
1361 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001362 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001363 TemporaryDir tempDir;
1364 int storageId =
1365 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1366 IncrementalService::CreateOptions::CreateNew);
1367 ASSERT_GE(storageId, 0);
1368 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1369 {}, {}));
1370
1371 // Disable readlogs callback present.
1372 ASSERT_EQ(storageId, mTimedQueue->mId);
1373 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1374 auto callback = mTimedQueue->mWhat;
1375 mTimedQueue->clearJob(storageId);
1376
1377 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1378 // Now advance clock for 1hr.
1379 mClock->advance(1h);
1380 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1381 // Now call the timed callback, it should turn off the readlogs.
1382 callback();
1383 // Now advance clock for 2hrs.
1384 mClock->advance(readLogsMaxInterval);
1385 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1386}
1387
1388TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1389 mVold->setIncFsMountOptionsSuccess();
1390 mAppOpsManager->checkPermissionSuccess();
1391
1392 const auto readLogsMaxInterval = 2h;
1393
1394 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1395 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1396 // Enabling and then disabling readlogs.
1397 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1398 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
1399 // After setIncFsMountOptions succeeded expecting to start watching.
1400 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1401 // Not expecting callback removal.
1402 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001403 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001404 // System data loader.
1405 mDataLoaderParcel.packageName = "android";
1406 TemporaryDir tempDir;
1407 int storageId =
1408 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1409 IncrementalService::CreateOptions::CreateNew);
1410 ASSERT_GE(storageId, 0);
1411 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1412 {}, {}));
1413
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001414 // IfsState callback.
1415 auto callback = mTimedQueue->mWhat;
1416 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001417
1418 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1419 // Now advance clock for 1hr.
1420 mClock->advance(1h);
1421 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1422 // Now advance clock for 2hrs.
1423 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001424 // IfsStorage callback should not affect anything.
1425 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001426 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1427}
1428
1429TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1430 mVold->setIncFsMountOptionsSuccess();
1431 mAppOpsManager->checkPermissionSuccess();
1432
1433 const auto readLogsMaxInterval = 2h;
1434
1435 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1436 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1437 // Enabling and then disabling readlogs.
1438 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1439 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1440 // After setIncFsMountOptions succeeded expecting to start watching.
1441 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1442 // Not expecting callback removal.
1443 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001444 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001445 TemporaryDir tempDir;
1446 int storageId =
1447 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1448 IncrementalService::CreateOptions::CreateNew);
1449 ASSERT_GE(storageId, 0);
1450
1451 auto dataLoaderParcel = mDataLoaderParcel;
1452 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1453 {}, {}));
1454
1455 // Disable readlogs callback present.
1456 ASSERT_EQ(storageId, mTimedQueue->mId);
1457 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1458 auto callback = mTimedQueue->mWhat;
1459 mTimedQueue->clearJob(storageId);
1460
1461 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1462 // Now advance clock for 1.5hrs.
1463 mClock->advance(90min);
1464 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1465
1466 // New installation.
1467 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1468 {}, {}));
1469
1470 // New callback present.
1471 ASSERT_EQ(storageId, mTimedQueue->mId);
1472 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1473 auto callback2 = mTimedQueue->mWhat;
1474 mTimedQueue->clearJob(storageId);
1475
1476 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1477 callback();
1478 // Advance clock for another 1.5hrs.
1479 mClock->advance(90min);
1480 // Still success even it's 3hrs past first install.
1481 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1482
1483 // New one should disable.
1484 callback2();
1485 // And timeout.
1486 mClock->advance(90min);
1487 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1488}
1489
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001490TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001491 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001492 mAppOpsManager->checkPermissionSuccess();
1493 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001494
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001495 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001496 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1497 // We are calling setIncFsMountOptions(true).
1498 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1499 // setIncFsMountOptions(false) is called on the callback.
1500 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1501 // After setIncFsMountOptions succeeded expecting to start watching.
1502 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1503 // After callback is called, disable read logs and remove callback.
1504 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1505 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001506 int storageId =
1507 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1508 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001509 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001510 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1511 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001512 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001513 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1514 mAppOpsManager->mStoredCallback->opChanged(0, {});
1515}
1516
1517TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001518 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001519
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001520 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001521 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1522 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1523 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1524 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1525 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1526 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001527 int storageId =
1528 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1529 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001530 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001531 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1532 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001533 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001534}
1535
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001536TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1537 mAppOpsManager->checkPermissionNoCrossUsers();
1538
1539 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1540 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1541 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1542 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1543 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1544 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1545 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001546 int storageId =
1547 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1548 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001549 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001550 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1551 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001552 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1553}
1554
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001555TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001556 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001557 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001558
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001559 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001560 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001561 // We are calling setIncFsMountOptions.
1562 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1563 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1564 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1565 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001566 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001567 int storageId =
1568 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1569 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001570 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001571 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1572 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001573 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001574}
1575
Songchun Fan3c82a302019-11-29 14:23:45 -08001576TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001577 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001578 int storageId =
1579 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1580 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001581 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001582
Songchun Fan103ba1d2020-02-03 17:32:32 -08001583 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001584 // <root>/*/mount/<storage>/test
1585 EXPECT_CALL(*mIncFs,
1586 makeDir(_, Truly([&](std::string_view arg) {
1587 return arg.starts_with(mRootDir.path) &&
1588 arg.ends_with("/mount/st_1_0/" + dir_path);
1589 }),
1590 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001591 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1592 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001593}
1594
1595TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001596 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001597 int storageId =
1598 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1599 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001600 auto first = "first"sv;
1601 auto second = "second"sv;
1602 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001603 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001604
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001605 EXPECT_CALL(*mIncFs,
1606 makeDirs(_, Truly([&](std::string_view arg) {
1607 return arg.starts_with(mRootDir.path) &&
1608 arg.ends_with("/mount/st_1_0/" + dir_path);
1609 }),
1610 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001611 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001612 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001613}
Songchun Fan374f7652020-08-20 08:40:29 -07001614
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001615TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001616 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001617 int storageId =
1618 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1619 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001620 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001621 .Times(1)
1622 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1623 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001624}
1625
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001626TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001627 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001628 int storageId =
1629 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1630 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001631 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001632 .Times(1)
1633 .WillOnce(Return(incfs::LoadingState(-1)));
1634 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001635}
1636
1637TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001638 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001639 int storageId =
1640 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1641 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001642 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001643 .Times(1)
1644 .WillOnce(Return(incfs::LoadingState::Full));
1645 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001646}
1647
Songchun Fan425862f2020-08-25 13:12:16 -07001648TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001649 mIncFs->countFilledBlocksSuccess();
1650 mFs->hasNoFile();
1651
1652 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001653 int storageId =
1654 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1655 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001656 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001657}
1658
1659TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1660 mIncFs->countFilledBlocksFails();
1661 mFs->hasFiles();
1662
1663 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001664 int storageId =
1665 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1666 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001667 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001668 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001669}
1670
Songchun Fan425862f2020-08-25 13:12:16 -07001671TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001672 mIncFs->countFilledBlocksEmpty();
1673 mFs->hasFiles();
1674
1675 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001676 int storageId =
1677 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1678 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001679 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001680 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001681}
1682
1683TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1684 mIncFs->countFilledBlocksSuccess();
1685 mFs->hasFiles();
1686
1687 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001688 int storageId =
1689 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1690 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001691 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001692 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001693}
Songchun Fana7098592020-09-03 11:45:53 -07001694
1695TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1696 mIncFs->countFilledBlocksSuccess();
1697 mFs->hasFiles();
1698
1699 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001700 int storageId =
1701 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1702 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001703 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1704 new NiceMock<MockStorageLoadingProgressListener>};
1705 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1706 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1707 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1708 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1709 // Timed callback present.
1710 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1711 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1712 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1713 timedCallback();
1714 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1715 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1716 mIncrementalService->unregisterLoadingProgressListener(storageId);
1717 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1718}
1719
1720TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1721 mIncFs->countFilledBlocksFails();
1722 mFs->hasFiles();
1723
1724 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001725 int storageId =
1726 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1727 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001728 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1729 new NiceMock<MockStorageLoadingProgressListener>};
1730 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1731 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1732 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1733}
Songchun Fan2570ec02020-10-08 17:22:33 -07001734
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001735TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1736 mFs->hasFiles();
1737
1738 const auto stateUpdateInterval = 1s;
1739
1740 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1741 // No unbinding just yet.
1742 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1743 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1744 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1745 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1746 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1747 // System data loader to get rid of readlog timeout callback.
1748 mDataLoaderParcel.packageName = "android";
1749 TemporaryDir tempDir;
1750 int storageId =
1751 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1752 IncrementalService::CreateOptions::CreateNew);
1753 ASSERT_GE(storageId, 0);
1754 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1755 {}, {}));
1756
1757 // Started.
1758 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1759
1760 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001761 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001762 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1763 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001764 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001765
1766 // Not loaded yet.
1767 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1768 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1769
1770 // Send the callback, should not do anything.
1771 callback();
1772
1773 // Still started.
1774 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1775
1776 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001777 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001778 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1779 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001780 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001781
1782 // Fully loaded.
1783 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1784 // Expect the unbind.
1785 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1786
1787 callback();
1788
1789 // Destroyed.
1790 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1791}
1792
1793TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1794 mFs->hasFiles();
1795
1796 // Readlogs.
1797 mVold->setIncFsMountOptionsSuccess();
1798 mAppOpsManager->checkPermissionSuccess();
1799
1800 const auto stateUpdateInterval = 1s;
1801
1802 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1803 // No unbinding just yet.
1804 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1805 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1806 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1807 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1808 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1809 // System data loader to get rid of readlog timeout callback.
1810 mDataLoaderParcel.packageName = "android";
1811 TemporaryDir tempDir;
1812 int storageId =
1813 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1814 IncrementalService::CreateOptions::CreateNew);
1815 ASSERT_GE(storageId, 0);
1816 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1817 {}, {}));
1818
1819 // Started.
1820 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1821
1822 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001823 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001824 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1825 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001826 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001827
1828 // Not loaded yet.
1829 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1830 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1831
1832 // Send the callback, should not do anything.
1833 callback();
1834
1835 // Still started.
1836 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1837
1838 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001839 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001840 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1841 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001842 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001843
1844 // Fully loaded.
1845 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1846 .WillOnce(Return(incfs::LoadingState::Full))
1847 .WillOnce(Return(incfs::LoadingState::Full));
1848 // But with readlogs.
1849 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1850
1851 // Send the callback, still nothing.
1852 callback();
1853
1854 // Still started.
1855 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1856
1857 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001858 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001859 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1860 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001861 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001862
1863 // Disable readlogs and expect the unbind.
1864 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1865 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1866
1867 callback();
1868
1869 // Destroyed.
1870 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1871}
1872
Songchun Fan2570ec02020-10-08 17:22:33 -07001873TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1874 mIncFs->openMountSuccess();
1875 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1876 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1877 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1878
1879 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001880 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001881 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1882 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001883 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001884 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1885 {});
1886
Songchun Fan2570ec02020-10-08 17:22:33 -07001887 StorageHealthCheckParams newParams;
1888 newParams.blockedTimeoutMs = 10000;
1889 newParams.unhealthyTimeoutMs = 20000;
1890 newParams.unhealthyMonitoringMs = 30000;
1891 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1892 newListener));
1893
1894 using MS = std::chrono::milliseconds;
1895 using MCS = std::chrono::microseconds;
1896
1897 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1898 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1899
1900 const uint64_t kFirstTimestampUs = 1000000000ll;
1901 const uint64_t kBlockedTimestampUs =
1902 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1903 const uint64_t kUnhealthyTimestampUs =
1904 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1905
1906 // test that old listener was not called
1907 EXPECT_CALL(*listener.get(),
1908 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1909 .Times(0);
1910 EXPECT_CALL(*newListenerMock,
1911 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1912 .Times(1);
1913 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1914 .Times(1);
1915 EXPECT_CALL(*newListenerMock,
1916 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1917 .Times(1);
1918 EXPECT_CALL(*newListenerMock,
1919 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1920 .Times(1);
1921 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1922 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1923
1924 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1925 ASSERT_EQ(storageId, newListener->mStorageId);
1926
1927 auto timedCallback = mTimedQueue->mWhat;
1928 mTimedQueue->clearJob(storageId);
1929
1930 // test when health status is blocked with transport error
1931 mDataLoader->transportError(storageId);
1932 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1933 timedCallback();
1934 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1935 timedCallback = mTimedQueue->mWhat;
1936 mTimedQueue->clearJob(storageId);
1937
1938 // test when health status is blocked with storage error
1939 mDataLoader->storageError(storageId);
1940 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1941 timedCallback();
1942 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1943 timedCallback = mTimedQueue->mWhat;
1944 mTimedQueue->clearJob(storageId);
1945
1946 // test when health status is unhealthy with transport error
1947 mDataLoader->transportError(storageId);
1948 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1949 timedCallback();
1950 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1951 mTimedQueue->clearJob(storageId);
1952}
1953
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001954static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1955 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1956 std::vector<PerUidReadTimeouts> result;
1957 for (auto&& tuple : tuples) {
1958 result.emplace_back();
1959 auto& timeouts = result.back();
1960 timeouts.uid = std::get<0>(tuple);
1961 timeouts.minTimeUs = std::get<1>(tuple);
1962 timeouts.minPendingTimeUs = std::get<2>(tuple);
1963 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1964 }
1965 return result;
1966}
1967
1968static ErrorCode checkPerUidTimeouts(const Control& control,
1969 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1970 std::vector<PerUidReadTimeouts> expected =
1971 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1972 EXPECT_EQ(expected, perUidReadTimeouts);
1973 return 0;
1974}
1975
1976static ErrorCode checkPerUidTimeoutsEmpty(
1977 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1978 EXPECT_EQ(0u, perUidReadTimeouts.size());
1979 return 0;
1980}
1981
1982TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001983 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001984 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1985 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001986 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001987 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1988 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001989 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001990 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1991 TemporaryDir tempDir;
1992 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001993 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1994 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001995 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001996 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1997 createPerUidTimeouts(
1998 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001999}
2000
2001TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2002 mVold->setIncFsMountOptionsSuccess();
2003 mAppOpsManager->checkPermissionSuccess();
2004 mFs->hasFiles();
2005
2006 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2007 // First call.
2008 .WillOnce(Invoke(&checkPerUidTimeouts))
2009 // Fully loaded and no readlogs.
2010 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2011 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2012
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002013 // Loading storage.
2014 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2015 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2016 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002017 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002018
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07002019 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2020 mDataLoaderParcel.packageName = "android";
2021
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002022 TemporaryDir tempDir;
2023 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002024 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2025 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002026 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002027 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2028 createPerUidTimeouts(
2029 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002030
2031 {
2032 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002033 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002034 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2035 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002036 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002037
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002038 // Call it again.
2039 timedCallback();
2040 }
2041
2042 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002043 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002044 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002045 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2046 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002047 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002048
2049 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002050 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2051
2052 // Call it again.
2053 timedCallback();
2054 }
2055
2056 {
2057 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002058 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002059 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2060 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002061 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002062
2063 // Now disable readlogs.
2064 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2065
2066 // Call it again.
2067 timedCallback();
2068 }
2069
2070 // No callbacks anymore -> fully loaded and no readlogs.
2071 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2072}
2073
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002074TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2075 const auto invalidStorageId = 100;
2076 android::os::PersistableBundle result{};
2077 mIncrementalService->getMetrics(invalidStorageId, &result);
2078 int64_t expected = -1, value = -1;
2079 ASSERT_FALSE(
2080 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2081 .c_str()),
2082 &value));
2083 ASSERT_EQ(expected, value);
2084 ASSERT_TRUE(result.empty());
2085}
2086
2087TEST_F(IncrementalServiceTest, testNoMetrics) {
2088 mVold->setIncFsMountOptionsSuccess();
2089 TemporaryDir tempDir;
2090 int storageId =
2091 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2092 IncrementalService::CreateOptions::CreateNew);
2093 ASSERT_GE(storageId, 0);
2094 android::os::PersistableBundle result{};
2095 mIncrementalService->getMetrics(storageId, &result);
2096 int64_t expected = -1, value = -1;
2097 ASSERT_FALSE(
2098 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2099 .c_str()),
2100 &value));
2101 ASSERT_EQ(expected, value);
2102 ASSERT_EQ(0, (int)result.size());
2103}
2104
2105TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2106 mVold->setIncFsMountOptionsSuccess();
2107 TemporaryDir tempDir;
2108 int storageId =
2109 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2110 IncrementalService::CreateOptions::CreateNew);
2111 ASSERT_GE(storageId, 0);
2112 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2113 {}, {}));
2114 android::os::PersistableBundle result{};
2115 mIncrementalService->getMetrics(storageId, &result);
2116 int64_t expected = -1, value = -1;
2117 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2118 ASSERT_EQ(expected, value);
2119 ASSERT_EQ(1, (int)result.size());
2120}
2121
Songchun Fan3c82a302019-11-29 14:23:45 -08002122} // namespace android::os::incremental