blob: 14bcd4e7b9ba3462d0f1e004945be01fd3b55646 [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 }
Songchun Fan2570ec02020-10-08 17:22:33 -0700187 binder::Status storageError(int32_t id) {
188 if (mListener) {
189 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
190 }
191 return binder::Status::ok();
192 }
193 binder::Status transportError(int32_t id) {
194 if (mListener) {
195 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
196 }
197 return binder::Status::ok();
198 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700199 int32_t setStorageParams(bool enableReadLogs) {
200 int32_t result = -1;
201 EXPECT_NE(mServiceConnector.get(), nullptr);
202 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
203 return result;
204 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700205 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700206
207private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700208 void setAndReportStatus(int id, int status) {
209 mStatus = status;
210 reportStatus(id);
211 }
212 void reportStatus(int id) {
213 if (mListener) {
214 mListener->onStatusChanged(id, mStatus);
215 }
216 }
217
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700218 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700219 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700220 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800221};
222
223class MockDataLoaderManager : public DataLoaderManagerWrapper {
224public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700225 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
226 EXPECT_TRUE(mDataLoaderHolder != nullptr);
227 }
228
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800229 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800230 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800231 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800232 const sp<IDataLoaderStatusListener>& listener,
233 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800234 MOCK_CONST_METHOD2(getDataLoader,
235 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700236 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800237
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700238 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800239 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700240 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700241 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700242 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800243 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700244 .WillByDefault(Return(
245 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
246 }
247 void getDataLoaderSuccess() {
248 ON_CALL(*this, getDataLoader(_, _))
249 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
250 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700251 void unbindFromDataLoaderSuccess() {
252 ON_CALL(*this, unbindFromDataLoader(_))
253 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700254 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700255 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800256 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700257 const sp<IDataLoaderStatusListener>& listener,
258 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800259 mId = mountId;
260 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700261 mDataLoader = mDataLoaderHolder;
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700262 mBindDelayMs = bindDelayMs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800263 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700264 if (mListener) {
265 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
266 }
267 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800268 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800269 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
270 const DataLoaderParamsParcel& params,
271 int bindDelayMs,
272 const sp<IDataLoaderStatusListener>& listener,
273 bool* _aidl_return) {
274 CHECK(bindDelayMs == 0) << bindDelayMs;
275 *_aidl_return = false;
276 return binder::Status::ok();
277 }
278 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
279 const DataLoaderParamsParcel& params,
280 int bindDelayMs,
281 const sp<IDataLoaderStatusListener>& listener,
282 bool* _aidl_return) {
283 CHECK(bindDelayMs == 0) << bindDelayMs;
284 *_aidl_return = true;
285 if (listener) {
286 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
287 }
288 return binder::Status::ok();
289 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700290 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
291 const DataLoaderParamsParcel& params,
292 int bindDelayMs,
293 const sp<IDataLoaderStatusListener>& listener,
294 bool* _aidl_return) {
295 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
296 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
297 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800298 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
299 const DataLoaderParamsParcel& params,
300 int bindDelayMs,
301 const sp<IDataLoaderStatusListener>& listener,
302 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700303 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800304 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
305 }
306 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
307 const DataLoaderParamsParcel& params,
308 int bindDelayMs,
309 const sp<IDataLoaderStatusListener>& listener,
310 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700311 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800312 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
313 }
314 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
315 const DataLoaderParamsParcel& params,
316 int bindDelayMs,
317 const sp<IDataLoaderStatusListener>& listener,
318 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700319 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
320 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800321 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
322 }
323 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
324 const DataLoaderParamsParcel& params,
325 int bindDelayMs,
326 const sp<IDataLoaderStatusListener>& listener,
327 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700328 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800329 << bindDelayMs;
330 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
331 }
332
Songchun Fan68645c42020-02-27 15:57:35 -0800333 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
334 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800335 return binder::Status::ok();
336 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700337 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800338 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800339 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700340 void setDataLoaderStatusStarted() {
341 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
342 }
343 void setDataLoaderStatusDestroyed() {
344 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
345 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700346 void setDataLoaderStatusUnavailable() {
347 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
348 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800349 void setDataLoaderStatusUnrecoverable() {
350 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
351 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700352 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700353 if (mDataLoader) {
354 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
355 return status;
356 }
357 mDataLoader = nullptr;
358 }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700359 mBindDelayMs = -1;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700360 if (mListener) {
361 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
362 }
363 return binder::Status::ok();
364 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700365
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700366 int bindDelayMs() const { return mBindDelayMs; }
367
Songchun Fan3c82a302019-11-29 14:23:45 -0800368private:
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700369 int mId = -1;
370 int mBindDelayMs = -1;
Songchun Fan3c82a302019-11-29 14:23:45 -0800371 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700372 sp<IDataLoader> mDataLoader;
373 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800374};
375
376class MockIncFs : public IncFsWrapper {
377public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800378 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700379 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
380 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800381 MOCK_CONST_METHOD4(createControl,
382 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
383 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800384 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800385 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800386 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800387 MOCK_CONST_METHOD4(makeMappedFile,
388 ErrorCode(const Control& control, std::string_view path, int mode,
389 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800390 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700391 MOCK_CONST_METHOD3(makeDirs,
392 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800393 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
394 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
395 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700396 MOCK_CONST_METHOD2(countFilledBlocks,
397 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
398 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700399 MOCK_CONST_METHOD2(isFileFullyLoaded,
400 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700401 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700402 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800403 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700404 ErrorCode(const Control& control, std::string_view from,
405 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800406 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700407 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700408 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700409 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700410 MOCK_CONST_METHOD3(waitForPendingReads,
411 WaitResult(const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700412 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800413 MOCK_CONST_METHOD2(setUidReadTimeouts,
414 ErrorCode(const Control& control,
415 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700416 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
417 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700418
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700419 MockIncFs() {
420 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
421 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
422 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800423
424 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
425 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700426
427 void countFilledBlocksSuccess() {
428 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
429 }
430
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700431 void countFilledBlocksFullyLoaded() {
432 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
433 }
434
Songchun Fan374f7652020-08-20 08:40:29 -0700435 void countFilledBlocksFails() {
436 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
437 }
438
439 void countFilledBlocksEmpty() {
440 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
441 }
442
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700443 void openMountSuccess() {
444 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
445 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700446
447 // 1000ms
448 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700449 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700450 .WillByDefault(
451 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
Alex Buynytskyyc144cc42021-03-31 22:19:42 -0700452 std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700453 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
454 return android::incfs::WaitResult::HaveData;
455 }));
456 }
457
458 void waitForPendingReadsTimeout() {
459 ON_CALL(*this, waitForPendingReads(_, _, _))
460 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700461 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700462
463 static constexpr auto kPendingReadsFd = 42;
464 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800465 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700466 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700467
Songchun Fan20d6ef22020-03-03 09:47:15 -0800468 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800469 metadata::Mount m;
470 m.mutable_storage()->set_id(100);
471 m.mutable_loader()->set_package_name("com.test");
472 m.mutable_loader()->set_arguments("com.uri");
473 const auto metadata = m.SerializeAsString();
474 m.mutable_loader()->release_arguments();
475 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800476 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800477 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800478 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800479 metadata::Storage st;
480 st.set_id(100);
481 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800482 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800483 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800484 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800485 metadata::BindPoint bp;
486 std::string destPath = "dest";
487 std::string srcPath = "src";
488 bp.set_storage_id(100);
489 bp.set_allocated_dest_path(&destPath);
490 bp.set_allocated_source_subdir(&srcPath);
491 const auto metadata = bp.SerializeAsString();
492 bp.release_source_subdir();
493 bp.release_dest_path();
494 return std::vector<char>(metadata.begin(), metadata.end());
495 }
496};
497
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700498class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700499public:
500 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700501 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700502 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
503
504 void checkPermissionSuccess() {
505 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
506 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800507 void checkPermissionNoCrossUsers() {
508 ON_CALL(*this,
509 checkPermission("android.permission.LOADER_USAGE_STATS",
510 "android:loader_usage_stats", _))
511 .WillByDefault(Return(android::incremental::Ok()));
512 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
513 .WillByDefault(
514 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
515 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700516 void checkPermissionFails() {
517 ON_CALL(*this, checkPermission(_, _, _))
518 .WillByDefault(
519 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
520 }
521 void initializeStartWatchingMode() {
522 ON_CALL(*this, startWatchingMode(_, _, _))
523 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
524 }
525 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
526 mStoredCallback = cb;
527 }
528
529 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700530};
531
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700532class MockJniWrapper : public JniWrapper {
533public:
534 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
535
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700536 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700537};
538
539class MockLooperWrapper : public LooperWrapper {
540public:
541 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
542 MOCK_METHOD1(removeFd, int(int));
543 MOCK_METHOD0(wake, void());
544 MOCK_METHOD1(pollAll, int(int));
545
546 MockLooperWrapper() {
547 ON_CALL(*this, addFd(_, _, _, _, _))
548 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
549 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700550 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700551 }
552
553 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
554 mCallback = callback;
555 mCallbackData = data;
556 return 0;
557 }
558
559 int clearCallback(int) {
560 mCallback = nullptr;
561 mCallbackData = nullptr;
562 return 0;
563 }
564
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700565 int wait10Ms(int) {
566 // This is called from a loop in runCmdLooper.
567 // Sleeping for 10ms only to avoid busy looping.
568 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700569 return 0;
570 }
571
572 android::Looper_callbackFunc mCallback = nullptr;
573 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700574};
575
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700576class MockTimedQueueWrapper : public TimedQueueWrapper {
577public:
578 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
579 MOCK_METHOD1(removeJobs, void(MountId));
580 MOCK_METHOD0(stop, void());
581
582 MockTimedQueueWrapper() {
583 ON_CALL(*this, addJob(_, _, _))
584 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
585 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
586 }
587
588 void storeJob(MountId id, Milliseconds after, Job what) {
589 mId = id;
590 mAfter = after;
591 mWhat = std::move(what);
592 }
593
594 void clearJob(MountId id) {
595 if (mId == id) {
596 mAfter = {};
597 mWhat = {};
598 }
599 }
600
601 MountId mId = -1;
602 Milliseconds mAfter;
603 Job mWhat;
604};
605
Songchun Fan374f7652020-08-20 08:40:29 -0700606class MockFsWrapper : public FsWrapper {
607public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800608 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
609 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700610 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800611 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700612 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
613 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800614 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
615 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
616 if (!onFile(file)) break;
617 }
Songchun Fan374f7652020-08-20 08:40:29 -0700618 }
619};
620
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800621class MockClockWrapper : public ClockWrapper {
622public:
623 MOCK_CONST_METHOD0(now, TimePoint());
624
625 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700626
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800627 template <class Delta>
628 void advance(Delta delta) {
629 mClock += delta;
630 }
631
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700632 void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
633
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800634 TimePoint getClock() const { return mClock; }
635
636 TimePoint mClock = Clock::now();
637};
638
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700639class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
640public:
641 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
642
643 MockStorageHealthListener() {
644 ON_CALL(*this, onHealthStatus(_, _))
645 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
646 }
647
648 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
649 mStorageId = storageId;
650 mStatus = status;
651 return binder::Status::ok();
652 }
653
654 int32_t mStorageId = -1;
655 int32_t mStatus = -1;
656};
657
Songchun Fana7098592020-09-03 11:45:53 -0700658class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
659public:
660 MockStorageLoadingProgressListener() = default;
661 MOCK_METHOD2(onStorageLoadingProgressChanged,
662 binder::Status(int32_t storageId, float progress));
663 MOCK_METHOD0(onAsBinder, IBinder*());
664};
665
Songchun Fan3c82a302019-11-29 14:23:45 -0800666class MockServiceManager : public ServiceManagerWrapper {
667public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800668 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700669 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700670 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700671 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700672 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700673 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700674 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700675 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800676 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800677 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700678 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700679 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700680 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700681 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700682 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700683 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700684 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800685 mFs(std::move(fs)),
686 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800687 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800688 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
689 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800690 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800691 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700692 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
693 return std::move(mAppOpsManager);
694 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700695 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700696 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700697 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700698 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
699 return std::move(mProgressUpdateJobQueue);
700 }
Songchun Fan374f7652020-08-20 08:40:29 -0700701 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800702 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800703
704private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800705 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800706 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800707 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700708 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700709 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700710 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700711 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700712 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700713 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800714 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800715};
716
717// --- IncrementalServiceTest ---
718
Songchun Fan3c82a302019-11-29 14:23:45 -0800719class IncrementalServiceTest : public testing::Test {
720public:
721 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800722 auto vold = std::make_unique<NiceMock<MockVoldService>>();
723 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700724 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
725 mDataLoader = dataLoader.get();
726 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800727 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800728 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
729 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700730 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
731 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700732 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
733 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700734 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
735 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700736 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
737 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700738 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
739 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700740 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
741 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800742 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
743 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700744 mIncrementalService = std::make_unique<
745 IncrementalService>(MockServiceManager(std::move(vold),
746 std::move(dataloaderManager),
747 std::move(incFs), std::move(appOps),
748 std::move(jni), std::move(looper),
749 std::move(timedQueue),
750 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800751 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700752 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800753 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800754 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700755 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800756 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800757 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700758 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800759 }
760
761 void setUpExistingMountDir(const std::string& rootDir) {
762 const auto dir = rootDir + "/dir1";
763 const auto mountDir = dir + "/mount";
764 const auto backingDir = dir + "/backing_store";
765 const auto storageDir = mountDir + "/st0";
766 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
767 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
768 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
769 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
770 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
771 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
772 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
773 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800774 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
775 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
776 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
777 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
778 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
779 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800780 }
781
Songchun Fan374f7652020-08-20 08:40:29 -0700782 void setupSuccess() {
783 mVold->mountIncFsSuccess();
784 mIncFs->makeFileSuccess();
785 mVold->bindMountSuccess();
786 mDataLoaderManager->bindToDataLoaderSuccess();
787 mDataLoaderManager->getDataLoaderSuccess();
788 }
789
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000790 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
791 android::os::PersistableBundle result{};
792 mIncrementalService->getMetrics(storageId, &result);
793 int64_t value = -1;
794 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
795 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
796 .c_str()),
797 &value));
798 ASSERT_EQ(expected, value);
799 ASSERT_EQ(1, (int)result.size());
800 }
801
Songchun Fan3c82a302019-11-29 14:23:45 -0800802protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700803 NiceMock<MockVoldService>* mVold = nullptr;
804 NiceMock<MockIncFs>* mIncFs = nullptr;
805 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
806 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
807 NiceMock<MockJniWrapper>* mJni = nullptr;
808 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700809 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700810 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700811 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800812 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700813 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800814 std::unique_ptr<IncrementalService> mIncrementalService;
815 TemporaryDir mRootDir;
816 DataLoaderParamsParcel mDataLoaderParcel;
817};
818
Songchun Fan3c82a302019-11-29 14:23:45 -0800819TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
820 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800821 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800822 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800823 int storageId =
824 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
825 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800826 ASSERT_LT(storageId, 0);
827}
828
829TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
830 mVold->mountIncFsInvalidControlParcel();
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 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800834 int storageId =
835 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
836 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800837 ASSERT_LT(storageId, 0);
838}
839
840TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
841 mVold->mountIncFsSuccess();
842 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800843 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700844 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800845 EXPECT_CALL(*mVold, unmountIncFs(_));
846 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800847 int storageId =
848 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
849 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800850 ASSERT_LT(storageId, 0);
851}
852
853TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
854 mVold->mountIncFsSuccess();
855 mIncFs->makeFileSuccess();
856 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800857 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700858 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800859 EXPECT_CALL(*mVold, unmountIncFs(_));
860 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800861 int storageId =
862 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
863 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800864 ASSERT_LT(storageId, 0);
865}
866
867TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
868 mVold->mountIncFsSuccess();
869 mIncFs->makeFileSuccess();
870 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700871 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800872 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700873 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700874 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
875 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
876 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800877 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
878 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800879 int storageId =
880 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
881 IncrementalService::CreateOptions::CreateNew);
882 ASSERT_GE(storageId, 0);
883 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800884}
885
886TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700887 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800888 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700889 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800890 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
891 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800892 int storageId =
893 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
894 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800895 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800896 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800897 mIncrementalService->deleteStorage(storageId);
898}
899
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800900TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700901 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700902 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700903 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
904 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700905 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800906 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
907 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800908 int storageId =
909 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
910 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800911 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800912 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800913
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700914 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800915
916 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
917 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700918 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700919 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700920 mDataLoaderManager->setDataLoaderStatusDestroyed();
921
922 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
923 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800924 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
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::bindToDataLoaderOkWith100sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700931 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800932 mDataLoaderManager->setDataLoaderStatusDestroyed();
933
934 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
935 .WillByDefault(Invoke(mDataLoaderManager,
936 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700937 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800938 mDataLoaderManager->setDataLoaderStatusDestroyed();
939
940 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
941 .WillByDefault(Invoke(mDataLoaderManager,
942 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700943 // Try the reduced delay, just in case.
944 mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800945 mDataLoaderManager->setDataLoaderStatusDestroyed();
946
947 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
948 .WillByDefault(Invoke(mDataLoaderManager,
949 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -0700950 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700951 mDataLoaderManager->setDataLoaderStatusDestroyed();
952}
953
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800954TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
955 mIncFs->waitForPendingReadsSuccess();
956 mIncFs->openMountSuccess();
957
958 constexpr auto bindRetryInterval = 5s;
959
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700960 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800961 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700962 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
963 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800964 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
965 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700966 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800967 TemporaryDir tempDir;
968 int storageId =
969 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
970 IncrementalService::CreateOptions::CreateNew);
971 ASSERT_GE(storageId, 0);
972
973 // First binds to DataLoader fails... because it's restart.
974 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
975 .WillByDefault(Invoke(mDataLoaderManager,
976 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
977
978 // Request DL start.
979 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
980
981 // Retry callback present.
982 ASSERT_EQ(storageId, mTimedQueue->mId);
983 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
984 auto retryCallback = mTimedQueue->mWhat;
985 mTimedQueue->clearJob(storageId);
986
987 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
988 mClock->advance(5s);
989
990 retryCallback();
991 // Retry callback present.
992 ASSERT_EQ(storageId, mTimedQueue->mId);
993 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
994 retryCallback = mTimedQueue->mWhat;
995 mTimedQueue->clearJob(storageId);
996
997 // Returning "binding" so that we can retry.
998 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
999 .WillByDefault(Invoke(mDataLoaderManager,
1000 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
1001
1002 // Expecting bindToDataLoaderBindingWithNoDelay call.
1003 mClock->advance(5s);
1004
1005 retryCallback();
1006 // No retry callback.
1007 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1008 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1009
1010 // Should not change the bindToDataLoader call count
1011 ASSERT_NE(nullptr, mLooper->mCallback);
1012 ASSERT_NE(nullptr, mLooper->mCallbackData);
1013 auto looperCb = mLooper->mCallback;
1014 auto looperCbData = mLooper->mCallbackData;
1015 looperCb(-1, -1, looperCbData);
1016
1017 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1018 mClock->advance(5s);
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 // Now we are out of 10m "retry" budget, let's finally bind.
1028 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1029 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1030 mClock->advance(11min);
1031
1032 // Use pending reads callback to trigger binding.
1033 looperCb(-1, -1, looperCbData);
1034
1035 // No retry callback.
1036 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1037 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1038
1039 // And test the rest of the backoff.
1040 // Simulated crash/other connection breakage.
1041 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1042 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001043 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001044 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001045 mDataLoaderManager->setDataLoaderStatusDestroyed();
1046
1047 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1048 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001049 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
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::bindToDataLoaderOkWith100sDelay));
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::bindToDataLoaderOkWith1000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001062 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001063 mDataLoaderManager->setDataLoaderStatusDestroyed();
1064
1065 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1066 .WillByDefault(Invoke(mDataLoaderManager,
1067 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001068 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001069 mDataLoaderManager->setDataLoaderStatusDestroyed();
1070
1071 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1072 .WillByDefault(Invoke(mDataLoaderManager,
1073 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy5ac55532021-03-25 12:33:15 -07001074 mClock->advanceMs(mDataLoaderManager->bindDelayMs());
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001075 mDataLoaderManager->setDataLoaderStatusDestroyed();
1076}
1077
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001078TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001079 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001080 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001081 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001082 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1083 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1084 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1085 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1086 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001087 int storageId =
1088 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1089 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001090 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001091 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1092 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001093 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001094 mDataLoaderManager->setDataLoaderStatusStarted();
1095}
1096
1097TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001098 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001099 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001100 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001101 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001102 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1103 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1104 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1105 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001106 int storageId =
1107 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1108 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001109 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001110 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1111 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001112 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001113}
1114
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001115TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001116 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001117 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001118 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1119 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1120 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1121 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1122 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1123 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001124 int storageId =
1125 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1126 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001127 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001128 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1129 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001130 mDataLoaderManager->setDataLoaderStatusUnavailable();
1131}
1132
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001133TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1134 mDataLoader->initializeCreateOkNoStatus();
1135 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1136 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1137 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1138 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1139 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1140 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1141 TemporaryDir tempDir;
1142 int storageId =
1143 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1144 IncrementalService::CreateOptions::CreateNew);
1145 ASSERT_GE(storageId, 0);
1146 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1147 {}, {}));
1148 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1149}
1150
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001151TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001152 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001153 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001154 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001155
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001156 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001157 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001158 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1159 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001160 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001161 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1162 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1163 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1164 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001165 int storageId =
1166 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1167 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001168 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001169 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1170 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001171 mDataLoaderManager->setDataLoaderStatusUnavailable();
1172 ASSERT_NE(nullptr, mLooper->mCallback);
1173 ASSERT_NE(nullptr, mLooper->mCallbackData);
1174 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1175}
1176
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001177TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001178 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001179
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001180 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001181 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1182 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1183 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1184 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1185 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1186 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1187 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001188 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001189
1190 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1191 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1192 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1193 .Times(2);
1194 EXPECT_CALL(*listenerMock,
1195 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1196 .Times(1);
1197 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1198 .Times(1);
1199 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1200 .Times(2);
1201
1202 StorageHealthCheckParams params;
1203 params.blockedTimeoutMs = 10000;
1204 params.unhealthyTimeoutMs = 20000;
1205 params.unhealthyMonitoringMs = 30000;
1206
1207 using MS = std::chrono::milliseconds;
1208 using MCS = std::chrono::microseconds;
1209
1210 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1211 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1212 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1213
1214 const uint64_t kFirstTimestampUs = 1000000000ll;
1215 const uint64_t kBlockedTimestampUs =
1216 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1217 const uint64_t kUnhealthyTimestampUs =
1218 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1219
1220 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001221 int storageId =
1222 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1223 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001224 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001225 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1226 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001227
1228 // Healthy state, registered for pending reads.
1229 ASSERT_NE(nullptr, mLooper->mCallback);
1230 ASSERT_NE(nullptr, mLooper->mCallbackData);
1231 ASSERT_EQ(storageId, listener->mStorageId);
1232 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001233 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001234
1235 // Looper/epoll callback.
1236 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1237 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1238
1239 // Unregister from pending reads and wait.
1240 ASSERT_EQ(nullptr, mLooper->mCallback);
1241 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1242 ASSERT_EQ(storageId, listener->mStorageId);
1243 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1244 // Timed callback present.
1245 ASSERT_EQ(storageId, mTimedQueue->mId);
1246 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1247 auto timedCallback = mTimedQueue->mWhat;
1248 mTimedQueue->clearJob(storageId);
1249
1250 // Timed job callback for blocked.
1251 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1252 timedCallback();
1253
1254 // Still not registered, and blocked.
1255 ASSERT_EQ(nullptr, mLooper->mCallback);
1256 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1257 ASSERT_EQ(storageId, listener->mStorageId);
1258 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001259 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1260
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001261 // Timed callback present.
1262 ASSERT_EQ(storageId, mTimedQueue->mId);
1263 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1264 timedCallback = mTimedQueue->mWhat;
1265 mTimedQueue->clearJob(storageId);
1266
1267 // Timed job callback for unhealthy.
1268 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1269 timedCallback();
1270
1271 // Still not registered, and blocked.
1272 ASSERT_EQ(nullptr, mLooper->mCallback);
1273 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1274 ASSERT_EQ(storageId, listener->mStorageId);
1275 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001276 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1277
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001278 // Timed callback present.
1279 ASSERT_EQ(storageId, mTimedQueue->mId);
1280 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1281 timedCallback = mTimedQueue->mWhat;
1282 mTimedQueue->clearJob(storageId);
1283
1284 // One more unhealthy.
1285 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1286 timedCallback();
1287
1288 // Still not registered, and blocked.
1289 ASSERT_EQ(nullptr, mLooper->mCallback);
1290 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1291 ASSERT_EQ(storageId, listener->mStorageId);
1292 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001293 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1294
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001295 // Timed callback present.
1296 ASSERT_EQ(storageId, mTimedQueue->mId);
1297 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1298 timedCallback = mTimedQueue->mWhat;
1299 mTimedQueue->clearJob(storageId);
1300
1301 // And now healthy.
1302 mIncFs->waitForPendingReadsTimeout();
1303 timedCallback();
1304
1305 // Healthy state, registered for pending reads.
1306 ASSERT_NE(nullptr, mLooper->mCallback);
1307 ASSERT_NE(nullptr, mLooper->mCallbackData);
1308 ASSERT_EQ(storageId, listener->mStorageId);
1309 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001310 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001311}
1312
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001313TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001314 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001315 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001316
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001317 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001318 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001319 // on startLoading
1320 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001321 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001322 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001323 // After setIncFsMountOptions succeeded expecting to start watching.
1324 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1325 // Not expecting callback removal.
1326 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001327 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001328 int storageId =
1329 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1330 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001331 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001332 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1333 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001334 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001335}
1336
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001337TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001338 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001339 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001340
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001341 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1342 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1343 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001344 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1345 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001346 // After setIncFsMountOptions succeeded expecting to start watching.
1347 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1348 // Not expecting callback removal.
1349 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1350 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001351 int storageId =
1352 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1353 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001354 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001355 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1356 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001357 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1358 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001359 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001360 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1361}
1362
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001363TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1364 mVold->setIncFsMountOptionsSuccess();
1365 mAppOpsManager->checkPermissionSuccess();
1366
1367 const auto readLogsMaxInterval = 2h;
1368
1369 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1370 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1371 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001372 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(2);
1373 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001374 // After setIncFsMountOptions succeeded expecting to start watching.
1375 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1376 // Not expecting callback removal.
1377 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001378 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001379 TemporaryDir tempDir;
1380 int storageId =
1381 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1382 IncrementalService::CreateOptions::CreateNew);
1383 ASSERT_GE(storageId, 0);
1384 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1385 {}, {}));
1386
1387 // Disable readlogs callback present.
1388 ASSERT_EQ(storageId, mTimedQueue->mId);
1389 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1390 auto callback = mTimedQueue->mWhat;
1391 mTimedQueue->clearJob(storageId);
1392
1393 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1394 // Now advance clock for 1hr.
1395 mClock->advance(1h);
1396 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1397 // Now call the timed callback, it should turn off the readlogs.
1398 callback();
1399 // Now advance clock for 2hrs.
1400 mClock->advance(readLogsMaxInterval);
1401 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1402}
1403
1404TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1405 mVold->setIncFsMountOptionsSuccess();
1406 mAppOpsManager->checkPermissionSuccess();
1407
1408 const auto readLogsMaxInterval = 2h;
1409
1410 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1411 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1412 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001413 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(3);
1414 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001415 // After setIncFsMountOptions succeeded expecting to start watching.
1416 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1417 // Not expecting callback removal.
1418 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001419 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001420 // System data loader.
1421 mDataLoaderParcel.packageName = "android";
1422 TemporaryDir tempDir;
1423 int storageId =
1424 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1425 IncrementalService::CreateOptions::CreateNew);
1426 ASSERT_GE(storageId, 0);
1427 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1428 {}, {}));
1429
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001430 // IfsState callback.
1431 auto callback = mTimedQueue->mWhat;
1432 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001433
1434 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1435 // Now advance clock for 1hr.
1436 mClock->advance(1h);
1437 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1438 // Now advance clock for 2hrs.
1439 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001440 // IfsStorage callback should not affect anything.
1441 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001442 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1443}
1444
1445TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1446 mVold->setIncFsMountOptionsSuccess();
1447 mAppOpsManager->checkPermissionSuccess();
1448
1449 const auto readLogsMaxInterval = 2h;
1450
1451 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1452 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1453 // Enabling and then disabling readlogs.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001454 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(5);
1455 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(3);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001456 // After setIncFsMountOptions succeeded expecting to start watching.
1457 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1458 // Not expecting callback removal.
1459 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001460 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001461 TemporaryDir tempDir;
1462 int storageId =
1463 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1464 IncrementalService::CreateOptions::CreateNew);
1465 ASSERT_GE(storageId, 0);
1466
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001467 // Before install - long timeouts.
1468 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1469
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001470 auto dataLoaderParcel = mDataLoaderParcel;
1471 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1472 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001473 // During install - short timeouts.
1474 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001475
1476 // Disable readlogs callback present.
1477 ASSERT_EQ(storageId, mTimedQueue->mId);
1478 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1479 auto callback = mTimedQueue->mWhat;
1480 mTimedQueue->clearJob(storageId);
1481
1482 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1483 // Now advance clock for 1.5hrs.
1484 mClock->advance(90min);
1485 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1486
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001487 mIncrementalService->onInstallationComplete(storageId);
1488 // After install - long timeouts.
1489 ASSERT_TRUE(mVold->readTimeoutsEnabled());
1490
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001491 // New installation.
1492 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1493 {}, {}));
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001494 // New installation - short timeouts.
1495 ASSERT_FALSE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001496
1497 // New callback present.
1498 ASSERT_EQ(storageId, mTimedQueue->mId);
1499 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1500 auto callback2 = mTimedQueue->mWhat;
1501 mTimedQueue->clearJob(storageId);
1502
1503 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1504 callback();
1505 // Advance clock for another 1.5hrs.
1506 mClock->advance(90min);
1507 // Still success even it's 3hrs past first install.
1508 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1509
1510 // New one should disable.
1511 callback2();
1512 // And timeout.
1513 mClock->advance(90min);
1514 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001515
1516 mIncrementalService->onInstallationComplete(storageId);
1517 // After install - long timeouts.
1518 ASSERT_TRUE(mVold->readTimeoutsEnabled());
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001519}
1520
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001521TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001522 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001523 mAppOpsManager->checkPermissionSuccess();
1524 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001525
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001526 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001527 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1528 // We are calling setIncFsMountOptions(true).
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001529 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001530 // setIncFsMountOptions(false) is called on the callback.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001531 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001532 // After setIncFsMountOptions succeeded expecting to start watching.
1533 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1534 // After callback is called, disable read logs and remove callback.
1535 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1536 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001537 int storageId =
1538 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1539 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001540 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001541 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1542 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001543 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001544 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1545 mAppOpsManager->mStoredCallback->opChanged(0, {});
1546}
1547
1548TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001549 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001550
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001551 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001552 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1553 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001554 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1555 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001556 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1557 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1558 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001559 int storageId =
1560 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1561 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001562 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001563 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1564 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001565 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001566}
1567
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001568TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1569 mAppOpsManager->checkPermissionNoCrossUsers();
1570
1571 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1572 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1573 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001574 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(0);
1575 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001576 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1577 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1578 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001579 int storageId =
1580 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1581 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001582 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001583 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1584 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001585 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1586}
1587
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001588TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001589 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001590 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001591
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001592 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001593 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001594 // We are calling setIncFsMountOptions.
Alex Buynytskyyc144cc42021-03-31 22:19:42 -07001595 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _)).Times(1);
1596 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _)).Times(1);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001597 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1598 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1599 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001600 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001601 int storageId =
1602 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1603 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001604 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001605 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1606 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001607 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001608}
1609
Songchun Fan3c82a302019-11-29 14:23:45 -08001610TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001611 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001612 int storageId =
1613 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1614 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001615 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001616
Songchun Fan103ba1d2020-02-03 17:32:32 -08001617 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001618 // <root>/*/mount/<storage>/test
1619 EXPECT_CALL(*mIncFs,
1620 makeDir(_, Truly([&](std::string_view arg) {
1621 return arg.starts_with(mRootDir.path) &&
1622 arg.ends_with("/mount/st_1_0/" + dir_path);
1623 }),
1624 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001625 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1626 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001627}
1628
1629TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001630 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001631 int storageId =
1632 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1633 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001634 auto first = "first"sv;
1635 auto second = "second"sv;
1636 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001637 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001638
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001639 EXPECT_CALL(*mIncFs,
1640 makeDirs(_, Truly([&](std::string_view arg) {
1641 return arg.starts_with(mRootDir.path) &&
1642 arg.ends_with("/mount/st_1_0/" + dir_path);
1643 }),
1644 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001645 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001646 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001647}
Songchun Fan374f7652020-08-20 08:40:29 -07001648
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001649TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001650 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001651 int storageId =
1652 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1653 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001654 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001655 .Times(1)
1656 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1657 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001658}
1659
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001660TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001661 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001662 int storageId =
1663 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1664 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001665 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001666 .Times(1)
1667 .WillOnce(Return(incfs::LoadingState(-1)));
1668 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001669}
1670
1671TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001672 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001673 int storageId =
1674 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1675 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001676 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001677 .Times(1)
1678 .WillOnce(Return(incfs::LoadingState::Full));
1679 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001680}
1681
Songchun Fan425862f2020-08-25 13:12:16 -07001682TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001683 mIncFs->countFilledBlocksSuccess();
1684 mFs->hasNoFile();
1685
1686 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001687 int storageId =
1688 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1689 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001690 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001691}
1692
1693TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1694 mIncFs->countFilledBlocksFails();
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(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001702 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001703}
1704
Songchun Fan425862f2020-08-25 13:12:16 -07001705TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001706 mIncFs->countFilledBlocksEmpty();
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(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001715}
1716
1717TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
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 Fan374f7652020-08-20 08:40:29 -07001725 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001726 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001727}
Songchun Fana7098592020-09-03 11:45:53 -07001728
1729TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1730 mIncFs->countFilledBlocksSuccess();
1731 mFs->hasFiles();
1732
1733 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001734 int storageId =
1735 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1736 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001737 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1738 new NiceMock<MockStorageLoadingProgressListener>};
1739 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1740 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1741 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1742 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1743 // Timed callback present.
1744 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1745 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1746 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1747 timedCallback();
1748 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1749 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1750 mIncrementalService->unregisterLoadingProgressListener(storageId);
1751 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1752}
1753
1754TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1755 mIncFs->countFilledBlocksFails();
1756 mFs->hasFiles();
1757
1758 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001759 int storageId =
1760 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1761 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001762 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1763 new NiceMock<MockStorageLoadingProgressListener>};
1764 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1765 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1766 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1767}
Songchun Fan2570ec02020-10-08 17:22:33 -07001768
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001769TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1770 mFs->hasFiles();
1771
1772 const auto stateUpdateInterval = 1s;
1773
1774 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1775 // No unbinding just yet.
1776 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1777 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1778 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1779 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1780 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1781 // System data loader to get rid of readlog timeout callback.
1782 mDataLoaderParcel.packageName = "android";
1783 TemporaryDir tempDir;
1784 int storageId =
1785 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1786 IncrementalService::CreateOptions::CreateNew);
1787 ASSERT_GE(storageId, 0);
1788 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1789 {}, {}));
1790
1791 // Started.
1792 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1793
1794 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001795 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001796 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1797 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001798 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001799
1800 // Not loaded yet.
1801 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1802 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1803
1804 // Send the callback, should not do anything.
1805 callback();
1806
1807 // Still started.
1808 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1809
1810 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001811 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001812 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1813 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001814 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001815
1816 // Fully loaded.
1817 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1818 // Expect the unbind.
1819 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1820
1821 callback();
1822
1823 // Destroyed.
1824 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1825}
1826
1827TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1828 mFs->hasFiles();
1829
1830 // Readlogs.
1831 mVold->setIncFsMountOptionsSuccess();
1832 mAppOpsManager->checkPermissionSuccess();
1833
1834 const auto stateUpdateInterval = 1s;
1835
1836 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1837 // No unbinding just yet.
1838 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1839 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1840 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1841 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1842 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1843 // System data loader to get rid of readlog timeout callback.
1844 mDataLoaderParcel.packageName = "android";
1845 TemporaryDir tempDir;
1846 int storageId =
1847 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1848 IncrementalService::CreateOptions::CreateNew);
1849 ASSERT_GE(storageId, 0);
1850 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1851 {}, {}));
1852
1853 // Started.
1854 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1855
1856 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001857 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001858 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1859 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001860 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001861
1862 // Not loaded yet.
1863 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1864 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1865
1866 // Send the callback, should not do anything.
1867 callback();
1868
1869 // Still started.
1870 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1871
1872 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001873 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001874 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1875 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001876 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001877
1878 // Fully loaded.
1879 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1880 .WillOnce(Return(incfs::LoadingState::Full))
1881 .WillOnce(Return(incfs::LoadingState::Full));
1882 // But with readlogs.
1883 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1884
1885 // Send the callback, still nothing.
1886 callback();
1887
1888 // Still started.
1889 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1890
1891 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001892 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001893 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1894 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001895 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001896
1897 // Disable readlogs and expect the unbind.
1898 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1899 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1900
1901 callback();
1902
1903 // Destroyed.
1904 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1905}
1906
Songchun Fan2570ec02020-10-08 17:22:33 -07001907TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1908 mIncFs->openMountSuccess();
1909 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1910 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1911 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1912
1913 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001914 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001915 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1916 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001917 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001918 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1919 {});
1920
Songchun Fan2570ec02020-10-08 17:22:33 -07001921 StorageHealthCheckParams newParams;
1922 newParams.blockedTimeoutMs = 10000;
1923 newParams.unhealthyTimeoutMs = 20000;
1924 newParams.unhealthyMonitoringMs = 30000;
1925 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1926 newListener));
1927
1928 using MS = std::chrono::milliseconds;
1929 using MCS = std::chrono::microseconds;
1930
1931 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1932 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1933
1934 const uint64_t kFirstTimestampUs = 1000000000ll;
1935 const uint64_t kBlockedTimestampUs =
1936 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1937 const uint64_t kUnhealthyTimestampUs =
1938 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1939
1940 // test that old listener was not called
1941 EXPECT_CALL(*listener.get(),
1942 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1943 .Times(0);
1944 EXPECT_CALL(*newListenerMock,
1945 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1946 .Times(1);
1947 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1948 .Times(1);
1949 EXPECT_CALL(*newListenerMock,
1950 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1951 .Times(1);
1952 EXPECT_CALL(*newListenerMock,
1953 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1954 .Times(1);
1955 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1956 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1957
1958 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1959 ASSERT_EQ(storageId, newListener->mStorageId);
1960
1961 auto timedCallback = mTimedQueue->mWhat;
1962 mTimedQueue->clearJob(storageId);
1963
1964 // test when health status is blocked with transport error
1965 mDataLoader->transportError(storageId);
1966 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1967 timedCallback();
1968 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1969 timedCallback = mTimedQueue->mWhat;
1970 mTimedQueue->clearJob(storageId);
1971
1972 // test when health status is blocked with storage error
1973 mDataLoader->storageError(storageId);
1974 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1975 timedCallback();
1976 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1977 timedCallback = mTimedQueue->mWhat;
1978 mTimedQueue->clearJob(storageId);
1979
1980 // test when health status is unhealthy with transport error
1981 mDataLoader->transportError(storageId);
1982 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1983 timedCallback();
1984 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1985 mTimedQueue->clearJob(storageId);
1986}
1987
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001988static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1989 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1990 std::vector<PerUidReadTimeouts> result;
1991 for (auto&& tuple : tuples) {
1992 result.emplace_back();
1993 auto& timeouts = result.back();
1994 timeouts.uid = std::get<0>(tuple);
1995 timeouts.minTimeUs = std::get<1>(tuple);
1996 timeouts.minPendingTimeUs = std::get<2>(tuple);
1997 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1998 }
1999 return result;
2000}
2001
2002static ErrorCode checkPerUidTimeouts(const Control& control,
2003 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2004 std::vector<PerUidReadTimeouts> expected =
2005 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
2006 EXPECT_EQ(expected, perUidReadTimeouts);
2007 return 0;
2008}
2009
2010static ErrorCode checkPerUidTimeoutsEmpty(
2011 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2012 EXPECT_EQ(0u, perUidReadTimeouts.size());
2013 return 0;
2014}
2015
2016TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08002017 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002018 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2019 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002020 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002021 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
2022 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002023 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002024 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
2025 TemporaryDir tempDir;
2026 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002027 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2028 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002029 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002030 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2031 createPerUidTimeouts(
2032 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002033}
2034
2035TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2036 mVold->setIncFsMountOptionsSuccess();
2037 mAppOpsManager->checkPermissionSuccess();
2038 mFs->hasFiles();
2039
2040 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2041 // First call.
2042 .WillOnce(Invoke(&checkPerUidTimeouts))
2043 // Fully loaded and no readlogs.
2044 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2045 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2046
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002047 // Loading storage.
2048 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2049 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2050 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002051 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002052
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07002053 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2054 mDataLoaderParcel.packageName = "android";
2055
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002056 TemporaryDir tempDir;
2057 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002058 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2059 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002060 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002061 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2062 createPerUidTimeouts(
2063 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002064
2065 {
2066 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002067 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002068 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2069 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002070 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002071
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002072 // Call it again.
2073 timedCallback();
2074 }
2075
2076 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002077 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002078 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002079 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2080 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002081 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002082
2083 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002084 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2085
2086 // Call it again.
2087 timedCallback();
2088 }
2089
2090 {
2091 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002092 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002093 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2094 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002095 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002096
2097 // Now disable readlogs.
2098 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2099
2100 // Call it again.
2101 timedCallback();
2102 }
2103
2104 // No callbacks anymore -> fully loaded and no readlogs.
2105 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2106}
2107
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002108TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2109 const auto invalidStorageId = 100;
2110 android::os::PersistableBundle result{};
2111 mIncrementalService->getMetrics(invalidStorageId, &result);
2112 int64_t expected = -1, value = -1;
2113 ASSERT_FALSE(
2114 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2115 .c_str()),
2116 &value));
2117 ASSERT_EQ(expected, value);
2118 ASSERT_TRUE(result.empty());
2119}
2120
2121TEST_F(IncrementalServiceTest, testNoMetrics) {
2122 mVold->setIncFsMountOptionsSuccess();
2123 TemporaryDir tempDir;
2124 int storageId =
2125 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2126 IncrementalService::CreateOptions::CreateNew);
2127 ASSERT_GE(storageId, 0);
2128 android::os::PersistableBundle result{};
2129 mIncrementalService->getMetrics(storageId, &result);
2130 int64_t expected = -1, value = -1;
2131 ASSERT_FALSE(
2132 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2133 .c_str()),
2134 &value));
2135 ASSERT_EQ(expected, value);
2136 ASSERT_EQ(0, (int)result.size());
2137}
2138
2139TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2140 mVold->setIncFsMountOptionsSuccess();
2141 TemporaryDir tempDir;
2142 int storageId =
2143 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2144 IncrementalService::CreateOptions::CreateNew);
2145 ASSERT_GE(storageId, 0);
2146 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2147 {}, {}));
2148 android::os::PersistableBundle result{};
2149 mIncrementalService->getMetrics(storageId, &result);
2150 int64_t expected = -1, value = -1;
2151 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2152 ASSERT_EQ(expected, value);
2153 ASSERT_EQ(1, (int)result.size());
2154}
2155
Songchun Fan3c82a302019-11-29 14:23:45 -08002156} // namespace android::os::incremental