blob: 6a3d953f74aa1bf4131a8d29c78a551844fef3e5 [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/file.h>
18#include <android-base/logging.h>
19#include <android-base/unique_fd.h>
20#include <binder/ParcelFileDescriptor.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <utils/Log.h>
Songchun Fan1b76ccf2021-02-24 22:25:59 +000024#include <utils/String16.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080025
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -070026#include <chrono>
Songchun Fan3c82a302019-11-29 14:23:45 -080027#include <future>
28
29#include "IncrementalService.h"
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070030#include "IncrementalServiceValidation.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080031#include "Metadata.pb.h"
32#include "ServiceWrappers.h"
33
34using namespace testing;
35using namespace android::incremental;
36using namespace std::literals;
37using testing::_;
38using testing::Invoke;
39using testing::NiceMock;
40
41#undef LOG_TAG
42#define LOG_TAG "IncrementalServiceTest"
43
44using namespace android::incfs;
45using namespace android::content::pm;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -080046using PerUidReadTimeouts = android::os::incremental::PerUidReadTimeouts;
Songchun Fan3c82a302019-11-29 14:23:45 -080047
48namespace android::os::incremental {
49
50class MockVoldService : public VoldServiceWrapper {
51public:
52 MOCK_CONST_METHOD4(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080053 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080054 int32_t flags,
55 IncrementalFileSystemControlParcel* _aidl_return));
56 MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
57 MOCK_CONST_METHOD2(bindMount,
58 binder::Status(const std::string& sourceDir, const std::string& argetDir));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070059 MOCK_CONST_METHOD3(
Songchun Fan374f7652020-08-20 08:40:29 -070060 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070062 bool, bool));
Songchun Fan3c82a302019-11-29 14:23:45 -080063
64 void mountIncFsFails() {
65 ON_CALL(*this, mountIncFs(_, _, _, _))
66 .WillByDefault(
67 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68 }
69 void mountIncFsInvalidControlParcel() {
70 ON_CALL(*this, mountIncFs(_, _, _, _))
71 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72 }
73 void mountIncFsSuccess() {
74 ON_CALL(*this, mountIncFs(_, _, _, _))
75 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
76 }
77 void bindMountFails() {
78 ON_CALL(*this, bindMount(_, _))
79 .WillByDefault(Return(
80 binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
81 }
82 void bindMountSuccess() {
83 ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
84 }
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070085 void setIncFsMountOptionsFails() const {
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070086 ON_CALL(*this, setIncFsMountOptions(_, _, _))
Songchun Fan374f7652020-08-20 08:40:29 -070087 .WillByDefault(Return(
88 binder::Status::fromExceptionCode(1, String8("failed to set options"))));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070089 }
90 void setIncFsMountOptionsSuccess() {
Alex Buynytskyyc144cc42021-03-31 22:19:42 -070091 ON_CALL(*this, setIncFsMountOptions(_, _, _))
92 .WillByDefault(Invoke(this, &MockVoldService::setIncFsMountOptionsOk));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070093 }
Songchun Fan3c82a302019-11-29 14:23:45 -080094 binder::Status getInvalidControlParcel(const std::string& imagePath,
95 const std::string& targetDir, int32_t flags,
96 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080097 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080098 return binder::Status::ok();
99 }
100 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
101 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800102 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
103 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
104 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800105 return binder::Status::ok();
106 }
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700107 binder::Status setIncFsMountOptionsOk(
108 const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
109 bool enableReadLogs, bool enableReadTimeouts) {
110 mReadLogsEnabled = enableReadLogs;
111 mReadTimeoutsEnabled = enableReadTimeouts;
112 return binder::Status::ok();
113 }
114
115 bool readLogsEnabled() const { return mReadLogsEnabled; }
116 bool readTimeoutsEnabled() const { return mReadTimeoutsEnabled; }
Songchun Fan3c82a302019-11-29 14:23:45 -0800117
118private:
119 TemporaryFile cmdFile;
120 TemporaryFile logFile;
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700121
122 bool mReadLogsEnabled = false;
123 bool mReadTimeoutsEnabled = true;
Songchun Fan3c82a302019-11-29 14:23:45 -0800124};
125
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700126class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800127public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700128 MockDataLoader() {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700129 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
130 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
131 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
132 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
133 ON_CALL(*this, prepareImage(_, _, _))
134 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700135 }
Songchun Fan68645c42020-02-27 15:57:35 -0800136 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700137 MOCK_METHOD4(create,
138 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
139 const FileSystemControlParcel& control,
140 const sp<IDataLoaderStatusListener>& listener));
141 MOCK_METHOD1(start, binder::Status(int32_t id));
142 MOCK_METHOD1(stop, binder::Status(int32_t id));
143 MOCK_METHOD1(destroy, binder::Status(int32_t id));
144 MOCK_METHOD3(prepareImage,
145 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
146 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700147
148 void initializeCreateOkNoStatus() {
149 ON_CALL(*this, create(_, _, _, _))
150 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
151 }
152
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700153 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
154 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700155 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700156 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700157 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700158 return binder::Status::ok();
159 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700160 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
161 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700162 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700163 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700164 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700165 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700166 return binder::Status::ok();
167 }
168 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700169 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700170 return binder::Status::ok();
171 }
172 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700173 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700174 return binder::Status::ok();
175 }
176 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700177 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700178 mListener = nullptr;
179 return binder::Status::ok();
180 }
181 binder::Status prepareImageOk(int32_t id,
182 const ::std::vector<content::pm::InstallationFileParcel>&,
183 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700184 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700185 return binder::Status::ok();
186 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700187 int32_t setStorageParams(bool enableReadLogs) {
188 int32_t result = -1;
189 EXPECT_NE(mServiceConnector.get(), nullptr);
190 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
191 return result;
192 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700193 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700194
195private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700196 void setAndReportStatus(int id, int status) {
197 mStatus = status;
198 reportStatus(id);
199 }
200 void reportStatus(int id) {
201 if (mListener) {
202 mListener->onStatusChanged(id, mStatus);
203 }
204 }
205
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700206 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700207 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700208 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800209};
210
211class MockDataLoaderManager : public DataLoaderManagerWrapper {
212public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700213 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
214 EXPECT_TRUE(mDataLoaderHolder != nullptr);
215 }
216
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800217 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800218 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800219 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800220 const sp<IDataLoaderStatusListener>& listener,
221 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800222 MOCK_CONST_METHOD2(getDataLoader,
223 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700224 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800225
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700226 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800227 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700229 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700230 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800231 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700232 .WillByDefault(Return(
233 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
234 }
235 void getDataLoaderSuccess() {
236 ON_CALL(*this, getDataLoader(_, _))
237 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
238 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700239 void unbindFromDataLoaderSuccess() {
240 ON_CALL(*this, unbindFromDataLoader(_))
241 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700242 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700243 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800244 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700245 const sp<IDataLoaderStatusListener>& listener,
246 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800247 mId = mountId;
248 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700249 mDataLoader = mDataLoaderHolder;
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700250 mBindDelayMs = bindDelayMs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800251 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700252 if (mListener) {
253 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
254 }
255 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800256 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800257 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
258 const DataLoaderParamsParcel& params,
259 int bindDelayMs,
260 const sp<IDataLoaderStatusListener>& listener,
261 bool* _aidl_return) {
262 CHECK(bindDelayMs == 0) << bindDelayMs;
263 *_aidl_return = false;
264 return binder::Status::ok();
265 }
266 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
267 const DataLoaderParamsParcel& params,
268 int bindDelayMs,
269 const sp<IDataLoaderStatusListener>& listener,
270 bool* _aidl_return) {
271 CHECK(bindDelayMs == 0) << bindDelayMs;
272 *_aidl_return = true;
273 if (listener) {
274 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
275 }
276 return binder::Status::ok();
277 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700278 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
279 const DataLoaderParamsParcel& params,
280 int bindDelayMs,
281 const sp<IDataLoaderStatusListener>& listener,
282 bool* _aidl_return) {
283 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
284 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
285 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800286 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
287 const DataLoaderParamsParcel& params,
288 int bindDelayMs,
289 const sp<IDataLoaderStatusListener>& listener,
290 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700291 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800292 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
293 }
294 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
295 const DataLoaderParamsParcel& params,
296 int bindDelayMs,
297 const sp<IDataLoaderStatusListener>& listener,
298 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700299 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800300 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
301 }
302 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
303 const DataLoaderParamsParcel& params,
304 int bindDelayMs,
305 const sp<IDataLoaderStatusListener>& listener,
306 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700307 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
308 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800309 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
310 }
311 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
312 const DataLoaderParamsParcel& params,
313 int bindDelayMs,
314 const sp<IDataLoaderStatusListener>& listener,
315 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700316 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800317 << bindDelayMs;
318 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
319 }
320
Songchun Fan68645c42020-02-27 15:57:35 -0800321 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
322 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800323 return binder::Status::ok();
324 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700325 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800326 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800327 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700328 void setDataLoaderStatusStarted() {
329 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
330 }
331 void setDataLoaderStatusDestroyed() {
332 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
333 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700334 void setDataLoaderStatusUnavailable() {
335 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
336 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800337 void setDataLoaderStatusUnrecoverable() {
338 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
339 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700340 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700341 if (mDataLoader) {
342 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
343 return status;
344 }
345 mDataLoader = nullptr;
346 }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700347 mBindDelayMs = -1;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700348 if (mListener) {
349 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
350 }
351 return binder::Status::ok();
352 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700353
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700354 int bindDelayMs() const { return mBindDelayMs; }
355
Songchun Fan3c82a302019-11-29 14:23:45 -0800356private:
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700357 int mId = -1;
358 int mBindDelayMs = -1;
Songchun Fan3c82a302019-11-29 14:23:45 -0800359 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700360 sp<IDataLoader> mDataLoader;
361 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800362};
363
364class MockIncFs : public IncFsWrapper {
365public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800366 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700367 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
368 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800369 MOCK_CONST_METHOD4(createControl,
370 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
371 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800372 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800373 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800374 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800375 MOCK_CONST_METHOD4(makeMappedFile,
376 ErrorCode(const Control& control, std::string_view path, int mode,
377 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800378 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700379 MOCK_CONST_METHOD3(makeDirs,
380 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800381 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
382 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
383 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700384 MOCK_CONST_METHOD2(countFilledBlocks,
385 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
386 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700387 MOCK_CONST_METHOD2(isFileFullyLoaded,
388 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700389 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700390 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800391 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700392 ErrorCode(const Control& control, std::string_view from,
393 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800394 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700395 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700396 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700397 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700398 MOCK_CONST_METHOD3(waitForPendingReads,
399 WaitResult(const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700400 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800401 MOCK_CONST_METHOD2(setUidReadTimeouts,
402 ErrorCode(const Control& control,
403 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700404 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
405 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700406
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700407 MockIncFs() {
408 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
409 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
410 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800411
412 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
413 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700414
415 void countFilledBlocksSuccess() {
416 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
417 }
418
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700419 void countFilledBlocksFullyLoaded() {
420 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
421 }
422
Songchun Fan374f7652020-08-20 08:40:29 -0700423 void countFilledBlocksFails() {
424 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
425 }
426
427 void countFilledBlocksEmpty() {
428 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
429 }
430
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700431 void openMountSuccess() {
432 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
433 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700434
435 // 1000ms
436 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700437 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700438 .WillByDefault(
439 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700440 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700441 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
442 return android::incfs::WaitResult::HaveData;
443 }));
444 }
445
446 void waitForPendingReadsTimeout() {
447 ON_CALL(*this, waitForPendingReads(_, _, _))
448 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700449 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700450
451 static constexpr auto kPendingReadsFd = 42;
452 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800453 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700454 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700455
Songchun Fan20d6ef22020-03-03 09:47:15 -0800456 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800457 metadata::Mount m;
458 m.mutable_storage()->set_id(100);
459 m.mutable_loader()->set_package_name("com.test");
460 m.mutable_loader()->set_arguments("com.uri");
461 const auto metadata = m.SerializeAsString();
462 m.mutable_loader()->release_arguments();
463 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800464 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800465 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800466 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800467 metadata::Storage st;
468 st.set_id(100);
469 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800470 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800471 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800472 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800473 metadata::BindPoint bp;
474 std::string destPath = "dest";
475 std::string srcPath = "src";
476 bp.set_storage_id(100);
477 bp.set_allocated_dest_path(&destPath);
478 bp.set_allocated_source_subdir(&srcPath);
479 const auto metadata = bp.SerializeAsString();
480 bp.release_source_subdir();
481 bp.release_dest_path();
482 return std::vector<char>(metadata.begin(), metadata.end());
483 }
484};
485
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700486class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700487public:
488 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700489 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700490 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
491
492 void checkPermissionSuccess() {
493 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
494 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800495 void checkPermissionNoCrossUsers() {
496 ON_CALL(*this,
497 checkPermission("android.permission.LOADER_USAGE_STATS",
498 "android:loader_usage_stats", _))
499 .WillByDefault(Return(android::incremental::Ok()));
500 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
501 .WillByDefault(
502 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
503 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700504 void checkPermissionFails() {
505 ON_CALL(*this, checkPermission(_, _, _))
506 .WillByDefault(
507 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
508 }
509 void initializeStartWatchingMode() {
510 ON_CALL(*this, startWatchingMode(_, _, _))
511 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
512 }
513 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
514 mStoredCallback = cb;
515 }
516
517 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700518};
519
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700520class MockJniWrapper : public JniWrapper {
521public:
522 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
523
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700524 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700525};
526
527class MockLooperWrapper : public LooperWrapper {
528public:
529 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
530 MOCK_METHOD1(removeFd, int(int));
531 MOCK_METHOD0(wake, void());
532 MOCK_METHOD1(pollAll, int(int));
533
534 MockLooperWrapper() {
535 ON_CALL(*this, addFd(_, _, _, _, _))
536 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
537 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700538 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700539 }
540
541 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
542 mCallback = callback;
543 mCallbackData = data;
544 return 0;
545 }
546
547 int clearCallback(int) {
548 mCallback = nullptr;
549 mCallbackData = nullptr;
550 return 0;
551 }
552
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700553 int wait10Ms(int) {
554 // This is called from a loop in runCmdLooper.
555 // Sleeping for 10ms only to avoid busy looping.
556 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700557 return 0;
558 }
559
560 android::Looper_callbackFunc mCallback = nullptr;
561 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700562};
563
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700564class MockTimedQueueWrapper : public TimedQueueWrapper {
565public:
566 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
567 MOCK_METHOD1(removeJobs, void(MountId));
568 MOCK_METHOD0(stop, void());
569
570 MockTimedQueueWrapper() {
571 ON_CALL(*this, addJob(_, _, _))
572 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
573 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
574 }
575
576 void storeJob(MountId id, Milliseconds after, Job what) {
577 mId = id;
578 mAfter = after;
579 mWhat = std::move(what);
580 }
581
582 void clearJob(MountId id) {
583 if (mId == id) {
584 mAfter = {};
585 mWhat = {};
586 }
587 }
588
589 MountId mId = -1;
590 Milliseconds mAfter;
591 Job mWhat;
592};
593
Songchun Fan374f7652020-08-20 08:40:29 -0700594class MockFsWrapper : public FsWrapper {
595public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800596 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
597 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700598 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800599 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700600 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
601 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800602 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
603 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
604 if (!onFile(file)) break;
605 }
Songchun Fan374f7652020-08-20 08:40:29 -0700606 }
607};
608
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800609class MockClockWrapper : public ClockWrapper {
610public:
611 MOCK_CONST_METHOD0(now, TimePoint());
612
613 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700614
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800615 template <class Delta>
616 void advance(Delta delta) {
617 mClock += delta;
618 }
619
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700620 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
621
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800622 TimePoint getClock() const { return mClock; }
623
624 TimePoint mClock = Clock::now();
625};
626
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700627class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
628public:
629 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
630
631 MockStorageHealthListener() {
632 ON_CALL(*this, onHealthStatus(_, _))
633 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
634 }
635
636 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
637 mStorageId = storageId;
638 mStatus = status;
639 return binder::Status::ok();
640 }
641
642 int32_t mStorageId = -1;
643 int32_t mStatus = -1;
644};
645
Songchun Fana7098592020-09-03 11:45:53 -0700646class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
647public:
648 MockStorageLoadingProgressListener() = default;
649 MOCK_METHOD2(onStorageLoadingProgressChanged,
650 binder::Status(int32_t storageId, float progress));
651 MOCK_METHOD0(onAsBinder, IBinder*());
652};
653
Songchun Fan3c82a302019-11-29 14:23:45 -0800654class MockServiceManager : public ServiceManagerWrapper {
655public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800656 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700657 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700658 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700659 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700660 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700661 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700662 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700663 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800664 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800665 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700666 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700667 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700668 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700669 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700670 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700671 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700672 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800673 mFs(std::move(fs)),
674 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800675 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800676 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
677 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800678 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800679 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700680 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
681 return std::move(mAppOpsManager);
682 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700683 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700684 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700685 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700686 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
687 return std::move(mProgressUpdateJobQueue);
688 }
Songchun Fan374f7652020-08-20 08:40:29 -0700689 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800690 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800691
692private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800693 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800694 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800695 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700696 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700697 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700698 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700699 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700700 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700701 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800702 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800703};
704
705// --- IncrementalServiceTest ---
706
Songchun Fan3c82a302019-11-29 14:23:45 -0800707class IncrementalServiceTest : public testing::Test {
708public:
709 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800710 auto vold = std::make_unique<NiceMock<MockVoldService>>();
711 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700712 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
713 mDataLoader = dataLoader.get();
714 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800715 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800716 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
717 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700718 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
719 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700720 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
721 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700722 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
723 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700724 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
725 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700726 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
727 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700728 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
729 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800730 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
731 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700732 mIncrementalService = std::make_unique<
733 IncrementalService>(MockServiceManager(std::move(vold),
734 std::move(dataloaderManager),
735 std::move(incFs), std::move(appOps),
736 std::move(jni), std::move(looper),
737 std::move(timedQueue),
738 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800739 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700740 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800741 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800742 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700743 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800744 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800745 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700746 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800747 }
748
749 void setUpExistingMountDir(const std::string& rootDir) {
750 const auto dir = rootDir + "/dir1";
751 const auto mountDir = dir + "/mount";
752 const auto backingDir = dir + "/backing_store";
753 const auto storageDir = mountDir + "/st0";
754 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
755 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
756 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
757 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
758 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
759 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
760 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
761 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800762 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
763 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
764 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
765 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
766 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
767 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800768 }
769
Songchun Fan374f7652020-08-20 08:40:29 -0700770 void setupSuccess() {
771 mVold->mountIncFsSuccess();
772 mIncFs->makeFileSuccess();
773 mVold->bindMountSuccess();
774 mDataLoaderManager->bindToDataLoaderSuccess();
775 mDataLoaderManager->getDataLoaderSuccess();
776 }
777
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000778 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
779 android::os::PersistableBundle result{};
780 mIncrementalService->getMetrics(storageId, &result);
781 int64_t value = -1;
782 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
783 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
784 .c_str()),
785 &value));
786 ASSERT_EQ(expected, value);
787 ASSERT_EQ(1, (int)result.size());
788 }
789
Songchun Fan3c82a302019-11-29 14:23:45 -0800790protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700791 NiceMock<MockVoldService>* mVold = nullptr;
792 NiceMock<MockIncFs>* mIncFs = nullptr;
793 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
794 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
795 NiceMock<MockJniWrapper>* mJni = nullptr;
796 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700797 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700798 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700799 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800800 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700801 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800802 std::unique_ptr<IncrementalService> mIncrementalService;
803 TemporaryDir mRootDir;
804 DataLoaderParamsParcel mDataLoaderParcel;
805};
806
Songchun Fan3c82a302019-11-29 14:23:45 -0800807TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
808 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800809 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800810 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800811 int storageId =
812 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
813 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800814 ASSERT_LT(storageId, 0);
815}
816
817TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
818 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800819 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700820 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800821 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800822 int storageId =
823 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
824 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800825 ASSERT_LT(storageId, 0);
826}
827
828TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
829 mVold->mountIncFsSuccess();
830 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800831 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700832 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800833 EXPECT_CALL(*mVold, unmountIncFs(_));
834 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800835 int storageId =
836 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
837 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800838 ASSERT_LT(storageId, 0);
839}
840
841TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
842 mVold->mountIncFsSuccess();
843 mIncFs->makeFileSuccess();
844 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800845 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700846 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800847 EXPECT_CALL(*mVold, unmountIncFs(_));
848 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800849 int storageId =
850 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
851 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800852 ASSERT_LT(storageId, 0);
853}
854
855TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
856 mVold->mountIncFsSuccess();
857 mIncFs->makeFileSuccess();
858 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700859 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800860 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700861 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700862 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
863 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
864 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800865 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
866 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800867 int storageId =
868 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
869 IncrementalService::CreateOptions::CreateNew);
870 ASSERT_GE(storageId, 0);
871 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800872}
873
874TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700875 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800876 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700877 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800878 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
879 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800880 int storageId =
881 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
882 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800883 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800884 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800885 mIncrementalService->deleteStorage(storageId);
886}
887
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800888TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700889 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700890 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700891 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
892 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700893 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800894 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
895 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800896 int storageId =
897 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
898 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800899 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800900 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800901
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700902 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800903
904 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
905 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700906 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700907 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700908 mDataLoaderManager->setDataLoaderStatusDestroyed();
909
910 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
911 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800912 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700913 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800914 mDataLoaderManager->setDataLoaderStatusDestroyed();
915
916 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
917 .WillByDefault(Invoke(mDataLoaderManager,
918 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700919 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800920 mDataLoaderManager->setDataLoaderStatusDestroyed();
921
922 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
923 .WillByDefault(Invoke(mDataLoaderManager,
924 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700925 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800926 mDataLoaderManager->setDataLoaderStatusDestroyed();
927
928 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
929 .WillByDefault(Invoke(mDataLoaderManager,
930 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700931 // Try the reduced delay, just in case.
932 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800933 mDataLoaderManager->setDataLoaderStatusDestroyed();
934
935 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
936 .WillByDefault(Invoke(mDataLoaderManager,
937 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700938 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700939 mDataLoaderManager->setDataLoaderStatusDestroyed();
940}
941
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800942TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
943 mIncFs->waitForPendingReadsSuccess();
944 mIncFs->openMountSuccess();
945
946 constexpr auto bindRetryInterval = 5s;
947
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700948 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800949 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700950 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
951 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800952 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
953 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700954 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800955 TemporaryDir tempDir;
956 int storageId =
957 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
958 IncrementalService::CreateOptions::CreateNew);
959 ASSERT_GE(storageId, 0);
960
961 // First binds to DataLoader fails... because it's restart.
962 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
963 .WillByDefault(Invoke(mDataLoaderManager,
964 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
965
966 // Request DL start.
967 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
968
969 // Retry callback present.
970 ASSERT_EQ(storageId, mTimedQueue->mId);
971 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
972 auto retryCallback = mTimedQueue->mWhat;
973 mTimedQueue->clearJob(storageId);
974
975 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
976 mClock->advance(5s);
977
978 retryCallback();
979 // Retry callback present.
980 ASSERT_EQ(storageId, mTimedQueue->mId);
981 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
982 retryCallback = mTimedQueue->mWhat;
983 mTimedQueue->clearJob(storageId);
984
985 // Returning "binding" so that we can retry.
986 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
987 .WillByDefault(Invoke(mDataLoaderManager,
988 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
989
990 // Expecting bindToDataLoaderBindingWithNoDelay call.
991 mClock->advance(5s);
992
993 retryCallback();
994 // No retry callback.
995 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
996 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
997
998 // Should not change the bindToDataLoader call count
999 ASSERT_NE(nullptr, mLooper->mCallback);
1000 ASSERT_NE(nullptr, mLooper->mCallbackData);
1001 auto looperCb = mLooper->mCallback;
1002 auto looperCbData = mLooper->mCallbackData;
1003 looperCb(-1, -1, looperCbData);
1004
1005 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1006 mClock->advance(5s);
1007
1008 // Use pending reads callback to trigger binding.
1009 looperCb(-1, -1, looperCbData);
1010
1011 // No retry callback.
1012 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1013 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1014
1015 // Now we are out of 10m "retry" budget, let's finally bind.
1016 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1017 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1018 mClock->advance(11min);
1019
1020 // Use pending reads callback to trigger binding.
1021 looperCb(-1, -1, looperCbData);
1022
1023 // No retry callback.
1024 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1025 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1026
1027 // And test the rest of the backoff.
1028 // Simulated crash/other connection breakage.
1029 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1030 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001031 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001032 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001033 mDataLoaderManager->setDataLoaderStatusDestroyed();
1034
1035 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1036 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001037 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001038 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001039 mDataLoaderManager->setDataLoaderStatusDestroyed();
1040
1041 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1042 .WillByDefault(Invoke(mDataLoaderManager,
1043 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001044 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001045 mDataLoaderManager->setDataLoaderStatusDestroyed();
1046
1047 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1048 .WillByDefault(Invoke(mDataLoaderManager,
1049 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001050 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001051 mDataLoaderManager->setDataLoaderStatusDestroyed();
1052
1053 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1054 .WillByDefault(Invoke(mDataLoaderManager,
1055 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001056 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001057 mDataLoaderManager->setDataLoaderStatusDestroyed();
1058
1059 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1060 .WillByDefault(Invoke(mDataLoaderManager,
1061 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001062 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001063 mDataLoaderManager->setDataLoaderStatusDestroyed();
1064}
1065
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001066TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001067 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001068 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001069 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001070 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1071 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1072 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1073 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1074 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001075 int storageId =
1076 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1077 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001078 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001079 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1080 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001081 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001082 mDataLoaderManager->setDataLoaderStatusStarted();
1083}
1084
1085TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001086 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001087 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001088 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001089 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001090 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1091 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1092 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1093 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001094 int storageId =
1095 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1096 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001097 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001098 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1099 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001100 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001101}
1102
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001103TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001104 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001105 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001106 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1107 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1108 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1109 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1110 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1111 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001112 int storageId =
1113 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1114 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001115 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001116 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1117 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001118 mDataLoaderManager->setDataLoaderStatusUnavailable();
1119}
1120
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001121TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1122 mDataLoader->initializeCreateOkNoStatus();
1123 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1124 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1125 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1126 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1127 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1128 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1129 TemporaryDir tempDir;
1130 int storageId =
1131 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1132 IncrementalService::CreateOptions::CreateNew);
1133 ASSERT_GE(storageId, 0);
1134 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1135 {}, {}));
1136 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1137}
1138
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001139TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001140 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001141 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001142 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001143
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001144 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001145 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001146 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1147 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001148 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001149 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1150 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1151 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1152 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001153 int storageId =
1154 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1155 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001156 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001157 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1158 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001159 mDataLoaderManager->setDataLoaderStatusUnavailable();
1160 ASSERT_NE(nullptr, mLooper->mCallback);
1161 ASSERT_NE(nullptr, mLooper->mCallbackData);
1162 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1163}
1164
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001165TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001166 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001167
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001168 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001169 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1170 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1171 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1172 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1173 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1174 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1175 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001176 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001177
1178 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1179 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1180 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1181 .Times(2);
1182 EXPECT_CALL(*listenerMock,
1183 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1184 .Times(1);
1185 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1186 .Times(1);
1187 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1188 .Times(2);
1189
1190 StorageHealthCheckParams params;
1191 params.blockedTimeoutMs = 10000;
1192 params.unhealthyTimeoutMs = 20000;
1193 params.unhealthyMonitoringMs = 30000;
1194
1195 using MS = std::chrono::milliseconds;
1196 using MCS = std::chrono::microseconds;
1197
1198 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1199 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1200 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1201
1202 const uint64_t kFirstTimestampUs = 1000000000ll;
1203 const uint64_t kBlockedTimestampUs =
1204 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1205 const uint64_t kUnhealthyTimestampUs =
1206 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1207
1208 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001209 int storageId =
1210 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1211 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001212 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001213 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1214 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001215
1216 // Healthy state, registered for pending reads.
1217 ASSERT_NE(nullptr, mLooper->mCallback);
1218 ASSERT_NE(nullptr, mLooper->mCallbackData);
1219 ASSERT_EQ(storageId, listener->mStorageId);
1220 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001221 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001222
1223 // Looper/epoll callback.
1224 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1225 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1226
1227 // Unregister from pending reads and wait.
1228 ASSERT_EQ(nullptr, mLooper->mCallback);
1229 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1230 ASSERT_EQ(storageId, listener->mStorageId);
1231 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1232 // Timed callback present.
1233 ASSERT_EQ(storageId, mTimedQueue->mId);
1234 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1235 auto timedCallback = mTimedQueue->mWhat;
1236 mTimedQueue->clearJob(storageId);
1237
1238 // Timed job callback for blocked.
1239 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1240 timedCallback();
1241
1242 // Still not registered, and blocked.
1243 ASSERT_EQ(nullptr, mLooper->mCallback);
1244 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1245 ASSERT_EQ(storageId, listener->mStorageId);
1246 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001247 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1248
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001249 // Timed callback present.
1250 ASSERT_EQ(storageId, mTimedQueue->mId);
1251 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1252 timedCallback = mTimedQueue->mWhat;
1253 mTimedQueue->clearJob(storageId);
1254
1255 // Timed job callback for unhealthy.
1256 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1257 timedCallback();
1258
1259 // Still not registered, and blocked.
1260 ASSERT_EQ(nullptr, mLooper->mCallback);
1261 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1262 ASSERT_EQ(storageId, listener->mStorageId);
1263 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001264 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1265
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001266 // Timed callback present.
1267 ASSERT_EQ(storageId, mTimedQueue->mId);
1268 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1269 timedCallback = mTimedQueue->mWhat;
1270 mTimedQueue->clearJob(storageId);
1271
1272 // One more unhealthy.
1273 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1274 timedCallback();
1275
1276 // Still not registered, and blocked.
1277 ASSERT_EQ(nullptr, mLooper->mCallback);
1278 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1279 ASSERT_EQ(storageId, listener->mStorageId);
1280 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001281 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1282
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001283 // Timed callback present.
1284 ASSERT_EQ(storageId, mTimedQueue->mId);
1285 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1286 timedCallback = mTimedQueue->mWhat;
1287 mTimedQueue->clearJob(storageId);
1288
1289 // And now healthy.
1290 mIncFs->waitForPendingReadsTimeout();
1291 timedCallback();
1292
1293 // Healthy state, registered for pending reads.
1294 ASSERT_NE(nullptr, mLooper->mCallback);
1295 ASSERT_NE(nullptr, mLooper->mCallbackData);
1296 ASSERT_EQ(storageId, listener->mStorageId);
1297 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001298 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001299}
1300
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001301TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001302 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001303 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001304
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001305 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001306 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001307 // on startLoading
1308 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001309 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001310 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001311 // After setIncFsMountOptions succeeded expecting to start watching.
1312 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1313 // Not expecting callback removal.
1314 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001315 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001316 int storageId =
1317 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1318 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001319 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001320 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1321 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001322 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001323}
1324
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001325TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001326 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001327 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001328
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001329 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1330 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1331 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001332 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1333 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001334 // After setIncFsMountOptions succeeded expecting to start watching.
1335 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1336 // Not expecting callback removal.
1337 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1338 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001339 int storageId =
1340 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1341 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001342 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001343 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1344 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001345 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1346 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001347 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001348 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1349}
1350
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001351TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1352 mVold->setIncFsMountOptionsSuccess();
1353 mAppOpsManager->checkPermissionSuccess();
1354
1355 const auto readLogsMaxInterval = 2h;
1356
1357 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1358 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1359 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001360 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(2);
1361 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001362 // After setIncFsMountOptions succeeded expecting to start watching.
1363 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1364 // Not expecting callback removal.
1365 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001366 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001367 TemporaryDir tempDir;
1368 int storageId =
1369 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1370 IncrementalService::CreateOptions::CreateNew);
1371 ASSERT_GE(storageId, 0);
1372 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1373 {}, {}));
1374
1375 // Disable readlogs callback present.
1376 ASSERT_EQ(storageId, mTimedQueue->mId);
1377 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1378 auto callback = mTimedQueue->mWhat;
1379 mTimedQueue->clearJob(storageId);
1380
1381 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1382 // Now advance clock for 1hr.
1383 mClock->advance(1h);
1384 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1385 // Now call the timed callback, it should turn off the readlogs.
1386 callback();
1387 // Now advance clock for 2hrs.
1388 mClock->advance(readLogsMaxInterval);
1389 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1390}
1391
1392TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1393 mVold->setIncFsMountOptionsSuccess();
1394 mAppOpsManager->checkPermissionSuccess();
1395
1396 const auto readLogsMaxInterval = 2h;
1397
1398 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1399 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1400 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001401 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(3);
1402 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001403 // After setIncFsMountOptions succeeded expecting to start watching.
1404 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1405 // Not expecting callback removal.
1406 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001407 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001408 // System data loader.
1409 mDataLoaderParcel.packageName = "android";
1410 TemporaryDir tempDir;
1411 int storageId =
1412 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1413 IncrementalService::CreateOptions::CreateNew);
1414 ASSERT_GE(storageId, 0);
1415 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1416 {}, {}));
1417
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001418 // IfsState callback.
1419 auto callback = mTimedQueue->mWhat;
1420 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001421
1422 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1423 // Now advance clock for 1hr.
1424 mClock->advance(1h);
1425 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1426 // Now advance clock for 2hrs.
1427 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001428 // IfsStorage callback should not affect anything.
1429 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001430 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1431}
1432
1433TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1434 mVold->setIncFsMountOptionsSuccess();
1435 mAppOpsManager->checkPermissionSuccess();
1436
1437 const auto readLogsMaxInterval = 2h;
1438
1439 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1440 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1441 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001442 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(5);
1443 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(3);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001444 // After setIncFsMountOptions succeeded expecting to start watching.
1445 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1446 // Not expecting callback removal.
1447 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001448 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001449 TemporaryDir tempDir;
1450 int storageId =
1451 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1452 IncrementalService::CreateOptions::CreateNew);
1453 ASSERT_GE(storageId, 0);
1454
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001455 // Before install - long timeouts.
1456 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1457
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001458 auto dataLoaderParcel = mDataLoaderParcel;
1459 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1460 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001461 // During install - short timeouts.
1462 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001463
1464 // Disable readlogs callback present.
1465 ASSERT_EQ(storageId, mTimedQueue->mId);
1466 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1467 auto callback = mTimedQueue->mWhat;
1468 mTimedQueue->clearJob(storageId);
1469
1470 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1471 // Now advance clock for 1.5hrs.
1472 mClock->advance(90min);
1473 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1474
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001475 mIncrementalService->onInstallationComplete(storageId);
1476 // After install - long timeouts.
1477 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1478
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001479 // New installation.
1480 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1481 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001482 // New installation - short timeouts.
1483 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001484
1485 // New callback present.
1486 ASSERT_EQ(storageId, mTimedQueue->mId);
1487 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1488 auto callback2 = mTimedQueue->mWhat;
1489 mTimedQueue->clearJob(storageId);
1490
1491 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1492 callback();
1493 // Advance clock for another 1.5hrs.
1494 mClock->advance(90min);
1495 // Still success even it's 3hrs past first install.
1496 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1497
1498 // New one should disable.
1499 callback2();
1500 // And timeout.
1501 mClock->advance(90min);
1502 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001503
1504 mIncrementalService->onInstallationComplete(storageId);
1505 // After install - long timeouts.
1506 ASSERT_TRUE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001507}
1508
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001509TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001510 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001511 mAppOpsManager->checkPermissionSuccess();
1512 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001513
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001514 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001515 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1516 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001517 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001518 // setIncFsMountOptions(false) is called on the callback.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001519 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001520 // After setIncFsMountOptions succeeded expecting to start watching.
1521 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1522 // After callback is called, disable read logs and remove callback.
1523 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1524 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001525 int storageId =
1526 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1527 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001528 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001529 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1530 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001531 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001532 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1533 mAppOpsManager->mStoredCallback->opChanged(0, {});
1534}
1535
1536TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001537 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001538
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001539 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001540 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1541 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001542 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1543 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001544 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1545 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1546 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001547 int storageId =
1548 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1549 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001550 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001551 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1552 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001553 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001554}
1555
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001556TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1557 mAppOpsManager->checkPermissionNoCrossUsers();
1558
1559 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1560 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1561 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001562 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1563 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001564 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1565 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1566 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001567 int storageId =
1568 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1569 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001570 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001571 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1572 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001573 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1574}
1575
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001576TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001577 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001578 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001579
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001580 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001581 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001582 // We are calling setIncFsMountOptions.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001583 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1584 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001585 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1586 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1587 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001588 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001589 int storageId =
1590 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1591 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001592 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001593 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1594 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001595 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001596}
1597
Songchun Fan3c82a302019-11-29 14:23:45 -08001598TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001599 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001600 int storageId =
1601 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1602 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001603 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001604
Songchun Fan103ba1d2020-02-03 17:32:32 -08001605 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001606 // <root>/*/mount/<storage>/test
1607 EXPECT_CALL(*mIncFs,
1608 makeDir(_, Truly([&](std::string_view arg) {
1609 return arg.starts_with(mRootDir.path) &&
1610 arg.ends_with("/mount/st_1_0/" + dir_path);
1611 }),
1612 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001613 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1614 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001615}
1616
1617TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001618 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001619 int storageId =
1620 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1621 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001622 auto first = "first"sv;
1623 auto second = "second"sv;
1624 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001625 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001626
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001627 EXPECT_CALL(*mIncFs,
1628 makeDirs(_, Truly([&](std::string_view arg) {
1629 return arg.starts_with(mRootDir.path) &&
1630 arg.ends_with("/mount/st_1_0/" + dir_path);
1631 }),
1632 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001633 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001634 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001635}
Songchun Fan374f7652020-08-20 08:40:29 -07001636
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001637TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
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::MissingBlocks));
1645 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001646}
1647
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001648TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001649 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001650 int storageId =
1651 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1652 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001653 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001654 .Times(1)
1655 .WillOnce(Return(incfs::LoadingState(-1)));
1656 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001657}
1658
1659TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001660 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001661 int storageId =
1662 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1663 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001664 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001665 .Times(1)
1666 .WillOnce(Return(incfs::LoadingState::Full));
1667 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001668}
1669
Songchun Fan425862f2020-08-25 13:12:16 -07001670TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001671 mIncFs->countFilledBlocksSuccess();
1672 mFs->hasNoFile();
1673
1674 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001675 int storageId =
1676 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1677 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001678 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001679}
1680
1681TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1682 mIncFs->countFilledBlocksFails();
1683 mFs->hasFiles();
1684
1685 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001686 int storageId =
1687 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1688 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001689 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001690 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001691}
1692
Songchun Fan425862f2020-08-25 13:12:16 -07001693TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001694 mIncFs->countFilledBlocksEmpty();
1695 mFs->hasFiles();
1696
1697 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001698 int storageId =
1699 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1700 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001701 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001702 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001703}
1704
1705TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1706 mIncFs->countFilledBlocksSuccess();
1707 mFs->hasFiles();
1708
1709 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001710 int storageId =
1711 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1712 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001713 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001714 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001715}
Songchun Fana7098592020-09-03 11:45:53 -07001716
1717TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1718 mIncFs->countFilledBlocksSuccess();
1719 mFs->hasFiles();
1720
1721 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001722 int storageId =
1723 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1724 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001725 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1726 new NiceMock<MockStorageLoadingProgressListener>};
1727 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1728 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1729 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1730 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1731 // Timed callback present.
1732 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1733 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1734 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1735 timedCallback();
1736 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1737 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1738 mIncrementalService->unregisterLoadingProgressListener(storageId);
1739 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1740}
1741
1742TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1743 mIncFs->countFilledBlocksFails();
1744 mFs->hasFiles();
1745
1746 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001747 int storageId =
1748 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1749 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001750 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1751 new NiceMock<MockStorageLoadingProgressListener>};
1752 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1753 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1754 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1755}
Songchun Fan2570ec02020-10-08 17:22:33 -07001756
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001757TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1758 mFs->hasFiles();
1759
1760 const auto stateUpdateInterval = 1s;
1761
1762 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1763 // No unbinding just yet.
1764 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1765 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1766 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1767 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1768 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1769 // System data loader to get rid of readlog timeout callback.
1770 mDataLoaderParcel.packageName = "android";
1771 TemporaryDir tempDir;
1772 int storageId =
1773 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1774 IncrementalService::CreateOptions::CreateNew);
1775 ASSERT_GE(storageId, 0);
1776 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1777 {}, {}));
1778
1779 // Started.
1780 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1781
1782 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001783 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001784 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1785 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001786 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001787
1788 // Not loaded yet.
1789 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1790 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1791
1792 // Send the callback, should not do anything.
1793 callback();
1794
1795 // Still started.
1796 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1797
1798 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001799 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001800 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1801 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001802 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001803
1804 // Fully loaded.
1805 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1806 // Expect the unbind.
1807 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1808
1809 callback();
1810
1811 // Destroyed.
1812 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1813}
1814
1815TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1816 mFs->hasFiles();
1817
1818 // Readlogs.
1819 mVold->setIncFsMountOptionsSuccess();
1820 mAppOpsManager->checkPermissionSuccess();
1821
1822 const auto stateUpdateInterval = 1s;
1823
1824 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1825 // No unbinding just yet.
1826 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1827 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1828 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1829 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1830 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1831 // System data loader to get rid of readlog timeout callback.
1832 mDataLoaderParcel.packageName = "android";
1833 TemporaryDir tempDir;
1834 int storageId =
1835 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1836 IncrementalService::CreateOptions::CreateNew);
1837 ASSERT_GE(storageId, 0);
1838 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1839 {}, {}));
1840
1841 // Started.
1842 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1843
1844 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001845 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001846 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1847 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001848 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001849
1850 // Not loaded yet.
1851 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1852 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1853
1854 // Send the callback, should not do anything.
1855 callback();
1856
1857 // Still started.
1858 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1859
1860 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001861 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001862 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1863 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001864 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001865
1866 // Fully loaded.
1867 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1868 .WillOnce(Return(incfs::LoadingState::Full))
1869 .WillOnce(Return(incfs::LoadingState::Full));
1870 // But with readlogs.
1871 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1872
1873 // Send the callback, still nothing.
1874 callback();
1875
1876 // Still started.
1877 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1878
1879 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001880 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001881 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1882 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001883 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001884
1885 // Disable readlogs and expect the unbind.
1886 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1887 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1888
1889 callback();
1890
1891 // Destroyed.
1892 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1893}
1894
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001895static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1896 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1897 std::vector<PerUidReadTimeouts> result;
1898 for (auto&& tuple : tuples) {
1899 result.emplace_back();
1900 auto& timeouts = result.back();
1901 timeouts.uid = std::get<0>(tuple);
1902 timeouts.minTimeUs = std::get<1>(tuple);
1903 timeouts.minPendingTimeUs = std::get<2>(tuple);
1904 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1905 }
1906 return result;
1907}
1908
1909static ErrorCode checkPerUidTimeouts(const Control& control,
1910 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1911 std::vector<PerUidReadTimeouts> expected =
1912 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1913 EXPECT_EQ(expected, perUidReadTimeouts);
1914 return 0;
1915}
1916
1917static ErrorCode checkPerUidTimeoutsEmpty(
1918 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1919 EXPECT_EQ(0u, perUidReadTimeouts.size());
1920 return 0;
1921}
1922
1923TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001924 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001925 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1926 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001927 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001928 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1929 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001930 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001931 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1932 TemporaryDir tempDir;
1933 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001934 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1935 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001936 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001937 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1938 createPerUidTimeouts(
1939 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001940}
1941
1942TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
1943 mVold->setIncFsMountOptionsSuccess();
1944 mAppOpsManager->checkPermissionSuccess();
1945 mFs->hasFiles();
1946
1947 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
1948 // First call.
1949 .WillOnce(Invoke(&checkPerUidTimeouts))
1950 // Fully loaded and no readlogs.
1951 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
1952 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
1953
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001954 // Loading storage.
1955 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1956 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
1957 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001958 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001959
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001960 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
1961 mDataLoaderParcel.packageName = "android";
1962
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001963 TemporaryDir tempDir;
1964 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001965 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1966 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001967 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001968 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1969 createPerUidTimeouts(
1970 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001971
1972 {
1973 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001974 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001975 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1976 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001977 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001978
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001979 // Call it again.
1980 timedCallback();
1981 }
1982
1983 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001984 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001985 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001986 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1987 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001988 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001989
1990 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001991 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1992
1993 // Call it again.
1994 timedCallback();
1995 }
1996
1997 {
1998 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001999 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002000 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2001 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002002 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002003
2004 // Now disable readlogs.
2005 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2006
2007 // Call it again.
2008 timedCallback();
2009 }
2010
2011 // No callbacks anymore -> fully loaded and no readlogs.
2012 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2013}
2014
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002015TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2016 const auto invalidStorageId = 100;
2017 android::os::PersistableBundle result{};
2018 mIncrementalService->getMetrics(invalidStorageId, &result);
2019 int64_t expected = -1, value = -1;
2020 ASSERT_FALSE(
2021 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2022 .c_str()),
2023 &value));
2024 ASSERT_EQ(expected, value);
2025 ASSERT_TRUE(result.empty());
2026}
2027
2028TEST_F(IncrementalServiceTest, testNoMetrics) {
2029 mVold->setIncFsMountOptionsSuccess();
2030 TemporaryDir tempDir;
2031 int storageId =
2032 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2033 IncrementalService::CreateOptions::CreateNew);
2034 ASSERT_GE(storageId, 0);
2035 android::os::PersistableBundle result{};
2036 mIncrementalService->getMetrics(storageId, &result);
2037 int64_t expected = -1, value = -1;
2038 ASSERT_FALSE(
2039 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2040 .c_str()),
2041 &value));
2042 ASSERT_EQ(expected, value);
2043 ASSERT_EQ(0, (int)result.size());
2044}
2045
2046TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2047 mVold->setIncFsMountOptionsSuccess();
2048 TemporaryDir tempDir;
2049 int storageId =
2050 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2051 IncrementalService::CreateOptions::CreateNew);
2052 ASSERT_GE(storageId, 0);
2053 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2054 {}, {}));
2055 android::os::PersistableBundle result{};
2056 mIncrementalService->getMetrics(storageId, &result);
2057 int64_t expected = -1, value = -1;
2058 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2059 ASSERT_EQ(expected, value);
2060 ASSERT_EQ(1, (int)result.size());
2061}
2062
Songchun Fan3c82a302019-11-29 14:23:45 -08002063} // namespace android::os::incremental