blob: 45b796bf4704e667f1cc7f1673d219ba6126062c [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 Buynytskyyab65cb12020-04-17 10:01:47 -0700143 if (mListener) {
144 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_CREATED);
145 }
146 return binder::Status::ok();
147 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700148 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
149 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700150 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700151 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700152 mListener = listener;
153 return binder::Status::ok();
154 }
155 binder::Status startOk(int32_t id) {
156 if (mListener) {
157 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
158 }
159 return binder::Status::ok();
160 }
161 binder::Status stopOk(int32_t id) {
162 if (mListener) {
163 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
164 }
165 return binder::Status::ok();
166 }
167 binder::Status destroyOk(int32_t id) {
168 if (mListener) {
169 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
170 }
171 mListener = nullptr;
172 return binder::Status::ok();
173 }
174 binder::Status prepareImageOk(int32_t id,
175 const ::std::vector<content::pm::InstallationFileParcel>&,
176 const ::std::vector<::std::string>&) {
177 if (mListener) {
178 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
179 }
180 return binder::Status::ok();
181 }
Songchun Fan2570ec02020-10-08 17:22:33 -0700182 binder::Status storageError(int32_t id) {
183 if (mListener) {
184 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
185 }
186 return binder::Status::ok();
187 }
188 binder::Status transportError(int32_t id) {
189 if (mListener) {
190 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
191 }
192 return binder::Status::ok();
193 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700194 int32_t setStorageParams(bool enableReadLogs) {
195 int32_t result = -1;
196 EXPECT_NE(mServiceConnector.get(), nullptr);
197 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
198 return result;
199 }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700200
201private:
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700202 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700203 sp<IDataLoaderStatusListener> mListener;
Songchun Fan68645c42020-02-27 15:57:35 -0800204};
205
206class MockDataLoaderManager : public DataLoaderManagerWrapper {
207public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700208 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
209 EXPECT_TRUE(mDataLoaderHolder != nullptr);
210 }
211
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800212 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800213 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800214 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800215 const sp<IDataLoaderStatusListener>& listener,
216 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800217 MOCK_CONST_METHOD2(getDataLoader,
218 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700219 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800220
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700221 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800222 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700223 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700224 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700225 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800226 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700227 .WillByDefault(Return(
228 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
229 }
230 void getDataLoaderSuccess() {
231 ON_CALL(*this, getDataLoader(_, _))
232 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
233 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700234 void unbindFromDataLoaderSuccess() {
235 ON_CALL(*this, unbindFromDataLoader(_))
236 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700237 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700238 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800239 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700240 const sp<IDataLoaderStatusListener>& listener,
241 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800242 mId = mountId;
243 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700244 mDataLoader = mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800245 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700246 if (mListener) {
247 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
248 }
249 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800250 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800251 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
252 const DataLoaderParamsParcel& params,
253 int bindDelayMs,
254 const sp<IDataLoaderStatusListener>& listener,
255 bool* _aidl_return) {
256 CHECK(bindDelayMs == 0) << bindDelayMs;
257 *_aidl_return = false;
258 return binder::Status::ok();
259 }
260 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
261 const DataLoaderParamsParcel& params,
262 int bindDelayMs,
263 const sp<IDataLoaderStatusListener>& listener,
264 bool* _aidl_return) {
265 CHECK(bindDelayMs == 0) << bindDelayMs;
266 *_aidl_return = true;
267 if (listener) {
268 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
269 }
270 return binder::Status::ok();
271 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800272 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
273 const DataLoaderParamsParcel& params,
274 int bindDelayMs,
275 const sp<IDataLoaderStatusListener>& listener,
276 bool* _aidl_return) {
277 CHECK(1000 * 9 <= bindDelayMs && bindDelayMs <= 1000 * 11) << bindDelayMs;
278 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
279 }
280 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
281 const DataLoaderParamsParcel& params,
282 int bindDelayMs,
283 const sp<IDataLoaderStatusListener>& listener,
284 bool* _aidl_return) {
285 CHECK(1000 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11) << bindDelayMs;
286 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
287 }
288 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
289 const DataLoaderParamsParcel& params,
290 int bindDelayMs,
291 const sp<IDataLoaderStatusListener>& listener,
292 bool* _aidl_return) {
293 CHECK(1000 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11 * 11) << bindDelayMs;
294 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
295 }
296 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
297 const DataLoaderParamsParcel& params,
298 int bindDelayMs,
299 const sp<IDataLoaderStatusListener>& listener,
300 bool* _aidl_return) {
301 CHECK(1000 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 1000 * 11 * 11 * 11 * 11)
302 << bindDelayMs;
303 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
304 }
305
Songchun Fan68645c42020-02-27 15:57:35 -0800306 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
307 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800308 return binder::Status::ok();
309 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700310 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800311 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800312 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700313 void setDataLoaderStatusStarted() {
314 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
315 }
316 void setDataLoaderStatusDestroyed() {
317 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
318 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700319 void setDataLoaderStatusUnavailable() {
320 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
321 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800322 void setDataLoaderStatusUnrecoverable() {
323 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
324 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700325 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700326 if (mDataLoader) {
327 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
328 return status;
329 }
330 mDataLoader = nullptr;
331 }
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700332 if (mListener) {
333 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
334 }
335 return binder::Status::ok();
336 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700337
Songchun Fan3c82a302019-11-29 14:23:45 -0800338private:
339 int mId;
340 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700341 sp<IDataLoader> mDataLoader;
342 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800343};
344
345class MockIncFs : public IncFsWrapper {
346public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800347 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700348 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
349 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800350 MOCK_CONST_METHOD4(createControl,
351 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
352 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800353 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800354 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800355 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800356 MOCK_CONST_METHOD4(makeMappedFile,
357 ErrorCode(const Control& control, std::string_view path, int mode,
358 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800359 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700360 MOCK_CONST_METHOD3(makeDirs,
361 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800362 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
363 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
364 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan6944f1e2020-11-06 15:24:24 -0800365 MOCK_CONST_METHOD1(toString, std::string(FileId fileId));
Songchun Fan374f7652020-08-20 08:40:29 -0700366 MOCK_CONST_METHOD2(countFilledBlocks,
367 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
368 std::string_view path));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800369 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700370 ErrorCode(const Control& control, std::string_view from,
371 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800372 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700373 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700374 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700375 MOCK_CONST_METHOD3(reserveSpace,
376 ErrorCode(const Control& control, std::string_view path, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700377 MOCK_CONST_METHOD3(waitForPendingReads,
378 WaitResult(const Control& control, std::chrono::milliseconds timeout,
379 std::vector<incfs::ReadInfo>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800380 MOCK_CONST_METHOD2(setUidReadTimeouts,
381 ErrorCode(const Control& control,
382 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700383
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700384 MockIncFs() {
385 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
386 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
387 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800388
389 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
390 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700391
392 void countFilledBlocksSuccess() {
393 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
394 }
395
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700396 void countFilledBlocksFullyLoaded() {
397 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
398 }
399
Songchun Fan374f7652020-08-20 08:40:29 -0700400 void countFilledBlocksFails() {
401 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
402 }
403
404 void countFilledBlocksEmpty() {
405 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
406 }
407
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700408 void openMountSuccess() {
409 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
410 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700411
412 // 1000ms
413 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700414 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700415 .WillByDefault(
416 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
417 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
418 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
419 return android::incfs::WaitResult::HaveData;
420 }));
421 }
422
423 void waitForPendingReadsTimeout() {
424 ON_CALL(*this, waitForPendingReads(_, _, _))
425 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700426 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700427
428 static constexpr auto kPendingReadsFd = 42;
429 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800430 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700431 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700432
Songchun Fan20d6ef22020-03-03 09:47:15 -0800433 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800434 metadata::Mount m;
435 m.mutable_storage()->set_id(100);
436 m.mutable_loader()->set_package_name("com.test");
437 m.mutable_loader()->set_arguments("com.uri");
438 const auto metadata = m.SerializeAsString();
439 m.mutable_loader()->release_arguments();
440 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800441 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800442 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800443 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800444 metadata::Storage st;
445 st.set_id(100);
446 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800447 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800448 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800449 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800450 metadata::BindPoint bp;
451 std::string destPath = "dest";
452 std::string srcPath = "src";
453 bp.set_storage_id(100);
454 bp.set_allocated_dest_path(&destPath);
455 bp.set_allocated_source_subdir(&srcPath);
456 const auto metadata = bp.SerializeAsString();
457 bp.release_source_subdir();
458 bp.release_dest_path();
459 return std::vector<char>(metadata.begin(), metadata.end());
460 }
461};
462
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700463class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700464public:
465 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700466 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700467 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
468
469 void checkPermissionSuccess() {
470 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
471 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800472 void checkPermissionNoCrossUsers() {
473 ON_CALL(*this,
474 checkPermission("android.permission.LOADER_USAGE_STATS",
475 "android:loader_usage_stats", _))
476 .WillByDefault(Return(android::incremental::Ok()));
477 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
478 .WillByDefault(
479 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
480 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700481 void checkPermissionFails() {
482 ON_CALL(*this, checkPermission(_, _, _))
483 .WillByDefault(
484 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
485 }
486 void initializeStartWatchingMode() {
487 ON_CALL(*this, startWatchingMode(_, _, _))
488 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
489 }
490 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
491 mStoredCallback = cb;
492 }
493
494 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700495};
496
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700497class MockJniWrapper : public JniWrapper {
498public:
499 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
500
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700501 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700502};
503
504class MockLooperWrapper : public LooperWrapper {
505public:
506 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
507 MOCK_METHOD1(removeFd, int(int));
508 MOCK_METHOD0(wake, void());
509 MOCK_METHOD1(pollAll, int(int));
510
511 MockLooperWrapper() {
512 ON_CALL(*this, addFd(_, _, _, _, _))
513 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
514 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700515 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700516 }
517
518 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
519 mCallback = callback;
520 mCallbackData = data;
521 return 0;
522 }
523
524 int clearCallback(int) {
525 mCallback = nullptr;
526 mCallbackData = nullptr;
527 return 0;
528 }
529
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700530 int wait10Ms(int) {
531 // This is called from a loop in runCmdLooper.
532 // Sleeping for 10ms only to avoid busy looping.
533 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700534 return 0;
535 }
536
537 android::Looper_callbackFunc mCallback = nullptr;
538 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700539};
540
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700541class MockTimedQueueWrapper : public TimedQueueWrapper {
542public:
543 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
544 MOCK_METHOD1(removeJobs, void(MountId));
545 MOCK_METHOD0(stop, void());
546
547 MockTimedQueueWrapper() {
548 ON_CALL(*this, addJob(_, _, _))
549 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
550 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
551 }
552
553 void storeJob(MountId id, Milliseconds after, Job what) {
554 mId = id;
555 mAfter = after;
556 mWhat = std::move(what);
557 }
558
559 void clearJob(MountId id) {
560 if (mId == id) {
561 mAfter = {};
562 mWhat = {};
563 }
564 }
565
566 MountId mId = -1;
567 Milliseconds mAfter;
568 Job mWhat;
569};
570
Songchun Fan374f7652020-08-20 08:40:29 -0700571class MockFsWrapper : public FsWrapper {
572public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800573 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
574 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700575 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800576 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700577 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
578 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800579 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
580 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
581 if (!onFile(file)) break;
582 }
Songchun Fan374f7652020-08-20 08:40:29 -0700583 }
584};
585
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800586class MockClockWrapper : public ClockWrapper {
587public:
588 MOCK_CONST_METHOD0(now, TimePoint());
589
590 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
591 template <class Delta>
592 void advance(Delta delta) {
593 mClock += delta;
594 }
595
596 TimePoint getClock() const { return mClock; }
597
598 TimePoint mClock = Clock::now();
599};
600
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700601class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
602public:
603 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
604
605 MockStorageHealthListener() {
606 ON_CALL(*this, onHealthStatus(_, _))
607 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
608 }
609
610 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
611 mStorageId = storageId;
612 mStatus = status;
613 return binder::Status::ok();
614 }
615
616 int32_t mStorageId = -1;
617 int32_t mStatus = -1;
618};
619
Songchun Fana7098592020-09-03 11:45:53 -0700620class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
621public:
622 MockStorageLoadingProgressListener() = default;
623 MOCK_METHOD2(onStorageLoadingProgressChanged,
624 binder::Status(int32_t storageId, float progress));
625 MOCK_METHOD0(onAsBinder, IBinder*());
626};
627
Songchun Fan3c82a302019-11-29 14:23:45 -0800628class MockServiceManager : public ServiceManagerWrapper {
629public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800630 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700631 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700632 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700633 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700634 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700635 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700636 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700637 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800638 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800639 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700640 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700641 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700642 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700643 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700644 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700645 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700646 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800647 mFs(std::move(fs)),
648 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800649 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800650 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
651 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800652 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800653 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700654 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
655 return std::move(mAppOpsManager);
656 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700657 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700658 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700659 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700660 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
661 return std::move(mProgressUpdateJobQueue);
662 }
Songchun Fan374f7652020-08-20 08:40:29 -0700663 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800664 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800665
666private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800667 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800668 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800669 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700670 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700671 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700672 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700673 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700674 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700675 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800676 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800677};
678
679// --- IncrementalServiceTest ---
680
Songchun Fan3c82a302019-11-29 14:23:45 -0800681class IncrementalServiceTest : public testing::Test {
682public:
683 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800684 auto vold = std::make_unique<NiceMock<MockVoldService>>();
685 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700686 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
687 mDataLoader = dataLoader.get();
688 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800689 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800690 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
691 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700692 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
693 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700694 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
695 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700696 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
697 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700698 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
699 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700700 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
701 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700702 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
703 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800704 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
705 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700706 mIncrementalService = std::make_unique<
707 IncrementalService>(MockServiceManager(std::move(vold),
708 std::move(dataloaderManager),
709 std::move(incFs), std::move(appOps),
710 std::move(jni), std::move(looper),
711 std::move(timedQueue),
712 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800713 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700714 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800715 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800716 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700717 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800718 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800719 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700720 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800721 }
722
723 void setUpExistingMountDir(const std::string& rootDir) {
724 const auto dir = rootDir + "/dir1";
725 const auto mountDir = dir + "/mount";
726 const auto backingDir = dir + "/backing_store";
727 const auto storageDir = mountDir + "/st0";
728 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
729 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
730 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
731 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
732 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
733 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
734 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
735 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800736 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
737 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
738 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
739 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
740 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
741 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800742 }
743
Songchun Fan374f7652020-08-20 08:40:29 -0700744 void setupSuccess() {
745 mVold->mountIncFsSuccess();
746 mIncFs->makeFileSuccess();
747 mVold->bindMountSuccess();
748 mDataLoaderManager->bindToDataLoaderSuccess();
749 mDataLoaderManager->getDataLoaderSuccess();
750 }
751
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000752 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
753 android::os::PersistableBundle result{};
754 mIncrementalService->getMetrics(storageId, &result);
755 int64_t value = -1;
756 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
757 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
758 .c_str()),
759 &value));
760 ASSERT_EQ(expected, value);
761 ASSERT_EQ(1, (int)result.size());
762 }
763
Songchun Fan3c82a302019-11-29 14:23:45 -0800764protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700765 NiceMock<MockVoldService>* mVold = nullptr;
766 NiceMock<MockIncFs>* mIncFs = nullptr;
767 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
768 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
769 NiceMock<MockJniWrapper>* mJni = nullptr;
770 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700771 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700772 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700773 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800774 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700775 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800776 std::unique_ptr<IncrementalService> mIncrementalService;
777 TemporaryDir mRootDir;
778 DataLoaderParamsParcel mDataLoaderParcel;
779};
780
Songchun Fan3c82a302019-11-29 14:23:45 -0800781TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
782 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800783 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800784 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800785 int storageId =
786 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
787 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800788 ASSERT_LT(storageId, 0);
789}
790
791TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
792 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800793 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700794 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800795 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800796 int storageId =
797 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
798 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800799 ASSERT_LT(storageId, 0);
800}
801
802TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
803 mVold->mountIncFsSuccess();
804 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800805 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700806 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800807 EXPECT_CALL(*mVold, unmountIncFs(_));
808 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800809 int storageId =
810 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
811 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800812 ASSERT_LT(storageId, 0);
813}
814
815TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
816 mVold->mountIncFsSuccess();
817 mIncFs->makeFileSuccess();
818 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800819 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700820 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800821 EXPECT_CALL(*mVold, unmountIncFs(_));
822 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800823 int storageId =
824 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
825 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800826 ASSERT_LT(storageId, 0);
827}
828
829TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
830 mVold->mountIncFsSuccess();
831 mIncFs->makeFileSuccess();
832 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700833 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800834 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700835 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700836 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
837 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
838 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800839 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
840 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800841 int storageId =
842 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
843 IncrementalService::CreateOptions::CreateNew);
844 ASSERT_GE(storageId, 0);
845 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800846}
847
848TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700849 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800850 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700851 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800852 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
853 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800854 int storageId =
855 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
856 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800857 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800858 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800859 mIncrementalService->deleteStorage(storageId);
860}
861
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800862TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
863 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(6);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700864 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800865 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(6);
866 EXPECT_CALL(*mDataLoader, start(_)).Times(6);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700867 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800868 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
869 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800870 int storageId =
871 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
872 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800873 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800874 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800875
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700876 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800877
878 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
879 .WillByDefault(Invoke(mDataLoaderManager,
880 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
881 mDataLoaderManager->setDataLoaderStatusDestroyed();
882
883 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
884 .WillByDefault(Invoke(mDataLoaderManager,
885 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
886 mDataLoaderManager->setDataLoaderStatusDestroyed();
887
888 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
889 .WillByDefault(Invoke(mDataLoaderManager,
890 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
891 mDataLoaderManager->setDataLoaderStatusDestroyed();
892
893 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
894 .WillByDefault(Invoke(mDataLoaderManager,
895 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
896 mDataLoaderManager->setDataLoaderStatusDestroyed();
897
898 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
899 .WillByDefault(Invoke(mDataLoaderManager,
900 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700901 mDataLoaderManager->setDataLoaderStatusDestroyed();
902}
903
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800904TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
905 mIncFs->waitForPendingReadsSuccess();
906 mIncFs->openMountSuccess();
907
908 constexpr auto bindRetryInterval = 5s;
909
910 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(10);
911 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
912 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(6);
913 EXPECT_CALL(*mDataLoader, start(_)).Times(6);
914 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
915 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -0700916 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800917 TemporaryDir tempDir;
918 int storageId =
919 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
920 IncrementalService::CreateOptions::CreateNew);
921 ASSERT_GE(storageId, 0);
922
923 // First binds to DataLoader fails... because it's restart.
924 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
925 .WillByDefault(Invoke(mDataLoaderManager,
926 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
927
928 // Request DL start.
929 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
930
931 // Retry callback present.
932 ASSERT_EQ(storageId, mTimedQueue->mId);
933 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
934 auto retryCallback = mTimedQueue->mWhat;
935 mTimedQueue->clearJob(storageId);
936
937 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
938 mClock->advance(5s);
939
940 retryCallback();
941 // Retry callback present.
942 ASSERT_EQ(storageId, mTimedQueue->mId);
943 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
944 retryCallback = mTimedQueue->mWhat;
945 mTimedQueue->clearJob(storageId);
946
947 // Returning "binding" so that we can retry.
948 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
949 .WillByDefault(Invoke(mDataLoaderManager,
950 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
951
952 // Expecting bindToDataLoaderBindingWithNoDelay call.
953 mClock->advance(5s);
954
955 retryCallback();
956 // No retry callback.
957 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
958 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
959
960 // Should not change the bindToDataLoader call count
961 ASSERT_NE(nullptr, mLooper->mCallback);
962 ASSERT_NE(nullptr, mLooper->mCallbackData);
963 auto looperCb = mLooper->mCallback;
964 auto looperCbData = mLooper->mCallbackData;
965 looperCb(-1, -1, looperCbData);
966
967 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
968 mClock->advance(5s);
969
970 // Use pending reads callback to trigger binding.
971 looperCb(-1, -1, looperCbData);
972
973 // No retry callback.
974 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
975 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
976
977 // Now we are out of 10m "retry" budget, let's finally bind.
978 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
979 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
980 mClock->advance(11min);
981
982 // Use pending reads callback to trigger binding.
983 looperCb(-1, -1, looperCbData);
984
985 // No retry callback.
986 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
987 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
988
989 // And test the rest of the backoff.
990 // Simulated crash/other connection breakage.
991 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
992 .WillByDefault(Invoke(mDataLoaderManager,
993 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
994 mDataLoaderManager->setDataLoaderStatusDestroyed();
995
996 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
997 .WillByDefault(Invoke(mDataLoaderManager,
998 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
999 mDataLoaderManager->setDataLoaderStatusDestroyed();
1000
1001 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1002 .WillByDefault(Invoke(mDataLoaderManager,
1003 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
1004 mDataLoaderManager->setDataLoaderStatusDestroyed();
1005
1006 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1007 .WillByDefault(Invoke(mDataLoaderManager,
1008 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1009 mDataLoaderManager->setDataLoaderStatusDestroyed();
1010
1011 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1012 .WillByDefault(Invoke(mDataLoaderManager,
1013 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1014 mDataLoaderManager->setDataLoaderStatusDestroyed();
1015}
1016
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001017TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001018 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001019 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001020 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001021 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1022 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1023 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1024 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1025 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001026 int storageId =
1027 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1028 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001029 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001030 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1031 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001032 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001033 mDataLoaderManager->setDataLoaderStatusStarted();
1034}
1035
1036TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001037 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001038 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001039 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001040 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001041 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1042 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1043 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1044 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001045 int storageId =
1046 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1047 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001048 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001049 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1050 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001051 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001052}
1053
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001054TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001055 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001056 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001057 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1058 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1059 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1060 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1061 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1062 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001063 int storageId =
1064 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1065 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001066 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001067 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1068 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001069 mDataLoaderManager->setDataLoaderStatusUnavailable();
1070}
1071
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001072TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1073 mDataLoader->initializeCreateOkNoStatus();
1074 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1075 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1076 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1077 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1078 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1079 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1080 TemporaryDir tempDir;
1081 int storageId =
1082 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1083 IncrementalService::CreateOptions::CreateNew);
1084 ASSERT_GE(storageId, 0);
1085 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1086 {}, {}));
1087 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1088}
1089
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001090TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001091 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001092 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001093 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001094
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001095 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001096 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001097 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1098 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001099 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001100 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1101 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1102 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1103 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001104 int storageId =
1105 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1106 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001107 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001108 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1109 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001110 mDataLoaderManager->setDataLoaderStatusUnavailable();
1111 ASSERT_NE(nullptr, mLooper->mCallback);
1112 ASSERT_NE(nullptr, mLooper->mCallbackData);
1113 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1114}
1115
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001116TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001117 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001118
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001119 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001120 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1121 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1122 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1123 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1124 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1125 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1126 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001127 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(5);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001128
1129 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1130 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1131 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1132 .Times(2);
1133 EXPECT_CALL(*listenerMock,
1134 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1135 .Times(1);
1136 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1137 .Times(1);
1138 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1139 .Times(2);
1140
1141 StorageHealthCheckParams params;
1142 params.blockedTimeoutMs = 10000;
1143 params.unhealthyTimeoutMs = 20000;
1144 params.unhealthyMonitoringMs = 30000;
1145
1146 using MS = std::chrono::milliseconds;
1147 using MCS = std::chrono::microseconds;
1148
1149 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1150 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1151 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1152
1153 const uint64_t kFirstTimestampUs = 1000000000ll;
1154 const uint64_t kBlockedTimestampUs =
1155 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1156 const uint64_t kUnhealthyTimestampUs =
1157 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1158
1159 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001160 int storageId =
1161 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1162 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001163 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001164 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1165 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001166
1167 // Healthy state, registered for pending reads.
1168 ASSERT_NE(nullptr, mLooper->mCallback);
1169 ASSERT_NE(nullptr, mLooper->mCallbackData);
1170 ASSERT_EQ(storageId, listener->mStorageId);
1171 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001172 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001173
1174 // Looper/epoll callback.
1175 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1176 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1177
1178 // Unregister from pending reads and wait.
1179 ASSERT_EQ(nullptr, mLooper->mCallback);
1180 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1181 ASSERT_EQ(storageId, listener->mStorageId);
1182 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1183 // Timed callback present.
1184 ASSERT_EQ(storageId, mTimedQueue->mId);
1185 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1186 auto timedCallback = mTimedQueue->mWhat;
1187 mTimedQueue->clearJob(storageId);
1188
1189 // Timed job callback for blocked.
1190 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1191 timedCallback();
1192
1193 // Still not registered, and blocked.
1194 ASSERT_EQ(nullptr, mLooper->mCallback);
1195 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1196 ASSERT_EQ(storageId, listener->mStorageId);
1197 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001198 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1199
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001200 // Timed callback present.
1201 ASSERT_EQ(storageId, mTimedQueue->mId);
1202 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1203 timedCallback = mTimedQueue->mWhat;
1204 mTimedQueue->clearJob(storageId);
1205
1206 // Timed job callback for unhealthy.
1207 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1208 timedCallback();
1209
1210 // Still not registered, and blocked.
1211 ASSERT_EQ(nullptr, mLooper->mCallback);
1212 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1213 ASSERT_EQ(storageId, listener->mStorageId);
1214 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001215 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1216
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001217 // Timed callback present.
1218 ASSERT_EQ(storageId, mTimedQueue->mId);
1219 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1220 timedCallback = mTimedQueue->mWhat;
1221 mTimedQueue->clearJob(storageId);
1222
1223 // One more unhealthy.
1224 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1225 timedCallback();
1226
1227 // Still not registered, and blocked.
1228 ASSERT_EQ(nullptr, mLooper->mCallback);
1229 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1230 ASSERT_EQ(storageId, listener->mStorageId);
1231 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001232 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1233
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001234 // Timed callback present.
1235 ASSERT_EQ(storageId, mTimedQueue->mId);
1236 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1237 timedCallback = mTimedQueue->mWhat;
1238 mTimedQueue->clearJob(storageId);
1239
1240 // And now healthy.
1241 mIncFs->waitForPendingReadsTimeout();
1242 timedCallback();
1243
1244 // Healthy state, registered for pending reads.
1245 ASSERT_NE(nullptr, mLooper->mCallback);
1246 ASSERT_NE(nullptr, mLooper->mCallbackData);
1247 ASSERT_EQ(storageId, listener->mStorageId);
1248 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001249 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001250}
1251
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001252TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001253 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001254 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001255
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001256 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001257 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001258 // We are calling setIncFsMountOptions(true).
1259 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1260 // After setIncFsMountOptions succeeded expecting to start watching.
1261 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1262 // Not expecting callback removal.
1263 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001264 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001265 int storageId =
1266 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1267 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001268 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001269 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1270 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001271 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001272}
1273
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001274TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001275 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001276 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001277
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001278 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1279 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1280 // Enabling and then disabling readlogs.
1281 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1282 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1283 // After setIncFsMountOptions succeeded expecting to start watching.
1284 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1285 // Not expecting callback removal.
1286 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1287 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001288 int storageId =
1289 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1290 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001291 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001292 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1293 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001294 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1295 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001296 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001297 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1298}
1299
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001300TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1301 mVold->setIncFsMountOptionsSuccess();
1302 mAppOpsManager->checkPermissionSuccess();
1303
1304 const auto readLogsMaxInterval = 2h;
1305
1306 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1307 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1308 // Enabling and then disabling readlogs.
1309 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
1310 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1311 // After setIncFsMountOptions succeeded expecting to start watching.
1312 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1313 // Not expecting callback removal.
1314 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1315 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(1);
1316 TemporaryDir tempDir;
1317 int storageId =
1318 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1319 IncrementalService::CreateOptions::CreateNew);
1320 ASSERT_GE(storageId, 0);
1321 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1322 {}, {}));
1323
1324 // Disable readlogs callback present.
1325 ASSERT_EQ(storageId, mTimedQueue->mId);
1326 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1327 auto callback = mTimedQueue->mWhat;
1328 mTimedQueue->clearJob(storageId);
1329
1330 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1331 // Now advance clock for 1hr.
1332 mClock->advance(1h);
1333 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1334 // Now call the timed callback, it should turn off the readlogs.
1335 callback();
1336 // Now advance clock for 2hrs.
1337 mClock->advance(readLogsMaxInterval);
1338 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1339}
1340
1341TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1342 mVold->setIncFsMountOptionsSuccess();
1343 mAppOpsManager->checkPermissionSuccess();
1344
1345 const auto readLogsMaxInterval = 2h;
1346
1347 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1348 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1349 // Enabling and then disabling readlogs.
1350 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1351 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
1352 // After setIncFsMountOptions succeeded expecting to start watching.
1353 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1354 // Not expecting callback removal.
1355 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1356 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(0);
1357 // System data loader.
1358 mDataLoaderParcel.packageName = "android";
1359 TemporaryDir tempDir;
1360 int storageId =
1361 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1362 IncrementalService::CreateOptions::CreateNew);
1363 ASSERT_GE(storageId, 0);
1364 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1365 {}, {}));
1366
1367 // No readlogs callback.
1368 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1369 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1370
1371 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1372 // Now advance clock for 1hr.
1373 mClock->advance(1h);
1374 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1375 // Now advance clock for 2hrs.
1376 mClock->advance(readLogsMaxInterval);
1377 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1378}
1379
1380TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1381 mVold->setIncFsMountOptionsSuccess();
1382 mAppOpsManager->checkPermissionSuccess();
1383
1384 const auto readLogsMaxInterval = 2h;
1385
1386 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1387 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1388 // Enabling and then disabling readlogs.
1389 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1390 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1391 // After setIncFsMountOptions succeeded expecting to start watching.
1392 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1393 // Not expecting callback removal.
1394 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1395 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
1396 TemporaryDir tempDir;
1397 int storageId =
1398 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1399 IncrementalService::CreateOptions::CreateNew);
1400 ASSERT_GE(storageId, 0);
1401
1402 auto dataLoaderParcel = mDataLoaderParcel;
1403 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1404 {}, {}));
1405
1406 // Disable readlogs callback present.
1407 ASSERT_EQ(storageId, mTimedQueue->mId);
1408 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1409 auto callback = mTimedQueue->mWhat;
1410 mTimedQueue->clearJob(storageId);
1411
1412 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1413 // Now advance clock for 1.5hrs.
1414 mClock->advance(90min);
1415 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1416
1417 // New installation.
1418 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1419 {}, {}));
1420
1421 // New callback present.
1422 ASSERT_EQ(storageId, mTimedQueue->mId);
1423 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1424 auto callback2 = mTimedQueue->mWhat;
1425 mTimedQueue->clearJob(storageId);
1426
1427 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1428 callback();
1429 // Advance clock for another 1.5hrs.
1430 mClock->advance(90min);
1431 // Still success even it's 3hrs past first install.
1432 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1433
1434 // New one should disable.
1435 callback2();
1436 // And timeout.
1437 mClock->advance(90min);
1438 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1439}
1440
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001441TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001442 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001443 mAppOpsManager->checkPermissionSuccess();
1444 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001445
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001446 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001447 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1448 // We are calling setIncFsMountOptions(true).
1449 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1450 // setIncFsMountOptions(false) is called on the callback.
1451 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1452 // After setIncFsMountOptions succeeded expecting to start watching.
1453 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1454 // After callback is called, disable read logs and remove callback.
1455 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1456 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001457 int storageId =
1458 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1459 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001460 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001461 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1462 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001463 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001464 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1465 mAppOpsManager->mStoredCallback->opChanged(0, {});
1466}
1467
1468TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001469 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001470
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001471 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001472 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1473 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1474 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1475 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1476 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1477 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001478 int storageId =
1479 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1480 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001481 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001482 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1483 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001484 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001485}
1486
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001487TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1488 mAppOpsManager->checkPermissionNoCrossUsers();
1489
1490 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1491 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1492 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1493 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1494 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1495 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1496 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001497 int storageId =
1498 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1499 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001500 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001501 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1502 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001503 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1504}
1505
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001506TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001507 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001508 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001509
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001510 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001511 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001512 // We are calling setIncFsMountOptions.
1513 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1514 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1515 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1516 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001517 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001518 int storageId =
1519 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1520 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001521 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001522 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1523 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001524 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001525}
1526
Songchun Fan3c82a302019-11-29 14:23:45 -08001527TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001528 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001529 int storageId =
1530 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1531 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001532 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001533
Songchun Fan103ba1d2020-02-03 17:32:32 -08001534 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001535 // <root>/*/mount/<storage>/test
1536 EXPECT_CALL(*mIncFs,
1537 makeDir(_, Truly([&](std::string_view arg) {
1538 return arg.starts_with(mRootDir.path) &&
1539 arg.ends_with("/mount/st_1_0/" + dir_path);
1540 }),
1541 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001542 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1543 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001544}
1545
1546TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001547 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001548 int storageId =
1549 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1550 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001551 auto first = "first"sv;
1552 auto second = "second"sv;
1553 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001554 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001555
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001556 EXPECT_CALL(*mIncFs,
1557 makeDirs(_, Truly([&](std::string_view arg) {
1558 return arg.starts_with(mRootDir.path) &&
1559 arg.ends_with("/mount/st_1_0/" + dir_path);
1560 }),
1561 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001562 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001563 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001564}
Songchun Fan374f7652020-08-20 08:40:29 -07001565
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001566TEST_F(IncrementalServiceTest, testIsFileFullyLoadedFailsWithNoFile) {
1567 mIncFs->countFilledBlocksFails();
1568 mFs->hasNoFile();
1569
1570 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001571 int storageId =
1572 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1573 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001574 ASSERT_EQ(-1, mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
1575}
1576
1577TEST_F(IncrementalServiceTest, testIsFileFullyLoadedFailsWithFailedRanges) {
1578 mIncFs->countFilledBlocksFails();
1579 mFs->hasFiles();
1580
1581 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001582 int storageId =
1583 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1584 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001585 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
1586 ASSERT_EQ(-1, mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
1587}
1588
1589TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccessWithEmptyRanges) {
1590 mIncFs->countFilledBlocksEmpty();
1591 mFs->hasFiles();
1592
1593 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001594 int storageId =
1595 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1596 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001597 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
1598 ASSERT_EQ(0, mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
1599}
1600
1601TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
1602 mIncFs->countFilledBlocksFullyLoaded();
1603 mFs->hasFiles();
1604
1605 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001606 int storageId =
1607 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1608 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001609 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
1610 ASSERT_EQ(0, mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
1611}
1612
Songchun Fan425862f2020-08-25 13:12:16 -07001613TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001614 mIncFs->countFilledBlocksSuccess();
1615 mFs->hasNoFile();
1616
1617 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001618 int storageId =
1619 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1620 IncrementalService::CreateOptions::CreateNew);
1621 ASSERT_EQ(1,
1622 mIncrementalService->getLoadingProgress(storageId, /*stopOnFirstIncomplete=*/false)
1623 .getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001624}
1625
1626TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1627 mIncFs->countFilledBlocksFails();
1628 mFs->hasFiles();
1629
1630 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001631 int storageId =
1632 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1633 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001634 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001635 ASSERT_EQ(-1,
1636 mIncrementalService->getLoadingProgress(storageId, /*stopOnFirstIncomplete=*/false)
1637 .getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001638}
1639
Songchun Fan425862f2020-08-25 13:12:16 -07001640TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001641 mIncFs->countFilledBlocksEmpty();
1642 mFs->hasFiles();
1643
1644 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001645 int storageId =
1646 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1647 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001648 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001649 ASSERT_EQ(1,
1650 mIncrementalService->getLoadingProgress(storageId, /*stopOnFirstIncomplete=*/false)
1651 .getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001652}
1653
1654TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1655 mIncFs->countFilledBlocksSuccess();
1656 mFs->hasFiles();
1657
1658 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001659 int storageId =
1660 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1661 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001662 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001663 ASSERT_EQ(0.5,
1664 mIncrementalService->getLoadingProgress(storageId, /*stopOnFirstIncomplete=*/false)
1665 .getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001666}
Songchun Fana7098592020-09-03 11:45:53 -07001667
1668TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1669 mIncFs->countFilledBlocksSuccess();
1670 mFs->hasFiles();
1671
1672 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001673 int storageId =
1674 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1675 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001676 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1677 new NiceMock<MockStorageLoadingProgressListener>};
1678 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1679 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1680 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1681 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1682 // Timed callback present.
1683 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1684 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1685 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1686 timedCallback();
1687 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1688 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1689 mIncrementalService->unregisterLoadingProgressListener(storageId);
1690 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1691}
1692
1693TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1694 mIncFs->countFilledBlocksFails();
1695 mFs->hasFiles();
1696
1697 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001698 int storageId =
1699 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1700 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001701 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1702 new NiceMock<MockStorageLoadingProgressListener>};
1703 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1704 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1705 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1706}
Songchun Fan2570ec02020-10-08 17:22:33 -07001707
1708TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1709 mIncFs->openMountSuccess();
1710 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1711 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1712 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1713
1714 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001715 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001716 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1717 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001718 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001719 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1720 {});
1721
Songchun Fan2570ec02020-10-08 17:22:33 -07001722 StorageHealthCheckParams newParams;
1723 newParams.blockedTimeoutMs = 10000;
1724 newParams.unhealthyTimeoutMs = 20000;
1725 newParams.unhealthyMonitoringMs = 30000;
1726 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1727 newListener));
1728
1729 using MS = std::chrono::milliseconds;
1730 using MCS = std::chrono::microseconds;
1731
1732 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1733 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1734
1735 const uint64_t kFirstTimestampUs = 1000000000ll;
1736 const uint64_t kBlockedTimestampUs =
1737 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1738 const uint64_t kUnhealthyTimestampUs =
1739 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1740
1741 // test that old listener was not called
1742 EXPECT_CALL(*listener.get(),
1743 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1744 .Times(0);
1745 EXPECT_CALL(*newListenerMock,
1746 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1747 .Times(1);
1748 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1749 .Times(1);
1750 EXPECT_CALL(*newListenerMock,
1751 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1752 .Times(1);
1753 EXPECT_CALL(*newListenerMock,
1754 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1755 .Times(1);
1756 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1757 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1758
1759 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1760 ASSERT_EQ(storageId, newListener->mStorageId);
1761
1762 auto timedCallback = mTimedQueue->mWhat;
1763 mTimedQueue->clearJob(storageId);
1764
1765 // test when health status is blocked with transport error
1766 mDataLoader->transportError(storageId);
1767 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1768 timedCallback();
1769 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1770 timedCallback = mTimedQueue->mWhat;
1771 mTimedQueue->clearJob(storageId);
1772
1773 // test when health status is blocked with storage error
1774 mDataLoader->storageError(storageId);
1775 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1776 timedCallback();
1777 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1778 timedCallback = mTimedQueue->mWhat;
1779 mTimedQueue->clearJob(storageId);
1780
1781 // test when health status is unhealthy with transport error
1782 mDataLoader->transportError(storageId);
1783 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1784 timedCallback();
1785 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1786 mTimedQueue->clearJob(storageId);
1787}
1788
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001789static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1790 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1791 std::vector<PerUidReadTimeouts> result;
1792 for (auto&& tuple : tuples) {
1793 result.emplace_back();
1794 auto& timeouts = result.back();
1795 timeouts.uid = std::get<0>(tuple);
1796 timeouts.minTimeUs = std::get<1>(tuple);
1797 timeouts.minPendingTimeUs = std::get<2>(tuple);
1798 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1799 }
1800 return result;
1801}
1802
1803static ErrorCode checkPerUidTimeouts(const Control& control,
1804 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1805 std::vector<PerUidReadTimeouts> expected =
1806 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1807 EXPECT_EQ(expected, perUidReadTimeouts);
1808 return 0;
1809}
1810
1811static ErrorCode checkPerUidTimeoutsEmpty(
1812 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1813 EXPECT_EQ(0u, perUidReadTimeouts.size());
1814 return 0;
1815}
1816
1817TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001818 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001819 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1820 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001821 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001822 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1823 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001824 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001825 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1826 TemporaryDir tempDir;
1827 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001828 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1829 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001830 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001831 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1832 createPerUidTimeouts(
1833 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001834}
1835
1836TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
1837 mVold->setIncFsMountOptionsSuccess();
1838 mAppOpsManager->checkPermissionSuccess();
1839 mFs->hasFiles();
1840
1841 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
1842 // First call.
1843 .WillOnce(Invoke(&checkPerUidTimeouts))
1844 // Fully loaded and no readlogs.
1845 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
1846 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
1847
1848 // Empty storage.
1849 mIncFs->countFilledBlocksEmpty();
1850
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001851 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
1852 mDataLoaderParcel.packageName = "android";
1853
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001854 TemporaryDir tempDir;
1855 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001856 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1857 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001858 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001859 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1860 createPerUidTimeouts(
1861 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001862
1863 {
1864 // Timed callback present -> 0 progress.
1865 ASSERT_EQ(storageId, mTimedQueue->mId);
1866 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1867 const auto timedCallback = mTimedQueue->mWhat;
1868 mTimedQueue->clearJob(storageId);
1869
1870 // Still loading.
1871 mIncFs->countFilledBlocksSuccess();
1872
1873 // Call it again.
1874 timedCallback();
1875 }
1876
1877 {
1878 // Still present -> 0.5 progress.
1879 ASSERT_EQ(storageId, mTimedQueue->mId);
1880 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1881 const auto timedCallback = mTimedQueue->mWhat;
1882 mTimedQueue->clearJob(storageId);
1883
1884 // Fully loaded but readlogs collection enabled.
1885 mIncFs->countFilledBlocksFullyLoaded();
1886 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1887
1888 // Call it again.
1889 timedCallback();
1890 }
1891
1892 {
1893 // Still present -> fully loaded + readlogs.
1894 ASSERT_EQ(storageId, mTimedQueue->mId);
1895 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
1896 const auto timedCallback = mTimedQueue->mWhat;
1897 mTimedQueue->clearJob(storageId);
1898
1899 // Now disable readlogs.
1900 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1901
1902 // Call it again.
1903 timedCallback();
1904 }
1905
1906 // No callbacks anymore -> fully loaded and no readlogs.
1907 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
1908}
1909
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001910TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
1911 const auto invalidStorageId = 100;
1912 android::os::PersistableBundle result{};
1913 mIncrementalService->getMetrics(invalidStorageId, &result);
1914 int64_t expected = -1, value = -1;
1915 ASSERT_FALSE(
1916 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
1917 .c_str()),
1918 &value));
1919 ASSERT_EQ(expected, value);
1920 ASSERT_TRUE(result.empty());
1921}
1922
1923TEST_F(IncrementalServiceTest, testNoMetrics) {
1924 mVold->setIncFsMountOptionsSuccess();
1925 TemporaryDir tempDir;
1926 int storageId =
1927 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1928 IncrementalService::CreateOptions::CreateNew);
1929 ASSERT_GE(storageId, 0);
1930 android::os::PersistableBundle result{};
1931 mIncrementalService->getMetrics(storageId, &result);
1932 int64_t expected = -1, value = -1;
1933 ASSERT_FALSE(
1934 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
1935 .c_str()),
1936 &value));
1937 ASSERT_EQ(expected, value);
1938 ASSERT_EQ(0, (int)result.size());
1939}
1940
1941TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
1942 mVold->setIncFsMountOptionsSuccess();
1943 TemporaryDir tempDir;
1944 int storageId =
1945 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1946 IncrementalService::CreateOptions::CreateNew);
1947 ASSERT_GE(storageId, 0);
1948 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1949 {}, {}));
1950 android::os::PersistableBundle result{};
1951 mIncrementalService->getMetrics(storageId, &result);
1952 int64_t expected = -1, value = -1;
1953 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
1954 ASSERT_EQ(expected, value);
1955 ASSERT_EQ(1, (int)result.size());
1956}
1957
Songchun Fan3c82a302019-11-29 14:23:45 -08001958} // namespace android::os::incremental