blob: de8822dbf1052532186991d92c5a0748f77b5006 [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/file.h>
18#include <android-base/logging.h>
19#include <android-base/unique_fd.h>
20#include <binder/ParcelFileDescriptor.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <utils/Log.h>
Songchun Fan1b76ccf2021-02-24 22:25:59 +000024#include <utils/String16.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080025
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -070026#include <chrono>
Songchun Fan3c82a302019-11-29 14:23:45 -080027#include <future>
28
29#include "IncrementalService.h"
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070030#include "IncrementalServiceValidation.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080031#include "Metadata.pb.h"
32#include "ServiceWrappers.h"
33
34using namespace testing;
35using namespace android::incremental;
36using namespace std::literals;
37using testing::_;
38using testing::Invoke;
39using testing::NiceMock;
40
41#undef LOG_TAG
42#define LOG_TAG "IncrementalServiceTest"
43
44using namespace android::incfs;
45using namespace android::content::pm;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -080046using PerUidReadTimeouts = android::os::incremental::PerUidReadTimeouts;
Songchun Fan3c82a302019-11-29 14:23:45 -080047
48namespace android::os::incremental {
49
50class MockVoldService : public VoldServiceWrapper {
51public:
52 MOCK_CONST_METHOD4(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080053 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080054 int32_t flags,
55 IncrementalFileSystemControlParcel* _aidl_return));
56 MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
57 MOCK_CONST_METHOD2(bindMount,
58 binder::Status(const std::string& sourceDir, const std::string& argetDir));
Songchun Fan374f7652020-08-20 08:40:29 -070059 MOCK_CONST_METHOD2(
60 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
62 bool));
Songchun Fan3c82a302019-11-29 14:23:45 -080063
64 void mountIncFsFails() {
65 ON_CALL(*this, mountIncFs(_, _, _, _))
66 .WillByDefault(
67 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68 }
69 void mountIncFsInvalidControlParcel() {
70 ON_CALL(*this, mountIncFs(_, _, _, _))
71 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72 }
73 void mountIncFsSuccess() {
74 ON_CALL(*this, mountIncFs(_, _, _, _))
75 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
76 }
77 void bindMountFails() {
78 ON_CALL(*this, bindMount(_, _))
79 .WillByDefault(Return(
80 binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
81 }
82 void bindMountSuccess() {
83 ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
84 }
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070085 void setIncFsMountOptionsFails() const {
86 ON_CALL(*this, setIncFsMountOptions(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -070087 .WillByDefault(Return(
88 binder::Status::fromExceptionCode(1, String8("failed to set options"))));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070089 }
90 void setIncFsMountOptionsSuccess() {
91 ON_CALL(*this, setIncFsMountOptions(_, _)).WillByDefault(Return(binder::Status::ok()));
92 }
Songchun Fan3c82a302019-11-29 14:23:45 -080093 binder::Status getInvalidControlParcel(const std::string& imagePath,
94 const std::string& targetDir, int32_t flags,
95 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080096 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080097 return binder::Status::ok();
98 }
99 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
100 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800101 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
102 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
103 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800104 return binder::Status::ok();
105 }
106
107private:
108 TemporaryFile cmdFile;
109 TemporaryFile logFile;
Songchun Fan3c82a302019-11-29 14:23:45 -0800110};
111
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700112class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800113public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700114 MockDataLoader() {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700115 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
116 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
117 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
118 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
119 ON_CALL(*this, prepareImage(_, _, _))
120 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700121 }
Songchun Fan68645c42020-02-27 15:57:35 -0800122 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700123 MOCK_METHOD4(create,
124 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
125 const FileSystemControlParcel& control,
126 const sp<IDataLoaderStatusListener>& listener));
127 MOCK_METHOD1(start, binder::Status(int32_t id));
128 MOCK_METHOD1(stop, binder::Status(int32_t id));
129 MOCK_METHOD1(destroy, binder::Status(int32_t id));
130 MOCK_METHOD3(prepareImage,
131 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
132 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700133
134 void initializeCreateOkNoStatus() {
135 ON_CALL(*this, create(_, _, _, _))
136 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
137 }
138
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700139 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
140 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700141 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700142 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700143 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700144 return binder::Status::ok();
145 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700146 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
147 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700148 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700149 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700150 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700151 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700152 return binder::Status::ok();
153 }
154 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700155 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700156 return binder::Status::ok();
157 }
158 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700159 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700160 return binder::Status::ok();
161 }
162 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700163 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700164 mListener = nullptr;
165 return binder::Status::ok();
166 }
167 binder::Status prepareImageOk(int32_t id,
168 const ::std::vector<content::pm::InstallationFileParcel>&,
169 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700170 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700171 return binder::Status::ok();
172 }
Songchun Fan2570ec02020-10-08 17:22:33 -0700173 binder::Status storageError(int32_t id) {
174 if (mListener) {
175 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
176 }
177 return binder::Status::ok();
178 }
179 binder::Status transportError(int32_t id) {
180 if (mListener) {
181 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
182 }
183 return binder::Status::ok();
184 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700185 int32_t setStorageParams(bool enableReadLogs) {
186 int32_t result = -1;
187 EXPECT_NE(mServiceConnector.get(), nullptr);
188 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
189 return result;
190 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700191 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700192
193private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700194 void setAndReportStatus(int id, int status) {
195 mStatus = status;
196 reportStatus(id);
197 }
198 void reportStatus(int id) {
199 if (mListener) {
200 mListener->onStatusChanged(id, mStatus);
201 }
202 }
203
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700204 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700205 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700206 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800207};
208
209class MockDataLoaderManager : public DataLoaderManagerWrapper {
210public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700211 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
212 EXPECT_TRUE(mDataLoaderHolder != nullptr);
213 }
214
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800215 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800216 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800217 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800218 const sp<IDataLoaderStatusListener>& listener,
219 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800220 MOCK_CONST_METHOD2(getDataLoader,
221 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700222 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800223
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700224 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800225 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700226 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700227 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800229 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700230 .WillByDefault(Return(
231 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
232 }
233 void getDataLoaderSuccess() {
234 ON_CALL(*this, getDataLoader(_, _))
235 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
236 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700237 void unbindFromDataLoaderSuccess() {
238 ON_CALL(*this, unbindFromDataLoader(_))
239 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700240 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700241 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800242 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700243 const sp<IDataLoaderStatusListener>& listener,
244 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800245 mId = mountId;
246 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700247 mDataLoader = mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800248 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700249 if (mListener) {
250 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
251 }
252 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800253 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800254 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
255 const DataLoaderParamsParcel& params,
256 int bindDelayMs,
257 const sp<IDataLoaderStatusListener>& listener,
258 bool* _aidl_return) {
259 CHECK(bindDelayMs == 0) << bindDelayMs;
260 *_aidl_return = false;
261 return binder::Status::ok();
262 }
263 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
264 const DataLoaderParamsParcel& params,
265 int bindDelayMs,
266 const sp<IDataLoaderStatusListener>& listener,
267 bool* _aidl_return) {
268 CHECK(bindDelayMs == 0) << bindDelayMs;
269 *_aidl_return = true;
270 if (listener) {
271 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
272 }
273 return binder::Status::ok();
274 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800275 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
276 const DataLoaderParamsParcel& params,
277 int bindDelayMs,
278 const sp<IDataLoaderStatusListener>& listener,
279 bool* _aidl_return) {
280 CHECK(1000 * 9 <= bindDelayMs && bindDelayMs <= 1000 * 11) << bindDelayMs;
281 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
282 }
283 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
284 const DataLoaderParamsParcel& params,
285 int bindDelayMs,
286 const sp<IDataLoaderStatusListener>& listener,
287 bool* _aidl_return) {
288 CHECK(1000 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11) << bindDelayMs;
289 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
290 }
291 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
292 const DataLoaderParamsParcel& params,
293 int bindDelayMs,
294 const sp<IDataLoaderStatusListener>& listener,
295 bool* _aidl_return) {
296 CHECK(1000 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11 * 11) << bindDelayMs;
297 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
298 }
299 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
300 const DataLoaderParamsParcel& params,
301 int bindDelayMs,
302 const sp<IDataLoaderStatusListener>& listener,
303 bool* _aidl_return) {
304 CHECK(1000 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11 * 11 * 11)
305 << bindDelayMs;
306 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
307 }
308
Songchun Fan68645c42020-02-27 15:57:35 -0800309 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
310 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800311 return binder::Status::ok();
312 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700313 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800314 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800315 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700316 void setDataLoaderStatusStarted() {
317 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
318 }
319 void setDataLoaderStatusDestroyed() {
320 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
321 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700322 void setDataLoaderStatusUnavailable() {
323 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
324 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800325 void setDataLoaderStatusUnrecoverable() {
326 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
327 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700328 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700329 if (mDataLoader) {
330 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
331 return status;
332 }
333 mDataLoader = nullptr;
334 }
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700335 if (mListener) {
336 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
337 }
338 return binder::Status::ok();
339 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700340
Songchun Fan3c82a302019-11-29 14:23:45 -0800341private:
342 int mId;
343 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700344 sp<IDataLoader> mDataLoader;
345 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800346};
347
348class MockIncFs : public IncFsWrapper {
349public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800350 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700351 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
352 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800353 MOCK_CONST_METHOD4(createControl,
354 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
355 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800356 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800357 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800358 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800359 MOCK_CONST_METHOD4(makeMappedFile,
360 ErrorCode(const Control& control, std::string_view path, int mode,
361 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800362 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700363 MOCK_CONST_METHOD3(makeDirs,
364 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800365 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
366 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
367 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700368 MOCK_CONST_METHOD2(countFilledBlocks,
369 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
370 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700371 MOCK_CONST_METHOD2(isFileFullyLoaded,
372 incfs::LoadingState(const Control& control, std::string_view path));
373 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800374 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700375 ErrorCode(const Control& control, std::string_view from,
376 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800377 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700378 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700379 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700380 MOCK_CONST_METHOD3(reserveSpace,
381 ErrorCode(const Control& control, std::string_view path, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700382 MOCK_CONST_METHOD3(waitForPendingReads,
383 WaitResult(const Control& control, std::chrono::milliseconds timeout,
384 std::vector<incfs::ReadInfo>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800385 MOCK_CONST_METHOD2(setUidReadTimeouts,
386 ErrorCode(const Control& control,
387 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700388
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700389 MockIncFs() {
390 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
391 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
392 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800393
394 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
395 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700396
397 void countFilledBlocksSuccess() {
398 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
399 }
400
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700401 void countFilledBlocksFullyLoaded() {
402 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
403 }
404
Songchun Fan374f7652020-08-20 08:40:29 -0700405 void countFilledBlocksFails() {
406 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
407 }
408
409 void countFilledBlocksEmpty() {
410 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
411 }
412
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700413 void openMountSuccess() {
414 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
415 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700416
417 // 1000ms
418 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700419 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700420 .WillByDefault(
421 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
422 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
423 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
424 return android::incfs::WaitResult::HaveData;
425 }));
426 }
427
428 void waitForPendingReadsTimeout() {
429 ON_CALL(*this, waitForPendingReads(_, _, _))
430 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700431 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700432
433 static constexpr auto kPendingReadsFd = 42;
434 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800435 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700436 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700437
Songchun Fan20d6ef22020-03-03 09:47:15 -0800438 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800439 metadata::Mount m;
440 m.mutable_storage()->set_id(100);
441 m.mutable_loader()->set_package_name("com.test");
442 m.mutable_loader()->set_arguments("com.uri");
443 const auto metadata = m.SerializeAsString();
444 m.mutable_loader()->release_arguments();
445 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800446 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800447 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800448 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800449 metadata::Storage st;
450 st.set_id(100);
451 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800452 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800453 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800454 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800455 metadata::BindPoint bp;
456 std::string destPath = "dest";
457 std::string srcPath = "src";
458 bp.set_storage_id(100);
459 bp.set_allocated_dest_path(&destPath);
460 bp.set_allocated_source_subdir(&srcPath);
461 const auto metadata = bp.SerializeAsString();
462 bp.release_source_subdir();
463 bp.release_dest_path();
464 return std::vector<char>(metadata.begin(), metadata.end());
465 }
466};
467
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700468class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700469public:
470 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700471 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700472 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
473
474 void checkPermissionSuccess() {
475 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
476 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800477 void checkPermissionNoCrossUsers() {
478 ON_CALL(*this,
479 checkPermission("android.permission.LOADER_USAGE_STATS",
480 "android:loader_usage_stats", _))
481 .WillByDefault(Return(android::incremental::Ok()));
482 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
483 .WillByDefault(
484 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
485 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700486 void checkPermissionFails() {
487 ON_CALL(*this, checkPermission(_, _, _))
488 .WillByDefault(
489 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
490 }
491 void initializeStartWatchingMode() {
492 ON_CALL(*this, startWatchingMode(_, _, _))
493 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
494 }
495 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
496 mStoredCallback = cb;
497 }
498
499 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700500};
501
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700502class MockJniWrapper : public JniWrapper {
503public:
504 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
505
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700506 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700507};
508
509class MockLooperWrapper : public LooperWrapper {
510public:
511 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
512 MOCK_METHOD1(removeFd, int(int));
513 MOCK_METHOD0(wake, void());
514 MOCK_METHOD1(pollAll, int(int));
515
516 MockLooperWrapper() {
517 ON_CALL(*this, addFd(_, _, _, _, _))
518 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
519 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700520 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700521 }
522
523 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
524 mCallback = callback;
525 mCallbackData = data;
526 return 0;
527 }
528
529 int clearCallback(int) {
530 mCallback = nullptr;
531 mCallbackData = nullptr;
532 return 0;
533 }
534
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700535 int wait10Ms(int) {
536 // This is called from a loop in runCmdLooper.
537 // Sleeping for 10ms only to avoid busy looping.
538 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700539 return 0;
540 }
541
542 android::Looper_callbackFunc mCallback = nullptr;
543 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700544};
545
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700546class MockTimedQueueWrapper : public TimedQueueWrapper {
547public:
548 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
549 MOCK_METHOD1(removeJobs, void(MountId));
550 MOCK_METHOD0(stop, void());
551
552 MockTimedQueueWrapper() {
553 ON_CALL(*this, addJob(_, _, _))
554 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
555 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
556 }
557
558 void storeJob(MountId id, Milliseconds after, Job what) {
559 mId = id;
560 mAfter = after;
561 mWhat = std::move(what);
562 }
563
564 void clearJob(MountId id) {
565 if (mId == id) {
566 mAfter = {};
567 mWhat = {};
568 }
569 }
570
571 MountId mId = -1;
572 Milliseconds mAfter;
573 Job mWhat;
574};
575
Songchun Fan374f7652020-08-20 08:40:29 -0700576class MockFsWrapper : public FsWrapper {
577public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800578 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
579 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700580 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800581 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700582 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
583 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800584 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
585 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
586 if (!onFile(file)) break;
587 }
Songchun Fan374f7652020-08-20 08:40:29 -0700588 }
589};
590
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800591class MockClockWrapper : public ClockWrapper {
592public:
593 MOCK_CONST_METHOD0(now, TimePoint());
594
595 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
596 template <class Delta>
597 void advance(Delta delta) {
598 mClock += delta;
599 }
600
601 TimePoint getClock() const { return mClock; }
602
603 TimePoint mClock = Clock::now();
604};
605
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700606class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
607public:
608 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
609
610 MockStorageHealthListener() {
611 ON_CALL(*this, onHealthStatus(_, _))
612 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
613 }
614
615 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
616 mStorageId = storageId;
617 mStatus = status;
618 return binder::Status::ok();
619 }
620
621 int32_t mStorageId = -1;
622 int32_t mStatus = -1;
623};
624
Songchun Fana7098592020-09-03 11:45:53 -0700625class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
626public:
627 MockStorageLoadingProgressListener() = default;
628 MOCK_METHOD2(onStorageLoadingProgressChanged,
629 binder::Status(int32_t storageId, float progress));
630 MOCK_METHOD0(onAsBinder, IBinder*());
631};
632
Songchun Fan3c82a302019-11-29 14:23:45 -0800633class MockServiceManager : public ServiceManagerWrapper {
634public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800635 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700636 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700637 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700638 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700639 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700640 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700641 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700642 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800643 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800644 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700645 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700646 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700647 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700648 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700649 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700650 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700651 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800652 mFs(std::move(fs)),
653 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800654 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800655 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
656 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800657 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800658 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700659 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
660 return std::move(mAppOpsManager);
661 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700662 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700663 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700664 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700665 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
666 return std::move(mProgressUpdateJobQueue);
667 }
Songchun Fan374f7652020-08-20 08:40:29 -0700668 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800669 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800670
671private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800672 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800673 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800674 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700675 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700676 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700677 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700678 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700679 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700680 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800681 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800682};
683
684// --- IncrementalServiceTest ---
685
Songchun Fan3c82a302019-11-29 14:23:45 -0800686class IncrementalServiceTest : public testing::Test {
687public:
688 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800689 auto vold = std::make_unique<NiceMock<MockVoldService>>();
690 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700691 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
692 mDataLoader = dataLoader.get();
693 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800694 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800695 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
696 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700697 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
698 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700699 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
700 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700701 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
702 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700703 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
704 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700705 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
706 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700707 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
708 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800709 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
710 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700711 mIncrementalService = std::make_unique<
712 IncrementalService>(MockServiceManager(std::move(vold),
713 std::move(dataloaderManager),
714 std::move(incFs), std::move(appOps),
715 std::move(jni), std::move(looper),
716 std::move(timedQueue),
717 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800718 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700719 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800720 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800721 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700722 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800723 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800724 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700725 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800726 }
727
728 void setUpExistingMountDir(const std::string& rootDir) {
729 const auto dir = rootDir + "/dir1";
730 const auto mountDir = dir + "/mount";
731 const auto backingDir = dir + "/backing_store";
732 const auto storageDir = mountDir + "/st0";
733 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
734 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
735 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
736 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
737 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
738 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
739 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
740 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800741 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
742 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
743 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
744 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
745 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
746 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800747 }
748
Songchun Fan374f7652020-08-20 08:40:29 -0700749 void setupSuccess() {
750 mVold->mountIncFsSuccess();
751 mIncFs->makeFileSuccess();
752 mVold->bindMountSuccess();
753 mDataLoaderManager->bindToDataLoaderSuccess();
754 mDataLoaderManager->getDataLoaderSuccess();
755 }
756
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000757 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
758 android::os::PersistableBundle result{};
759 mIncrementalService->getMetrics(storageId, &result);
760 int64_t value = -1;
761 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
762 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
763 .c_str()),
764 &value));
765 ASSERT_EQ(expected, value);
766 ASSERT_EQ(1, (int)result.size());
767 }
768
Songchun Fan3c82a302019-11-29 14:23:45 -0800769protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700770 NiceMock<MockVoldService>* mVold = nullptr;
771 NiceMock<MockIncFs>* mIncFs = nullptr;
772 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
773 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
774 NiceMock<MockJniWrapper>* mJni = nullptr;
775 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700776 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700777 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700778 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800779 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700780 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800781 std::unique_ptr<IncrementalService> mIncrementalService;
782 TemporaryDir mRootDir;
783 DataLoaderParamsParcel mDataLoaderParcel;
784};
785
Songchun Fan3c82a302019-11-29 14:23:45 -0800786TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
787 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800788 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800789 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800790 int storageId =
791 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
792 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800793 ASSERT_LT(storageId, 0);
794}
795
796TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
797 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800798 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700799 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800800 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800801 int storageId =
802 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
803 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800804 ASSERT_LT(storageId, 0);
805}
806
807TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
808 mVold->mountIncFsSuccess();
809 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800810 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700811 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800812 EXPECT_CALL(*mVold, unmountIncFs(_));
813 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800814 int storageId =
815 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
816 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800817 ASSERT_LT(storageId, 0);
818}
819
820TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
821 mVold->mountIncFsSuccess();
822 mIncFs->makeFileSuccess();
823 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800824 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700825 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800826 EXPECT_CALL(*mVold, unmountIncFs(_));
827 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800828 int storageId =
829 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
830 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800831 ASSERT_LT(storageId, 0);
832}
833
834TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
835 mVold->mountIncFsSuccess();
836 mIncFs->makeFileSuccess();
837 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700838 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800839 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700840 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700841 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
842 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
843 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800844 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
845 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800846 int storageId =
847 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
848 IncrementalService::CreateOptions::CreateNew);
849 ASSERT_GE(storageId, 0);
850 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800851}
852
853TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700854 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800855 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700856 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800857 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
858 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800859 int storageId =
860 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
861 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800862 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800863 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800864 mIncrementalService->deleteStorage(storageId);
865}
866
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800867TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
868 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(6);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700869 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800870 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(6);
871 EXPECT_CALL(*mDataLoader, start(_)).Times(6);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700872 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800873 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
874 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800875 int storageId =
876 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
877 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800878 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800879 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800880
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700881 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800882
883 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
884 .WillByDefault(Invoke(mDataLoaderManager,
885 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
886 mDataLoaderManager->setDataLoaderStatusDestroyed();
887
888 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
889 .WillByDefault(Invoke(mDataLoaderManager,
890 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
891 mDataLoaderManager->setDataLoaderStatusDestroyed();
892
893 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
894 .WillByDefault(Invoke(mDataLoaderManager,
895 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
896 mDataLoaderManager->setDataLoaderStatusDestroyed();
897
898 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
899 .WillByDefault(Invoke(mDataLoaderManager,
900 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
901 mDataLoaderManager->setDataLoaderStatusDestroyed();
902
903 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
904 .WillByDefault(Invoke(mDataLoaderManager,
905 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700906 mDataLoaderManager->setDataLoaderStatusDestroyed();
907}
908
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800909TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
910 mIncFs->waitForPendingReadsSuccess();
911 mIncFs->openMountSuccess();
912
913 constexpr auto bindRetryInterval = 5s;
914
915 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(10);
916 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
917 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(6);
918 EXPECT_CALL(*mDataLoader, start(_)).Times(6);
919 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
920 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700921 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800922 TemporaryDir tempDir;
923 int storageId =
924 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
925 IncrementalService::CreateOptions::CreateNew);
926 ASSERT_GE(storageId, 0);
927
928 // First binds to DataLoader fails... because it's restart.
929 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
930 .WillByDefault(Invoke(mDataLoaderManager,
931 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
932
933 // Request DL start.
934 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
935
936 // Retry callback present.
937 ASSERT_EQ(storageId, mTimedQueue->mId);
938 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
939 auto retryCallback = mTimedQueue->mWhat;
940 mTimedQueue->clearJob(storageId);
941
942 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
943 mClock->advance(5s);
944
945 retryCallback();
946 // Retry callback present.
947 ASSERT_EQ(storageId, mTimedQueue->mId);
948 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
949 retryCallback = mTimedQueue->mWhat;
950 mTimedQueue->clearJob(storageId);
951
952 // Returning "binding" so that we can retry.
953 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
954 .WillByDefault(Invoke(mDataLoaderManager,
955 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
956
957 // Expecting bindToDataLoaderBindingWithNoDelay call.
958 mClock->advance(5s);
959
960 retryCallback();
961 // No retry callback.
962 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
963 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
964
965 // Should not change the bindToDataLoader call count
966 ASSERT_NE(nullptr, mLooper->mCallback);
967 ASSERT_NE(nullptr, mLooper->mCallbackData);
968 auto looperCb = mLooper->mCallback;
969 auto looperCbData = mLooper->mCallbackData;
970 looperCb(-1, -1, looperCbData);
971
972 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
973 mClock->advance(5s);
974
975 // Use pending reads callback to trigger binding.
976 looperCb(-1, -1, looperCbData);
977
978 // No retry callback.
979 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
980 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
981
982 // Now we are out of 10m "retry" budget, let's finally bind.
983 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
984 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
985 mClock->advance(11min);
986
987 // Use pending reads callback to trigger binding.
988 looperCb(-1, -1, looperCbData);
989
990 // No retry callback.
991 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
992 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
993
994 // And test the rest of the backoff.
995 // Simulated crash/other connection breakage.
996 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
997 .WillByDefault(Invoke(mDataLoaderManager,
998 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
999 mDataLoaderManager->setDataLoaderStatusDestroyed();
1000
1001 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1002 .WillByDefault(Invoke(mDataLoaderManager,
1003 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
1004 mDataLoaderManager->setDataLoaderStatusDestroyed();
1005
1006 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1007 .WillByDefault(Invoke(mDataLoaderManager,
1008 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
1009 mDataLoaderManager->setDataLoaderStatusDestroyed();
1010
1011 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1012 .WillByDefault(Invoke(mDataLoaderManager,
1013 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1014 mDataLoaderManager->setDataLoaderStatusDestroyed();
1015
1016 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1017 .WillByDefault(Invoke(mDataLoaderManager,
1018 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1019 mDataLoaderManager->setDataLoaderStatusDestroyed();
1020}
1021
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001022TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001023 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001024 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001025 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001026 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1027 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1028 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1029 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1030 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001031 int storageId =
1032 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1033 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001034 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001035 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1036 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001037 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001038 mDataLoaderManager->setDataLoaderStatusStarted();
1039}
1040
1041TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001042 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001043 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001044 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001045 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001046 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1047 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1048 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1049 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001050 int storageId =
1051 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1052 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001053 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001054 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1055 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001056 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001057}
1058
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001059TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001060 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001061 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001062 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1063 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1064 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1065 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1066 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1067 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001068 int storageId =
1069 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1070 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001071 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001072 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1073 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001074 mDataLoaderManager->setDataLoaderStatusUnavailable();
1075}
1076
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001077TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1078 mDataLoader->initializeCreateOkNoStatus();
1079 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1080 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1081 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1082 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1083 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1084 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1085 TemporaryDir tempDir;
1086 int storageId =
1087 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1088 IncrementalService::CreateOptions::CreateNew);
1089 ASSERT_GE(storageId, 0);
1090 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1091 {}, {}));
1092 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1093}
1094
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001095TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001096 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001097 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001098 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001099
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001100 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001101 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001102 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1103 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001104 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001105 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1106 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1107 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1108 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001109 int storageId =
1110 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1111 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001112 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001113 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1114 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001115 mDataLoaderManager->setDataLoaderStatusUnavailable();
1116 ASSERT_NE(nullptr, mLooper->mCallback);
1117 ASSERT_NE(nullptr, mLooper->mCallbackData);
1118 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1119}
1120
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001121TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001122 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001123
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001124 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001125 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1126 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1127 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1128 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1129 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1130 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1131 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001132 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001133
1134 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1135 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1136 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1137 .Times(2);
1138 EXPECT_CALL(*listenerMock,
1139 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1140 .Times(1);
1141 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1142 .Times(1);
1143 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1144 .Times(2);
1145
1146 StorageHealthCheckParams params;
1147 params.blockedTimeoutMs = 10000;
1148 params.unhealthyTimeoutMs = 20000;
1149 params.unhealthyMonitoringMs = 30000;
1150
1151 using MS = std::chrono::milliseconds;
1152 using MCS = std::chrono::microseconds;
1153
1154 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1155 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1156 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1157
1158 const uint64_t kFirstTimestampUs = 1000000000ll;
1159 const uint64_t kBlockedTimestampUs =
1160 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1161 const uint64_t kUnhealthyTimestampUs =
1162 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1163
1164 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001165 int storageId =
1166 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1167 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001168 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001169 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1170 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001171
1172 // Healthy state, registered for pending reads.
1173 ASSERT_NE(nullptr, mLooper->mCallback);
1174 ASSERT_NE(nullptr, mLooper->mCallbackData);
1175 ASSERT_EQ(storageId, listener->mStorageId);
1176 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001177 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001178
1179 // Looper/epoll callback.
1180 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1181 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1182
1183 // Unregister from pending reads and wait.
1184 ASSERT_EQ(nullptr, mLooper->mCallback);
1185 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1186 ASSERT_EQ(storageId, listener->mStorageId);
1187 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1188 // Timed callback present.
1189 ASSERT_EQ(storageId, mTimedQueue->mId);
1190 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1191 auto timedCallback = mTimedQueue->mWhat;
1192 mTimedQueue->clearJob(storageId);
1193
1194 // Timed job callback for blocked.
1195 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1196 timedCallback();
1197
1198 // Still not registered, and blocked.
1199 ASSERT_EQ(nullptr, mLooper->mCallback);
1200 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1201 ASSERT_EQ(storageId, listener->mStorageId);
1202 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001203 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1204
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001205 // Timed callback present.
1206 ASSERT_EQ(storageId, mTimedQueue->mId);
1207 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1208 timedCallback = mTimedQueue->mWhat;
1209 mTimedQueue->clearJob(storageId);
1210
1211 // Timed job callback for unhealthy.
1212 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1213 timedCallback();
1214
1215 // Still not registered, and blocked.
1216 ASSERT_EQ(nullptr, mLooper->mCallback);
1217 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1218 ASSERT_EQ(storageId, listener->mStorageId);
1219 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001220 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1221
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001222 // Timed callback present.
1223 ASSERT_EQ(storageId, mTimedQueue->mId);
1224 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1225 timedCallback = mTimedQueue->mWhat;
1226 mTimedQueue->clearJob(storageId);
1227
1228 // One more unhealthy.
1229 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1230 timedCallback();
1231
1232 // Still not registered, and blocked.
1233 ASSERT_EQ(nullptr, mLooper->mCallback);
1234 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1235 ASSERT_EQ(storageId, listener->mStorageId);
1236 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001237 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1238
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001239 // Timed callback present.
1240 ASSERT_EQ(storageId, mTimedQueue->mId);
1241 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1242 timedCallback = mTimedQueue->mWhat;
1243 mTimedQueue->clearJob(storageId);
1244
1245 // And now healthy.
1246 mIncFs->waitForPendingReadsTimeout();
1247 timedCallback();
1248
1249 // Healthy state, registered for pending reads.
1250 ASSERT_NE(nullptr, mLooper->mCallback);
1251 ASSERT_NE(nullptr, mLooper->mCallbackData);
1252 ASSERT_EQ(storageId, listener->mStorageId);
1253 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001254 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001255}
1256
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001257TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001258 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001259 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001260
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001261 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001262 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001263 // We are calling setIncFsMountOptions(true).
1264 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1265 // After setIncFsMountOptions succeeded expecting to start watching.
1266 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1267 // Not expecting callback removal.
1268 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001269 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001270 int storageId =
1271 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1272 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001273 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001274 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1275 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001276 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001277}
1278
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001279TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001280 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001281 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001282
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001283 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1284 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1285 // Enabling and then disabling readlogs.
1286 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1287 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1288 // After setIncFsMountOptions succeeded expecting to start watching.
1289 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1290 // Not expecting callback removal.
1291 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1292 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001293 int storageId =
1294 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1295 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001296 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001297 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1298 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001299 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1300 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001301 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001302 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1303}
1304
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001305TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1306 mVold->setIncFsMountOptionsSuccess();
1307 mAppOpsManager->checkPermissionSuccess();
1308
1309 const auto readLogsMaxInterval = 2h;
1310
1311 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1312 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1313 // Enabling and then disabling readlogs.
1314 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
1315 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1316 // After setIncFsMountOptions succeeded expecting to start watching.
1317 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1318 // Not expecting callback removal.
1319 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001320 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001321 TemporaryDir tempDir;
1322 int storageId =
1323 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1324 IncrementalService::CreateOptions::CreateNew);
1325 ASSERT_GE(storageId, 0);
1326 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1327 {}, {}));
1328
1329 // Disable readlogs callback present.
1330 ASSERT_EQ(storageId, mTimedQueue->mId);
1331 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1332 auto callback = mTimedQueue->mWhat;
1333 mTimedQueue->clearJob(storageId);
1334
1335 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1336 // Now advance clock for 1hr.
1337 mClock->advance(1h);
1338 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1339 // Now call the timed callback, it should turn off the readlogs.
1340 callback();
1341 // Now advance clock for 2hrs.
1342 mClock->advance(readLogsMaxInterval);
1343 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1344}
1345
1346TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1347 mVold->setIncFsMountOptionsSuccess();
1348 mAppOpsManager->checkPermissionSuccess();
1349
1350 const auto readLogsMaxInterval = 2h;
1351
1352 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1353 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1354 // Enabling and then disabling readlogs.
1355 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1356 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
1357 // After setIncFsMountOptions succeeded expecting to start watching.
1358 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1359 // Not expecting callback removal.
1360 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001361 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001362 // System data loader.
1363 mDataLoaderParcel.packageName = "android";
1364 TemporaryDir tempDir;
1365 int storageId =
1366 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1367 IncrementalService::CreateOptions::CreateNew);
1368 ASSERT_GE(storageId, 0);
1369 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1370 {}, {}));
1371
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001372 // IfsState callback.
1373 auto callback = mTimedQueue->mWhat;
1374 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001375
1376 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1377 // Now advance clock for 1hr.
1378 mClock->advance(1h);
1379 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1380 // Now advance clock for 2hrs.
1381 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001382 // IfsStorage callback should not affect anything.
1383 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001384 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1385}
1386
1387TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1388 mVold->setIncFsMountOptionsSuccess();
1389 mAppOpsManager->checkPermissionSuccess();
1390
1391 const auto readLogsMaxInterval = 2h;
1392
1393 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1394 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1395 // Enabling and then disabling readlogs.
1396 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1397 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1398 // After setIncFsMountOptions succeeded expecting to start watching.
1399 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1400 // Not expecting callback removal.
1401 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001402 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001403 TemporaryDir tempDir;
1404 int storageId =
1405 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1406 IncrementalService::CreateOptions::CreateNew);
1407 ASSERT_GE(storageId, 0);
1408
1409 auto dataLoaderParcel = mDataLoaderParcel;
1410 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1411 {}, {}));
1412
1413 // Disable readlogs callback present.
1414 ASSERT_EQ(storageId, mTimedQueue->mId);
1415 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1416 auto callback = mTimedQueue->mWhat;
1417 mTimedQueue->clearJob(storageId);
1418
1419 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1420 // Now advance clock for 1.5hrs.
1421 mClock->advance(90min);
1422 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1423
1424 // New installation.
1425 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1426 {}, {}));
1427
1428 // New callback present.
1429 ASSERT_EQ(storageId, mTimedQueue->mId);
1430 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1431 auto callback2 = mTimedQueue->mWhat;
1432 mTimedQueue->clearJob(storageId);
1433
1434 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1435 callback();
1436 // Advance clock for another 1.5hrs.
1437 mClock->advance(90min);
1438 // Still success even it's 3hrs past first install.
1439 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1440
1441 // New one should disable.
1442 callback2();
1443 // And timeout.
1444 mClock->advance(90min);
1445 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1446}
1447
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001448TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001449 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001450 mAppOpsManager->checkPermissionSuccess();
1451 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001452
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001453 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001454 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1455 // We are calling setIncFsMountOptions(true).
1456 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1457 // setIncFsMountOptions(false) is called on the callback.
1458 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1459 // After setIncFsMountOptions succeeded expecting to start watching.
1460 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1461 // After callback is called, disable read logs and remove callback.
1462 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1463 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001464 int storageId =
1465 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1466 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001467 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001468 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1469 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001470 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001471 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1472 mAppOpsManager->mStoredCallback->opChanged(0, {});
1473}
1474
1475TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001476 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001477
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001478 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001479 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1480 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1481 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1482 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1483 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1484 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001485 int storageId =
1486 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1487 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001488 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001489 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1490 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001491 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001492}
1493
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001494TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1495 mAppOpsManager->checkPermissionNoCrossUsers();
1496
1497 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1498 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1499 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1500 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1501 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1502 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1503 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001504 int storageId =
1505 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1506 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001507 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001508 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1509 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001510 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1511}
1512
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001513TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001514 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001515 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001516
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001517 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001518 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001519 // We are calling setIncFsMountOptions.
1520 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1521 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1522 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1523 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001524 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001525 int storageId =
1526 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1527 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001528 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001529 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1530 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001531 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001532}
1533
Songchun Fan3c82a302019-11-29 14:23:45 -08001534TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001535 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001536 int storageId =
1537 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1538 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001539 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001540
Songchun Fan103ba1d2020-02-03 17:32:32 -08001541 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001542 // <root>/*/mount/<storage>/test
1543 EXPECT_CALL(*mIncFs,
1544 makeDir(_, Truly([&](std::string_view arg) {
1545 return arg.starts_with(mRootDir.path) &&
1546 arg.ends_with("/mount/st_1_0/" + dir_path);
1547 }),
1548 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001549 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1550 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001551}
1552
1553TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001554 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001555 int storageId =
1556 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1557 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001558 auto first = "first"sv;
1559 auto second = "second"sv;
1560 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001561 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001562
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001563 EXPECT_CALL(*mIncFs,
1564 makeDirs(_, Truly([&](std::string_view arg) {
1565 return arg.starts_with(mRootDir.path) &&
1566 arg.ends_with("/mount/st_1_0/" + dir_path);
1567 }),
1568 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001569 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001570 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001571}
Songchun Fan374f7652020-08-20 08:40:29 -07001572
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001573TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001574 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001575 int storageId =
1576 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1577 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001578 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1579 .Times(1)
1580 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1581 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001582}
1583
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001584TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001585 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001586 int storageId =
1587 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1588 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001589 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1590 .Times(1)
1591 .WillOnce(Return(incfs::LoadingState(-1)));
1592 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001593}
1594
1595TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001596 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001597 int storageId =
1598 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1599 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001600 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1601 .Times(1)
1602 .WillOnce(Return(incfs::LoadingState::Full));
1603 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001604}
1605
Songchun Fan425862f2020-08-25 13:12:16 -07001606TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001607 mIncFs->countFilledBlocksSuccess();
1608 mFs->hasNoFile();
1609
1610 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001611 int storageId =
1612 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1613 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001614 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001615}
1616
1617TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1618 mIncFs->countFilledBlocksFails();
1619 mFs->hasFiles();
1620
1621 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001622 int storageId =
1623 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1624 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001625 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001626 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001627}
1628
Songchun Fan425862f2020-08-25 13:12:16 -07001629TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001630 mIncFs->countFilledBlocksEmpty();
1631 mFs->hasFiles();
1632
1633 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001634 int storageId =
1635 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1636 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001637 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001638 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001639}
1640
1641TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1642 mIncFs->countFilledBlocksSuccess();
1643 mFs->hasFiles();
1644
1645 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001646 int storageId =
1647 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1648 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001649 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001650 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001651}
Songchun Fana7098592020-09-03 11:45:53 -07001652
1653TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1654 mIncFs->countFilledBlocksSuccess();
1655 mFs->hasFiles();
1656
1657 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001658 int storageId =
1659 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1660 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001661 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1662 new NiceMock<MockStorageLoadingProgressListener>};
1663 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1664 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1665 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1666 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1667 // Timed callback present.
1668 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1669 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1670 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1671 timedCallback();
1672 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1673 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1674 mIncrementalService->unregisterLoadingProgressListener(storageId);
1675 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1676}
1677
1678TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1679 mIncFs->countFilledBlocksFails();
1680 mFs->hasFiles();
1681
1682 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001683 int storageId =
1684 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1685 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001686 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1687 new NiceMock<MockStorageLoadingProgressListener>};
1688 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1689 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1690 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1691}
Songchun Fan2570ec02020-10-08 17:22:33 -07001692
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001693TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1694 mFs->hasFiles();
1695
1696 const auto stateUpdateInterval = 1s;
1697
1698 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1699 // No unbinding just yet.
1700 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1701 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1702 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1703 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1704 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1705 // System data loader to get rid of readlog timeout callback.
1706 mDataLoaderParcel.packageName = "android";
1707 TemporaryDir tempDir;
1708 int storageId =
1709 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1710 IncrementalService::CreateOptions::CreateNew);
1711 ASSERT_GE(storageId, 0);
1712 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1713 {}, {}));
1714
1715 // Started.
1716 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1717
1718 // IfsState callback present.
1719 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1720 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1721 auto callback = mTimedQueue->mWhat;
1722 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1723
1724 // Not loaded yet.
1725 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1726 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1727
1728 // Send the callback, should not do anything.
1729 callback();
1730
1731 // Still started.
1732 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1733
1734 // Still present.
1735 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1736 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1737 callback = mTimedQueue->mWhat;
1738 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1739
1740 // Fully loaded.
1741 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1742 // Expect the unbind.
1743 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1744
1745 callback();
1746
1747 // Destroyed.
1748 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1749}
1750
1751TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1752 mFs->hasFiles();
1753
1754 // Readlogs.
1755 mVold->setIncFsMountOptionsSuccess();
1756 mAppOpsManager->checkPermissionSuccess();
1757
1758 const auto stateUpdateInterval = 1s;
1759
1760 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1761 // No unbinding just yet.
1762 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1763 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1764 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1765 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1766 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1767 // System data loader to get rid of readlog timeout callback.
1768 mDataLoaderParcel.packageName = "android";
1769 TemporaryDir tempDir;
1770 int storageId =
1771 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1772 IncrementalService::CreateOptions::CreateNew);
1773 ASSERT_GE(storageId, 0);
1774 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1775 {}, {}));
1776
1777 // Started.
1778 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1779
1780 // IfsState callback present.
1781 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1782 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1783 auto callback = mTimedQueue->mWhat;
1784 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1785
1786 // Not loaded yet.
1787 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1788 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1789
1790 // Send the callback, should not do anything.
1791 callback();
1792
1793 // Still started.
1794 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1795
1796 // Still present.
1797 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1798 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1799 callback = mTimedQueue->mWhat;
1800 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1801
1802 // Fully loaded.
1803 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1804 .WillOnce(Return(incfs::LoadingState::Full))
1805 .WillOnce(Return(incfs::LoadingState::Full));
1806 // But with readlogs.
1807 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1808
1809 // Send the callback, still nothing.
1810 callback();
1811
1812 // Still started.
1813 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1814
1815 // Still present.
1816 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1817 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1818 callback = mTimedQueue->mWhat;
1819 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1820
1821 // Disable readlogs and expect the unbind.
1822 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1823 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1824
1825 callback();
1826
1827 // Destroyed.
1828 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1829}
1830
Songchun Fan2570ec02020-10-08 17:22:33 -07001831TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1832 mIncFs->openMountSuccess();
1833 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1834 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1835 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1836
1837 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001838 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001839 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1840 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001841 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001842 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1843 {});
1844
Songchun Fan2570ec02020-10-08 17:22:33 -07001845 StorageHealthCheckParams newParams;
1846 newParams.blockedTimeoutMs = 10000;
1847 newParams.unhealthyTimeoutMs = 20000;
1848 newParams.unhealthyMonitoringMs = 30000;
1849 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1850 newListener));
1851
1852 using MS = std::chrono::milliseconds;
1853 using MCS = std::chrono::microseconds;
1854
1855 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1856 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1857
1858 const uint64_t kFirstTimestampUs = 1000000000ll;
1859 const uint64_t kBlockedTimestampUs =
1860 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1861 const uint64_t kUnhealthyTimestampUs =
1862 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1863
1864 // test that old listener was not called
1865 EXPECT_CALL(*listener.get(),
1866 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1867 .Times(0);
1868 EXPECT_CALL(*newListenerMock,
1869 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1870 .Times(1);
1871 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1872 .Times(1);
1873 EXPECT_CALL(*newListenerMock,
1874 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1875 .Times(1);
1876 EXPECT_CALL(*newListenerMock,
1877 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1878 .Times(1);
1879 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1880 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1881
1882 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1883 ASSERT_EQ(storageId, newListener->mStorageId);
1884
1885 auto timedCallback = mTimedQueue->mWhat;
1886 mTimedQueue->clearJob(storageId);
1887
1888 // test when health status is blocked with transport error
1889 mDataLoader->transportError(storageId);
1890 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1891 timedCallback();
1892 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1893 timedCallback = mTimedQueue->mWhat;
1894 mTimedQueue->clearJob(storageId);
1895
1896 // test when health status is blocked with storage error
1897 mDataLoader->storageError(storageId);
1898 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1899 timedCallback();
1900 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1901 timedCallback = mTimedQueue->mWhat;
1902 mTimedQueue->clearJob(storageId);
1903
1904 // test when health status is unhealthy with transport error
1905 mDataLoader->transportError(storageId);
1906 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1907 timedCallback();
1908 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1909 mTimedQueue->clearJob(storageId);
1910}
1911
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001912static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1913 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1914 std::vector<PerUidReadTimeouts> result;
1915 for (auto&& tuple : tuples) {
1916 result.emplace_back();
1917 auto& timeouts = result.back();
1918 timeouts.uid = std::get<0>(tuple);
1919 timeouts.minTimeUs = std::get<1>(tuple);
1920 timeouts.minPendingTimeUs = std::get<2>(tuple);
1921 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1922 }
1923 return result;
1924}
1925
1926static ErrorCode checkPerUidTimeouts(const Control& control,
1927 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1928 std::vector<PerUidReadTimeouts> expected =
1929 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1930 EXPECT_EQ(expected, perUidReadTimeouts);
1931 return 0;
1932}
1933
1934static ErrorCode checkPerUidTimeoutsEmpty(
1935 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1936 EXPECT_EQ(0u, perUidReadTimeouts.size());
1937 return 0;
1938}
1939
1940TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001941 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001942 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1943 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001944 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001945 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1946 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001947 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001948 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1949 TemporaryDir tempDir;
1950 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001951 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1952 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001953 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001954 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1955 createPerUidTimeouts(
1956 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001957}
1958
1959TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
1960 mVold->setIncFsMountOptionsSuccess();
1961 mAppOpsManager->checkPermissionSuccess();
1962 mFs->hasFiles();
1963
1964 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
1965 // First call.
1966 .WillOnce(Invoke(&checkPerUidTimeouts))
1967 // Fully loaded and no readlogs.
1968 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
1969 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
1970
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001971 // Loading storage.
1972 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1973 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
1974 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001975 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001976
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001977 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
1978 mDataLoaderParcel.packageName = "android";
1979
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001980 TemporaryDir tempDir;
1981 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001982 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1983 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001984 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001985 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1986 createPerUidTimeouts(
1987 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001988
1989 {
1990 // Timed callback present -> 0 progress.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001991 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001992 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1993 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001994 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001995
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001996 // Call it again.
1997 timedCallback();
1998 }
1999
2000 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002001 // Still present -> some progress.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002002 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002003 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2004 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002005 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002006
2007 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002008 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2009
2010 // Call it again.
2011 timedCallback();
2012 }
2013
2014 {
2015 // Still present -> fully loaded + readlogs.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002016 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002017 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2018 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002019 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002020
2021 // Now disable readlogs.
2022 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2023
2024 // Call it again.
2025 timedCallback();
2026 }
2027
2028 // No callbacks anymore -> fully loaded and no readlogs.
2029 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2030}
2031
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002032TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2033 const auto invalidStorageId = 100;
2034 android::os::PersistableBundle result{};
2035 mIncrementalService->getMetrics(invalidStorageId, &result);
2036 int64_t expected = -1, value = -1;
2037 ASSERT_FALSE(
2038 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2039 .c_str()),
2040 &value));
2041 ASSERT_EQ(expected, value);
2042 ASSERT_TRUE(result.empty());
2043}
2044
2045TEST_F(IncrementalServiceTest, testNoMetrics) {
2046 mVold->setIncFsMountOptionsSuccess();
2047 TemporaryDir tempDir;
2048 int storageId =
2049 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2050 IncrementalService::CreateOptions::CreateNew);
2051 ASSERT_GE(storageId, 0);
2052 android::os::PersistableBundle result{};
2053 mIncrementalService->getMetrics(storageId, &result);
2054 int64_t expected = -1, value = -1;
2055 ASSERT_FALSE(
2056 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2057 .c_str()),
2058 &value));
2059 ASSERT_EQ(expected, value);
2060 ASSERT_EQ(0, (int)result.size());
2061}
2062
2063TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2064 mVold->setIncFsMountOptionsSuccess();
2065 TemporaryDir tempDir;
2066 int storageId =
2067 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2068 IncrementalService::CreateOptions::CreateNew);
2069 ASSERT_GE(storageId, 0);
2070 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2071 {}, {}));
2072 android::os::PersistableBundle result{};
2073 mIncrementalService->getMetrics(storageId, &result);
2074 int64_t expected = -1, value = -1;
2075 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2076 ASSERT_EQ(expected, value);
2077 ASSERT_EQ(1, (int)result.size());
2078}
2079
Songchun Fan3c82a302019-11-29 14:23:45 -08002080} // namespace android::os::incremental