blob: ddb778462df5abd0c746001b1e891acbf06fd1d5 [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/file.h>
18#include <android-base/logging.h>
19#include <android-base/unique_fd.h>
20#include <binder/ParcelFileDescriptor.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <utils/Log.h>
Songchun Fan1b76ccf2021-02-24 22:25:59 +000024#include <utils/String16.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080025
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -070026#include <chrono>
Songchun Fan3c82a302019-11-29 14:23:45 -080027#include <future>
28
29#include "IncrementalService.h"
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070030#include "IncrementalServiceValidation.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080031#include "Metadata.pb.h"
32#include "ServiceWrappers.h"
33
34using namespace testing;
35using namespace android::incremental;
36using namespace std::literals;
37using testing::_;
38using testing::Invoke;
39using testing::NiceMock;
40
41#undef LOG_TAG
42#define LOG_TAG "IncrementalServiceTest"
43
44using namespace android::incfs;
45using namespace android::content::pm;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -080046using PerUidReadTimeouts = android::os::incremental::PerUidReadTimeouts;
Songchun Fan3c82a302019-11-29 14:23:45 -080047
48namespace android::os::incremental {
49
50class MockVoldService : public VoldServiceWrapper {
51public:
52 MOCK_CONST_METHOD4(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080053 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080054 int32_t flags,
55 IncrementalFileSystemControlParcel* _aidl_return));
56 MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
57 MOCK_CONST_METHOD2(bindMount,
58 binder::Status(const std::string& sourceDir, const std::string& argetDir));
Songchun Fan374f7652020-08-20 08:40:29 -070059 MOCK_CONST_METHOD2(
60 setIncFsMountOptions,
61 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
62 bool));
Songchun Fan3c82a302019-11-29 14:23:45 -080063
64 void mountIncFsFails() {
65 ON_CALL(*this, mountIncFs(_, _, _, _))
66 .WillByDefault(
67 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68 }
69 void mountIncFsInvalidControlParcel() {
70 ON_CALL(*this, mountIncFs(_, _, _, _))
71 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72 }
73 void mountIncFsSuccess() {
74 ON_CALL(*this, mountIncFs(_, _, _, _))
75 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
76 }
77 void bindMountFails() {
78 ON_CALL(*this, bindMount(_, _))
79 .WillByDefault(Return(
80 binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
81 }
82 void bindMountSuccess() {
83 ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
84 }
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070085 void setIncFsMountOptionsFails() const {
86 ON_CALL(*this, setIncFsMountOptions(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -070087 .WillByDefault(Return(
88 binder::Status::fromExceptionCode(1, String8("failed to set options"))));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070089 }
90 void setIncFsMountOptionsSuccess() {
91 ON_CALL(*this, setIncFsMountOptions(_, _)).WillByDefault(Return(binder::Status::ok()));
92 }
Songchun Fan3c82a302019-11-29 14:23:45 -080093 binder::Status getInvalidControlParcel(const std::string& imagePath,
94 const std::string& targetDir, int32_t flags,
95 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080096 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080097 return binder::Status::ok();
98 }
99 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
100 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800101 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
102 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
103 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800104 return binder::Status::ok();
105 }
106
107private:
108 TemporaryFile cmdFile;
109 TemporaryFile logFile;
Songchun Fan3c82a302019-11-29 14:23:45 -0800110};
111
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700112class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800113public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700114 MockDataLoader() {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700115 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
116 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
117 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
118 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
119 ON_CALL(*this, prepareImage(_, _, _))
120 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700121 }
Songchun Fan68645c42020-02-27 15:57:35 -0800122 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700123 MOCK_METHOD4(create,
124 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
125 const FileSystemControlParcel& control,
126 const sp<IDataLoaderStatusListener>& listener));
127 MOCK_METHOD1(start, binder::Status(int32_t id));
128 MOCK_METHOD1(stop, binder::Status(int32_t id));
129 MOCK_METHOD1(destroy, binder::Status(int32_t id));
130 MOCK_METHOD3(prepareImage,
131 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
132 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700133
134 void initializeCreateOkNoStatus() {
135 ON_CALL(*this, create(_, _, _, _))
136 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
137 }
138
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700139 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
140 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700141 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700142 createOkNoStatus(id, params, control, listener);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700143 reportStatus(id);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700144 return binder::Status::ok();
145 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700146 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
147 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700148 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700149 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700150 mListener = listener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700151 mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700152 return binder::Status::ok();
153 }
154 binder::Status startOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700155 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700156 return binder::Status::ok();
157 }
158 binder::Status stopOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700159 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700160 return binder::Status::ok();
161 }
162 binder::Status destroyOk(int32_t id) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700163 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700164 mListener = nullptr;
165 return binder::Status::ok();
166 }
167 binder::Status prepareImageOk(int32_t id,
168 const ::std::vector<content::pm::InstallationFileParcel>&,
169 const ::std::vector<::std::string>&) {
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700170 setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700171 return binder::Status::ok();
172 }
Songchun Fan2570ec02020-10-08 17:22:33 -0700173 binder::Status storageError(int32_t id) {
174 if (mListener) {
175 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
176 }
177 return binder::Status::ok();
178 }
179 binder::Status transportError(int32_t id) {
180 if (mListener) {
181 mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
182 }
183 return binder::Status::ok();
184 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700185 int32_t setStorageParams(bool enableReadLogs) {
186 int32_t result = -1;
187 EXPECT_NE(mServiceConnector.get(), nullptr);
188 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
189 return result;
190 }
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700191 int status() const { return mStatus; }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700192
193private:
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700194 void setAndReportStatus(int id, int status) {
195 mStatus = status;
196 reportStatus(id);
197 }
198 void reportStatus(int id) {
199 if (mListener) {
200 mListener->onStatusChanged(id, mStatus);
201 }
202 }
203
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700204 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700205 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700206 int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Songchun Fan68645c42020-02-27 15:57:35 -0800207};
208
209class MockDataLoaderManager : public DataLoaderManagerWrapper {
210public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700211 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
212 EXPECT_TRUE(mDataLoaderHolder != nullptr);
213 }
214
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800215 MOCK_CONST_METHOD5(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800216 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800217 int bindDelayMs,
Songchun Fan3c82a302019-11-29 14:23:45 -0800218 const sp<IDataLoaderStatusListener>& listener,
219 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800220 MOCK_CONST_METHOD2(getDataLoader,
221 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700222 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800223
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700224 void bindToDataLoaderSuccess() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800225 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700226 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700227 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 void bindToDataLoaderFails() {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800229 ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700230 .WillByDefault(Return(
231 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
232 }
233 void getDataLoaderSuccess() {
234 ON_CALL(*this, getDataLoader(_, _))
235 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
236 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700237 void unbindFromDataLoaderSuccess() {
238 ON_CALL(*this, unbindFromDataLoader(_))
239 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700240 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700241 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800242 int bindDelayMs,
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700243 const sp<IDataLoaderStatusListener>& listener,
244 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800245 mId = mountId;
246 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700247 mDataLoader = mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800248 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700249 if (mListener) {
250 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
251 }
252 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800253 }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800254 binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
255 const DataLoaderParamsParcel& params,
256 int bindDelayMs,
257 const sp<IDataLoaderStatusListener>& listener,
258 bool* _aidl_return) {
259 CHECK(bindDelayMs == 0) << bindDelayMs;
260 *_aidl_return = false;
261 return binder::Status::ok();
262 }
263 binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
264 const DataLoaderParamsParcel& params,
265 int bindDelayMs,
266 const sp<IDataLoaderStatusListener>& listener,
267 bool* _aidl_return) {
268 CHECK(bindDelayMs == 0) << bindDelayMs;
269 *_aidl_return = true;
270 if (listener) {
271 listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
272 }
273 return binder::Status::ok();
274 }
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700275 binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
276 const DataLoaderParamsParcel& params,
277 int bindDelayMs,
278 const sp<IDataLoaderStatusListener>& listener,
279 bool* _aidl_return) {
280 CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
281 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
282 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800283 binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
284 const DataLoaderParamsParcel& params,
285 int bindDelayMs,
286 const sp<IDataLoaderStatusListener>& listener,
287 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700288 CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800289 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
290 }
291 binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
292 const DataLoaderParamsParcel& params,
293 int bindDelayMs,
294 const sp<IDataLoaderStatusListener>& listener,
295 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700296 CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800297 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
298 }
299 binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
300 const DataLoaderParamsParcel& params,
301 int bindDelayMs,
302 const sp<IDataLoaderStatusListener>& listener,
303 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700304 CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
305 << bindDelayMs;
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800306 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
307 }
308 binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
309 const DataLoaderParamsParcel& params,
310 int bindDelayMs,
311 const sp<IDataLoaderStatusListener>& listener,
312 bool* _aidl_return) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700313 CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800314 << bindDelayMs;
315 return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
316 }
317
Songchun Fan68645c42020-02-27 15:57:35 -0800318 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
319 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800320 return binder::Status::ok();
321 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700322 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800323 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800324 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700325 void setDataLoaderStatusStarted() {
326 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
327 }
328 void setDataLoaderStatusDestroyed() {
329 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
330 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700331 void setDataLoaderStatusUnavailable() {
332 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
333 }
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800334 void setDataLoaderStatusUnrecoverable() {
335 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
336 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700337 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700338 if (mDataLoader) {
339 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
340 return status;
341 }
342 mDataLoader = nullptr;
343 }
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700344 if (mListener) {
345 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
346 }
347 return binder::Status::ok();
348 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700349
Songchun Fan3c82a302019-11-29 14:23:45 -0800350private:
351 int mId;
352 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700353 sp<IDataLoader> mDataLoader;
354 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800355};
356
357class MockIncFs : public IncFsWrapper {
358public:
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800359 MOCK_CONST_METHOD0(features, Features());
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700360 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
361 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800362 MOCK_CONST_METHOD4(createControl,
363 Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
364 IncFsFd blocksWritten));
Songchun Fan3c82a302019-11-29 14:23:45 -0800365 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800366 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800367 NewFileParams params));
Yurii Zubrytskyia5946f72021-02-17 14:24:14 -0800368 MOCK_CONST_METHOD4(makeMappedFile,
369 ErrorCode(const Control& control, std::string_view path, int mode,
370 NewMappedFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800371 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700372 MOCK_CONST_METHOD3(makeDirs,
373 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800374 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
375 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
376 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Songchun Fan374f7652020-08-20 08:40:29 -0700377 MOCK_CONST_METHOD2(countFilledBlocks,
378 std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
379 std::string_view path));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700380 MOCK_CONST_METHOD2(isFileFullyLoaded,
381 incfs::LoadingState(const Control& control, std::string_view path));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700382 MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -0700383 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800384 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700385 ErrorCode(const Control& control, std::string_view from,
386 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800387 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700388 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700389 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700390 MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700391 MOCK_CONST_METHOD3(waitForPendingReads,
392 WaitResult(const Control& control, std::chrono::milliseconds timeout,
393 std::vector<incfs::ReadInfo>* pendingReadsBuffer));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -0800394 MOCK_CONST_METHOD2(setUidReadTimeouts,
395 ErrorCode(const Control& control,
396 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -0700397 MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
398 MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700399
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700400 MockIncFs() {
401 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
402 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
403 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800404
405 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
406 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700407
408 void countFilledBlocksSuccess() {
409 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
410 }
411
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700412 void countFilledBlocksFullyLoaded() {
413 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
414 }
415
Songchun Fan374f7652020-08-20 08:40:29 -0700416 void countFilledBlocksFails() {
417 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
418 }
419
420 void countFilledBlocksEmpty() {
421 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
422 }
423
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700424 void openMountSuccess() {
425 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
426 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700427
428 // 1000ms
429 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700430 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700431 .WillByDefault(
432 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
433 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
434 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
435 return android::incfs::WaitResult::HaveData;
436 }));
437 }
438
439 void waitForPendingReadsTimeout() {
440 ON_CALL(*this, waitForPendingReads(_, _, _))
441 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700442 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700443
444 static constexpr auto kPendingReadsFd = 42;
445 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800446 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700447 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700448
Songchun Fan20d6ef22020-03-03 09:47:15 -0800449 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800450 metadata::Mount m;
451 m.mutable_storage()->set_id(100);
452 m.mutable_loader()->set_package_name("com.test");
453 m.mutable_loader()->set_arguments("com.uri");
454 const auto metadata = m.SerializeAsString();
455 m.mutable_loader()->release_arguments();
456 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800457 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800458 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800459 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800460 metadata::Storage st;
461 st.set_id(100);
462 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800463 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800464 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800465 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800466 metadata::BindPoint bp;
467 std::string destPath = "dest";
468 std::string srcPath = "src";
469 bp.set_storage_id(100);
470 bp.set_allocated_dest_path(&destPath);
471 bp.set_allocated_source_subdir(&srcPath);
472 const auto metadata = bp.SerializeAsString();
473 bp.release_source_subdir();
474 bp.release_dest_path();
475 return std::vector<char>(metadata.begin(), metadata.end());
476 }
477};
478
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700479class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700480public:
481 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700482 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700483 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
484
485 void checkPermissionSuccess() {
486 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
487 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800488 void checkPermissionNoCrossUsers() {
489 ON_CALL(*this,
490 checkPermission("android.permission.LOADER_USAGE_STATS",
491 "android:loader_usage_stats", _))
492 .WillByDefault(Return(android::incremental::Ok()));
493 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
494 .WillByDefault(
495 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
496 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700497 void checkPermissionFails() {
498 ON_CALL(*this, checkPermission(_, _, _))
499 .WillByDefault(
500 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
501 }
502 void initializeStartWatchingMode() {
503 ON_CALL(*this, startWatchingMode(_, _, _))
504 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
505 }
506 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
507 mStoredCallback = cb;
508 }
509
510 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700511};
512
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700513class MockJniWrapper : public JniWrapper {
514public:
515 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
516
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700517 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700518};
519
520class MockLooperWrapper : public LooperWrapper {
521public:
522 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
523 MOCK_METHOD1(removeFd, int(int));
524 MOCK_METHOD0(wake, void());
525 MOCK_METHOD1(pollAll, int(int));
526
527 MockLooperWrapper() {
528 ON_CALL(*this, addFd(_, _, _, _, _))
529 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
530 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700531 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700532 }
533
534 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
535 mCallback = callback;
536 mCallbackData = data;
537 return 0;
538 }
539
540 int clearCallback(int) {
541 mCallback = nullptr;
542 mCallbackData = nullptr;
543 return 0;
544 }
545
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700546 int wait10Ms(int) {
547 // This is called from a loop in runCmdLooper.
548 // Sleeping for 10ms only to avoid busy looping.
549 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700550 return 0;
551 }
552
553 android::Looper_callbackFunc mCallback = nullptr;
554 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700555};
556
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700557class MockTimedQueueWrapper : public TimedQueueWrapper {
558public:
559 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
560 MOCK_METHOD1(removeJobs, void(MountId));
561 MOCK_METHOD0(stop, void());
562
563 MockTimedQueueWrapper() {
564 ON_CALL(*this, addJob(_, _, _))
565 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
566 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
567 }
568
569 void storeJob(MountId id, Milliseconds after, Job what) {
570 mId = id;
571 mAfter = after;
572 mWhat = std::move(what);
573 }
574
575 void clearJob(MountId id) {
576 if (mId == id) {
577 mAfter = {};
578 mWhat = {};
579 }
580 }
581
582 MountId mId = -1;
583 Milliseconds mAfter;
584 Job mWhat;
585};
586
Songchun Fan374f7652020-08-20 08:40:29 -0700587class MockFsWrapper : public FsWrapper {
588public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800589 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
590 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700591 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800592 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700593 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
594 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800595 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
596 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
597 if (!onFile(file)) break;
598 }
Songchun Fan374f7652020-08-20 08:40:29 -0700599 }
600};
601
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800602class MockClockWrapper : public ClockWrapper {
603public:
604 MOCK_CONST_METHOD0(now, TimePoint());
605
606 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
607 template <class Delta>
608 void advance(Delta delta) {
609 mClock += delta;
610 }
611
612 TimePoint getClock() const { return mClock; }
613
614 TimePoint mClock = Clock::now();
615};
616
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700617class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
618public:
619 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
620
621 MockStorageHealthListener() {
622 ON_CALL(*this, onHealthStatus(_, _))
623 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
624 }
625
626 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
627 mStorageId = storageId;
628 mStatus = status;
629 return binder::Status::ok();
630 }
631
632 int32_t mStorageId = -1;
633 int32_t mStatus = -1;
634};
635
Songchun Fana7098592020-09-03 11:45:53 -0700636class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
637public:
638 MockStorageLoadingProgressListener() = default;
639 MOCK_METHOD2(onStorageLoadingProgressChanged,
640 binder::Status(int32_t storageId, float progress));
641 MOCK_METHOD0(onAsBinder, IBinder*());
642};
643
Songchun Fan3c82a302019-11-29 14:23:45 -0800644class MockServiceManager : public ServiceManagerWrapper {
645public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800646 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700647 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700648 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700649 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700650 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700651 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700652 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700653 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800654 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800655 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700656 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700657 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700658 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700659 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700660 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700661 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700662 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800663 mFs(std::move(fs)),
664 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800665 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800666 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
667 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800668 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800669 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700670 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
671 return std::move(mAppOpsManager);
672 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700673 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700674 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700675 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700676 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
677 return std::move(mProgressUpdateJobQueue);
678 }
Songchun Fan374f7652020-08-20 08:40:29 -0700679 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800680 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800681
682private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800683 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800684 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800685 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700686 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700687 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700688 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700689 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700690 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700691 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800692 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800693};
694
695// --- IncrementalServiceTest ---
696
Songchun Fan3c82a302019-11-29 14:23:45 -0800697class IncrementalServiceTest : public testing::Test {
698public:
699 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800700 auto vold = std::make_unique<NiceMock<MockVoldService>>();
701 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700702 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
703 mDataLoader = dataLoader.get();
704 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800705 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800706 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
707 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700708 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
709 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700710 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
711 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700712 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
713 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700714 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
715 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700716 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
717 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700718 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
719 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800720 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
721 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700722 mIncrementalService = std::make_unique<
723 IncrementalService>(MockServiceManager(std::move(vold),
724 std::move(dataloaderManager),
725 std::move(incFs), std::move(appOps),
726 std::move(jni), std::move(looper),
727 std::move(timedQueue),
728 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800729 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700730 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800731 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800732 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700733 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800734 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800735 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700736 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800737 }
738
739 void setUpExistingMountDir(const std::string& rootDir) {
740 const auto dir = rootDir + "/dir1";
741 const auto mountDir = dir + "/mount";
742 const auto backingDir = dir + "/backing_store";
743 const auto storageDir = mountDir + "/st0";
744 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
745 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
746 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
747 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
748 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
749 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
750 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
751 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800752 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
753 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
754 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
755 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
756 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
757 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800758 }
759
Songchun Fan374f7652020-08-20 08:40:29 -0700760 void setupSuccess() {
761 mVold->mountIncFsSuccess();
762 mIncFs->makeFileSuccess();
763 mVold->bindMountSuccess();
764 mDataLoaderManager->bindToDataLoaderSuccess();
765 mDataLoaderManager->getDataLoaderSuccess();
766 }
767
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000768 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
769 android::os::PersistableBundle result{};
770 mIncrementalService->getMetrics(storageId, &result);
771 int64_t value = -1;
772 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
773 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
774 .c_str()),
775 &value));
776 ASSERT_EQ(expected, value);
777 ASSERT_EQ(1, (int)result.size());
778 }
779
Songchun Fan3c82a302019-11-29 14:23:45 -0800780protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700781 NiceMock<MockVoldService>* mVold = nullptr;
782 NiceMock<MockIncFs>* mIncFs = nullptr;
783 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
784 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
785 NiceMock<MockJniWrapper>* mJni = nullptr;
786 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700787 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700788 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700789 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800790 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700791 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800792 std::unique_ptr<IncrementalService> mIncrementalService;
793 TemporaryDir mRootDir;
794 DataLoaderParamsParcel mDataLoaderParcel;
795};
796
Songchun Fan3c82a302019-11-29 14:23:45 -0800797TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
798 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800799 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800800 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800801 int storageId =
802 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
803 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800804 ASSERT_LT(storageId, 0);
805}
806
807TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
808 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800809 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700810 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800811 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800812 int storageId =
813 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
814 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800815 ASSERT_LT(storageId, 0);
816}
817
818TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
819 mVold->mountIncFsSuccess();
820 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800821 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700822 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800823 EXPECT_CALL(*mVold, unmountIncFs(_));
824 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800825 int storageId =
826 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
827 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800828 ASSERT_LT(storageId, 0);
829}
830
831TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
832 mVold->mountIncFsSuccess();
833 mIncFs->makeFileSuccess();
834 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800835 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700836 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800837 EXPECT_CALL(*mVold, unmountIncFs(_));
838 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800839 int storageId =
840 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
841 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800842 ASSERT_LT(storageId, 0);
843}
844
845TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
846 mVold->mountIncFsSuccess();
847 mIncFs->makeFileSuccess();
848 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700849 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800850 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700851 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700852 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
853 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
854 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800855 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
856 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800857 int storageId =
858 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
859 IncrementalService::CreateOptions::CreateNew);
860 ASSERT_GE(storageId, 0);
861 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800862}
863
864TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700865 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800866 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
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), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800875 mIncrementalService->deleteStorage(storageId);
876}
877
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800878TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700879 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700880 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700881 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
882 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700883 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800884 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
885 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800886 int storageId =
887 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
888 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800889 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800890 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800891
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700892 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800893
894 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
895 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700896 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
897 mDataLoaderManager->setDataLoaderStatusDestroyed();
898
899 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
900 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800901 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
902 mDataLoaderManager->setDataLoaderStatusDestroyed();
903
904 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
905 .WillByDefault(Invoke(mDataLoaderManager,
906 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
907 mDataLoaderManager->setDataLoaderStatusDestroyed();
908
909 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
910 .WillByDefault(Invoke(mDataLoaderManager,
911 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
912 mDataLoaderManager->setDataLoaderStatusDestroyed();
913
914 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
915 .WillByDefault(Invoke(mDataLoaderManager,
916 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
917 mDataLoaderManager->setDataLoaderStatusDestroyed();
918
919 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
920 .WillByDefault(Invoke(mDataLoaderManager,
921 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700922 mDataLoaderManager->setDataLoaderStatusDestroyed();
923}
924
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800925TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
926 mIncFs->waitForPendingReadsSuccess();
927 mIncFs->openMountSuccess();
928
929 constexpr auto bindRetryInterval = 5s;
930
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700931 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800932 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700933 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
934 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800935 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
936 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700937 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800938 TemporaryDir tempDir;
939 int storageId =
940 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
941 IncrementalService::CreateOptions::CreateNew);
942 ASSERT_GE(storageId, 0);
943
944 // First binds to DataLoader fails... because it's restart.
945 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
946 .WillByDefault(Invoke(mDataLoaderManager,
947 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
948
949 // Request DL start.
950 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
951
952 // Retry callback present.
953 ASSERT_EQ(storageId, mTimedQueue->mId);
954 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
955 auto retryCallback = mTimedQueue->mWhat;
956 mTimedQueue->clearJob(storageId);
957
958 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
959 mClock->advance(5s);
960
961 retryCallback();
962 // Retry callback present.
963 ASSERT_EQ(storageId, mTimedQueue->mId);
964 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
965 retryCallback = mTimedQueue->mWhat;
966 mTimedQueue->clearJob(storageId);
967
968 // Returning "binding" so that we can retry.
969 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
970 .WillByDefault(Invoke(mDataLoaderManager,
971 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
972
973 // Expecting bindToDataLoaderBindingWithNoDelay call.
974 mClock->advance(5s);
975
976 retryCallback();
977 // No retry callback.
978 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
979 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
980
981 // Should not change the bindToDataLoader call count
982 ASSERT_NE(nullptr, mLooper->mCallback);
983 ASSERT_NE(nullptr, mLooper->mCallbackData);
984 auto looperCb = mLooper->mCallback;
985 auto looperCbData = mLooper->mCallbackData;
986 looperCb(-1, -1, looperCbData);
987
988 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
989 mClock->advance(5s);
990
991 // Use pending reads callback to trigger binding.
992 looperCb(-1, -1, looperCbData);
993
994 // No retry callback.
995 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
996 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
997
998 // Now we are out of 10m "retry" budget, let's finally bind.
999 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1000 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1001 mClock->advance(11min);
1002
1003 // Use pending reads callback to trigger binding.
1004 looperCb(-1, -1, looperCbData);
1005
1006 // No retry callback.
1007 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1008 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1009
1010 // And test the rest of the backoff.
1011 // Simulated crash/other connection breakage.
1012 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1013 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001014 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1015 mDataLoaderManager->setDataLoaderStatusDestroyed();
1016
1017 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1018 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001019 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1020 mDataLoaderManager->setDataLoaderStatusDestroyed();
1021
1022 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1023 .WillByDefault(Invoke(mDataLoaderManager,
1024 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
1025 mDataLoaderManager->setDataLoaderStatusDestroyed();
1026
1027 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1028 .WillByDefault(Invoke(mDataLoaderManager,
1029 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
1030 mDataLoaderManager->setDataLoaderStatusDestroyed();
1031
1032 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1033 .WillByDefault(Invoke(mDataLoaderManager,
1034 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1035 mDataLoaderManager->setDataLoaderStatusDestroyed();
1036
1037 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1038 .WillByDefault(Invoke(mDataLoaderManager,
1039 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1040 mDataLoaderManager->setDataLoaderStatusDestroyed();
1041}
1042
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001043TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001044 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001045 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001046 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001047 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1048 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1049 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1050 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1051 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001052 int storageId =
1053 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1054 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001055 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001056 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1057 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001058 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001059 mDataLoaderManager->setDataLoaderStatusStarted();
1060}
1061
1062TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001063 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001064 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001065 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001066 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001067 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1068 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1069 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1070 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001071 int storageId =
1072 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1073 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001074 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001075 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1076 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001077 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001078}
1079
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001080TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001081 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001082 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001083 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1084 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1085 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1086 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1087 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1088 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001089 int storageId =
1090 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1091 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001092 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001093 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1094 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001095 mDataLoaderManager->setDataLoaderStatusUnavailable();
1096}
1097
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001098TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1099 mDataLoader->initializeCreateOkNoStatus();
1100 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1101 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1102 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1103 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1104 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1105 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1106 TemporaryDir tempDir;
1107 int storageId =
1108 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1109 IncrementalService::CreateOptions::CreateNew);
1110 ASSERT_GE(storageId, 0);
1111 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1112 {}, {}));
1113 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1114}
1115
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001116TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001117 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001118 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001119 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001120
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001121 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001122 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001123 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1124 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001125 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001126 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1127 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1128 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1129 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001130 int storageId =
1131 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1132 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001133 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001134 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1135 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001136 mDataLoaderManager->setDataLoaderStatusUnavailable();
1137 ASSERT_NE(nullptr, mLooper->mCallback);
1138 ASSERT_NE(nullptr, mLooper->mCallbackData);
1139 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1140}
1141
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001142TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001143 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001144
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001145 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001146 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1147 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1148 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1149 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1150 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1151 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1152 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001153 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001154
1155 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1156 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1157 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1158 .Times(2);
1159 EXPECT_CALL(*listenerMock,
1160 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1161 .Times(1);
1162 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1163 .Times(1);
1164 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1165 .Times(2);
1166
1167 StorageHealthCheckParams params;
1168 params.blockedTimeoutMs = 10000;
1169 params.unhealthyTimeoutMs = 20000;
1170 params.unhealthyMonitoringMs = 30000;
1171
1172 using MS = std::chrono::milliseconds;
1173 using MCS = std::chrono::microseconds;
1174
1175 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1176 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1177 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1178
1179 const uint64_t kFirstTimestampUs = 1000000000ll;
1180 const uint64_t kBlockedTimestampUs =
1181 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1182 const uint64_t kUnhealthyTimestampUs =
1183 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1184
1185 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001186 int storageId =
1187 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1188 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001189 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001190 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1191 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001192
1193 // Healthy state, registered for pending reads.
1194 ASSERT_NE(nullptr, mLooper->mCallback);
1195 ASSERT_NE(nullptr, mLooper->mCallbackData);
1196 ASSERT_EQ(storageId, listener->mStorageId);
1197 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001198 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001199
1200 // Looper/epoll callback.
1201 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1202 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1203
1204 // Unregister from pending reads and wait.
1205 ASSERT_EQ(nullptr, mLooper->mCallback);
1206 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1207 ASSERT_EQ(storageId, listener->mStorageId);
1208 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1209 // Timed callback present.
1210 ASSERT_EQ(storageId, mTimedQueue->mId);
1211 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1212 auto timedCallback = mTimedQueue->mWhat;
1213 mTimedQueue->clearJob(storageId);
1214
1215 // Timed job callback for blocked.
1216 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1217 timedCallback();
1218
1219 // Still not registered, and blocked.
1220 ASSERT_EQ(nullptr, mLooper->mCallback);
1221 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1222 ASSERT_EQ(storageId, listener->mStorageId);
1223 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001224 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1225
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001226 // Timed callback present.
1227 ASSERT_EQ(storageId, mTimedQueue->mId);
1228 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1229 timedCallback = mTimedQueue->mWhat;
1230 mTimedQueue->clearJob(storageId);
1231
1232 // Timed job callback for unhealthy.
1233 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1234 timedCallback();
1235
1236 // Still not registered, and blocked.
1237 ASSERT_EQ(nullptr, mLooper->mCallback);
1238 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1239 ASSERT_EQ(storageId, listener->mStorageId);
1240 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001241 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1242
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001243 // Timed callback present.
1244 ASSERT_EQ(storageId, mTimedQueue->mId);
1245 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1246 timedCallback = mTimedQueue->mWhat;
1247 mTimedQueue->clearJob(storageId);
1248
1249 // One more unhealthy.
1250 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1251 timedCallback();
1252
1253 // Still not registered, and blocked.
1254 ASSERT_EQ(nullptr, mLooper->mCallback);
1255 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1256 ASSERT_EQ(storageId, listener->mStorageId);
1257 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001258 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1259
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001260 // Timed callback present.
1261 ASSERT_EQ(storageId, mTimedQueue->mId);
1262 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1263 timedCallback = mTimedQueue->mWhat;
1264 mTimedQueue->clearJob(storageId);
1265
1266 // And now healthy.
1267 mIncFs->waitForPendingReadsTimeout();
1268 timedCallback();
1269
1270 // Healthy state, registered for pending reads.
1271 ASSERT_NE(nullptr, mLooper->mCallback);
1272 ASSERT_NE(nullptr, mLooper->mCallbackData);
1273 ASSERT_EQ(storageId, listener->mStorageId);
1274 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001275 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001276}
1277
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001278TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001279 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001280 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001281
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001282 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001283 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001284 // We are calling setIncFsMountOptions(true).
1285 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1286 // After setIncFsMountOptions succeeded expecting to start watching.
1287 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1288 // Not expecting callback removal.
1289 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001290 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001291 int storageId =
1292 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1293 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001294 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001295 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1296 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001297 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001298}
1299
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001300TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001301 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001302 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001303
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001304 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1305 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1306 // Enabling and then disabling readlogs.
1307 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1308 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1309 // After setIncFsMountOptions succeeded expecting to start watching.
1310 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1311 // Not expecting callback removal.
1312 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1313 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001314 int storageId =
1315 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1316 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001317 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001318 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1319 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001320 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1321 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001322 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001323 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1324}
1325
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001326TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1327 mVold->setIncFsMountOptionsSuccess();
1328 mAppOpsManager->checkPermissionSuccess();
1329
1330 const auto readLogsMaxInterval = 2h;
1331
1332 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1333 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1334 // Enabling and then disabling readlogs.
1335 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
1336 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1337 // After setIncFsMountOptions succeeded expecting to start watching.
1338 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1339 // Not expecting callback removal.
1340 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001341 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001342 TemporaryDir tempDir;
1343 int storageId =
1344 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1345 IncrementalService::CreateOptions::CreateNew);
1346 ASSERT_GE(storageId, 0);
1347 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1348 {}, {}));
1349
1350 // Disable readlogs callback present.
1351 ASSERT_EQ(storageId, mTimedQueue->mId);
1352 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1353 auto callback = mTimedQueue->mWhat;
1354 mTimedQueue->clearJob(storageId);
1355
1356 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1357 // Now advance clock for 1hr.
1358 mClock->advance(1h);
1359 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1360 // Now call the timed callback, it should turn off the readlogs.
1361 callback();
1362 // Now advance clock for 2hrs.
1363 mClock->advance(readLogsMaxInterval);
1364 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1365}
1366
1367TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1368 mVold->setIncFsMountOptionsSuccess();
1369 mAppOpsManager->checkPermissionSuccess();
1370
1371 const auto readLogsMaxInterval = 2h;
1372
1373 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1374 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1375 // Enabling and then disabling readlogs.
1376 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1377 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
1378 // After setIncFsMountOptions succeeded expecting to start watching.
1379 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1380 // Not expecting callback removal.
1381 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001382 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001383 // System data loader.
1384 mDataLoaderParcel.packageName = "android";
1385 TemporaryDir tempDir;
1386 int storageId =
1387 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1388 IncrementalService::CreateOptions::CreateNew);
1389 ASSERT_GE(storageId, 0);
1390 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1391 {}, {}));
1392
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001393 // IfsState callback.
1394 auto callback = mTimedQueue->mWhat;
1395 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001396
1397 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1398 // Now advance clock for 1hr.
1399 mClock->advance(1h);
1400 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1401 // Now advance clock for 2hrs.
1402 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001403 // IfsStorage callback should not affect anything.
1404 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001405 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1406}
1407
1408TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1409 mVold->setIncFsMountOptionsSuccess();
1410 mAppOpsManager->checkPermissionSuccess();
1411
1412 const auto readLogsMaxInterval = 2h;
1413
1414 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1415 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1416 // Enabling and then disabling readlogs.
1417 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1418 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1419 // After setIncFsMountOptions succeeded expecting to start watching.
1420 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1421 // Not expecting callback removal.
1422 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001423 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001424 TemporaryDir tempDir;
1425 int storageId =
1426 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1427 IncrementalService::CreateOptions::CreateNew);
1428 ASSERT_GE(storageId, 0);
1429
1430 auto dataLoaderParcel = mDataLoaderParcel;
1431 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1432 {}, {}));
1433
1434 // Disable readlogs callback present.
1435 ASSERT_EQ(storageId, mTimedQueue->mId);
1436 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1437 auto callback = mTimedQueue->mWhat;
1438 mTimedQueue->clearJob(storageId);
1439
1440 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1441 // Now advance clock for 1.5hrs.
1442 mClock->advance(90min);
1443 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1444
1445 // New installation.
1446 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1447 {}, {}));
1448
1449 // New callback present.
1450 ASSERT_EQ(storageId, mTimedQueue->mId);
1451 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1452 auto callback2 = mTimedQueue->mWhat;
1453 mTimedQueue->clearJob(storageId);
1454
1455 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1456 callback();
1457 // Advance clock for another 1.5hrs.
1458 mClock->advance(90min);
1459 // Still success even it's 3hrs past first install.
1460 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1461
1462 // New one should disable.
1463 callback2();
1464 // And timeout.
1465 mClock->advance(90min);
1466 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1467}
1468
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001469TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001470 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001471 mAppOpsManager->checkPermissionSuccess();
1472 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001473
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001474 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001475 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1476 // We are calling setIncFsMountOptions(true).
1477 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1478 // setIncFsMountOptions(false) is called on the callback.
1479 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1480 // After setIncFsMountOptions succeeded expecting to start watching.
1481 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1482 // After callback is called, disable read logs and remove callback.
1483 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1484 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001485 int storageId =
1486 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1487 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001488 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001489 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1490 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001491 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001492 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1493 mAppOpsManager->mStoredCallback->opChanged(0, {});
1494}
1495
1496TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001497 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001498
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001499 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001500 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1501 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1502 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1503 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1504 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1505 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001506 int storageId =
1507 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1508 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001509 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001510 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1511 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001512 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001513}
1514
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001515TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1516 mAppOpsManager->checkPermissionNoCrossUsers();
1517
1518 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1519 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1520 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1521 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1522 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1523 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1524 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001525 int storageId =
1526 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1527 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001528 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001529 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1530 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001531 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1532}
1533
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001534TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001535 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001536 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001537
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001538 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001539 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001540 // We are calling setIncFsMountOptions.
1541 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1542 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1543 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1544 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001545 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001546 int storageId =
1547 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1548 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001549 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001550 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1551 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001552 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001553}
1554
Songchun Fan3c82a302019-11-29 14:23:45 -08001555TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001556 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001557 int storageId =
1558 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1559 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001560 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001561
Songchun Fan103ba1d2020-02-03 17:32:32 -08001562 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001563 // <root>/*/mount/<storage>/test
1564 EXPECT_CALL(*mIncFs,
1565 makeDir(_, Truly([&](std::string_view arg) {
1566 return arg.starts_with(mRootDir.path) &&
1567 arg.ends_with("/mount/st_1_0/" + dir_path);
1568 }),
1569 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001570 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1571 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001572}
1573
1574TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001575 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001576 int storageId =
1577 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1578 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001579 auto first = "first"sv;
1580 auto second = "second"sv;
1581 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001582 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001583
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001584 EXPECT_CALL(*mIncFs,
1585 makeDirs(_, Truly([&](std::string_view arg) {
1586 return arg.starts_with(mRootDir.path) &&
1587 arg.ends_with("/mount/st_1_0/" + dir_path);
1588 }),
1589 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001590 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001591 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001592}
Songchun Fan374f7652020-08-20 08:40:29 -07001593
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001594TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001595 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001596 int storageId =
1597 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1598 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001599 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001600 .Times(1)
1601 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1602 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001603}
1604
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001605TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001606 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001607 int storageId =
1608 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1609 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001610 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001611 .Times(1)
1612 .WillOnce(Return(incfs::LoadingState(-1)));
1613 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001614}
1615
1616TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001617 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001618 int storageId =
1619 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1620 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4cd24922021-03-24 00:46:29 -07001621 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001622 .Times(1)
1623 .WillOnce(Return(incfs::LoadingState::Full));
1624 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001625}
1626
Songchun Fan425862f2020-08-25 13:12:16 -07001627TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001628 mIncFs->countFilledBlocksSuccess();
1629 mFs->hasNoFile();
1630
1631 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001632 int storageId =
1633 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1634 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001635 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001636}
1637
1638TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1639 mIncFs->countFilledBlocksFails();
1640 mFs->hasFiles();
1641
1642 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001643 int storageId =
1644 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1645 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001646 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001647 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001648}
1649
Songchun Fan425862f2020-08-25 13:12:16 -07001650TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001651 mIncFs->countFilledBlocksEmpty();
1652 mFs->hasFiles();
1653
1654 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001655 int storageId =
1656 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1657 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001658 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001659 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001660}
1661
1662TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1663 mIncFs->countFilledBlocksSuccess();
1664 mFs->hasFiles();
1665
1666 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001667 int storageId =
1668 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1669 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001670 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001671 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001672}
Songchun Fana7098592020-09-03 11:45:53 -07001673
1674TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1675 mIncFs->countFilledBlocksSuccess();
1676 mFs->hasFiles();
1677
1678 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001679 int storageId =
1680 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1681 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001682 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1683 new NiceMock<MockStorageLoadingProgressListener>};
1684 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1685 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1686 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1687 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1688 // Timed callback present.
1689 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1690 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1691 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1692 timedCallback();
1693 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1694 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1695 mIncrementalService->unregisterLoadingProgressListener(storageId);
1696 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1697}
1698
1699TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1700 mIncFs->countFilledBlocksFails();
1701 mFs->hasFiles();
1702
1703 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001704 int storageId =
1705 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1706 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001707 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1708 new NiceMock<MockStorageLoadingProgressListener>};
1709 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1710 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1711 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1712}
Songchun Fan2570ec02020-10-08 17:22:33 -07001713
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001714TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1715 mFs->hasFiles();
1716
1717 const auto stateUpdateInterval = 1s;
1718
1719 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1720 // No unbinding just yet.
1721 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1722 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1723 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1724 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1725 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1726 // System data loader to get rid of readlog timeout callback.
1727 mDataLoaderParcel.packageName = "android";
1728 TemporaryDir tempDir;
1729 int storageId =
1730 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1731 IncrementalService::CreateOptions::CreateNew);
1732 ASSERT_GE(storageId, 0);
1733 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1734 {}, {}));
1735
1736 // Started.
1737 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1738
1739 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001740 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001741 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1742 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001743 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001744
1745 // Not loaded yet.
1746 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1747 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1748
1749 // Send the callback, should not do anything.
1750 callback();
1751
1752 // Still started.
1753 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1754
1755 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001756 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001757 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1758 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001759 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001760
1761 // Fully loaded.
1762 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1763 // Expect the unbind.
1764 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1765
1766 callback();
1767
1768 // Destroyed.
1769 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1770}
1771
1772TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1773 mFs->hasFiles();
1774
1775 // Readlogs.
1776 mVold->setIncFsMountOptionsSuccess();
1777 mAppOpsManager->checkPermissionSuccess();
1778
1779 const auto stateUpdateInterval = 1s;
1780
1781 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1782 // No unbinding just yet.
1783 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1784 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1785 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1786 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1787 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1788 // System data loader to get rid of readlog timeout callback.
1789 mDataLoaderParcel.packageName = "android";
1790 TemporaryDir tempDir;
1791 int storageId =
1792 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1793 IncrementalService::CreateOptions::CreateNew);
1794 ASSERT_GE(storageId, 0);
1795 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1796 {}, {}));
1797
1798 // Started.
1799 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1800
1801 // IfsState callback present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001802 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001803 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1804 auto callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001805 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001806
1807 // Not loaded yet.
1808 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1809 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1810
1811 // Send the callback, should not do anything.
1812 callback();
1813
1814 // Still started.
1815 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1816
1817 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001818 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001819 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1820 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001821 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001822
1823 // Fully loaded.
1824 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1825 .WillOnce(Return(incfs::LoadingState::Full))
1826 .WillOnce(Return(incfs::LoadingState::Full));
1827 // But with readlogs.
1828 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1829
1830 // Send the callback, still nothing.
1831 callback();
1832
1833 // Still started.
1834 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1835
1836 // Still present.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001837 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001838 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1839 callback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07001840 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001841
1842 // Disable readlogs and expect the unbind.
1843 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1844 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1845
1846 callback();
1847
1848 // Destroyed.
1849 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1850}
1851
Songchun Fan2570ec02020-10-08 17:22:33 -07001852TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1853 mIncFs->openMountSuccess();
1854 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1855 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1856 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1857
1858 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001859 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001860 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1861 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001862 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001863 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1864 {});
1865
Songchun Fan2570ec02020-10-08 17:22:33 -07001866 StorageHealthCheckParams newParams;
1867 newParams.blockedTimeoutMs = 10000;
1868 newParams.unhealthyTimeoutMs = 20000;
1869 newParams.unhealthyMonitoringMs = 30000;
1870 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1871 newListener));
1872
1873 using MS = std::chrono::milliseconds;
1874 using MCS = std::chrono::microseconds;
1875
1876 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1877 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1878
1879 const uint64_t kFirstTimestampUs = 1000000000ll;
1880 const uint64_t kBlockedTimestampUs =
1881 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1882 const uint64_t kUnhealthyTimestampUs =
1883 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1884
1885 // test that old listener was not called
1886 EXPECT_CALL(*listener.get(),
1887 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1888 .Times(0);
1889 EXPECT_CALL(*newListenerMock,
1890 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1891 .Times(1);
1892 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1893 .Times(1);
1894 EXPECT_CALL(*newListenerMock,
1895 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1896 .Times(1);
1897 EXPECT_CALL(*newListenerMock,
1898 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1899 .Times(1);
1900 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1901 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1902
1903 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1904 ASSERT_EQ(storageId, newListener->mStorageId);
1905
1906 auto timedCallback = mTimedQueue->mWhat;
1907 mTimedQueue->clearJob(storageId);
1908
1909 // test when health status is blocked with transport error
1910 mDataLoader->transportError(storageId);
1911 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1912 timedCallback();
1913 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1914 timedCallback = mTimedQueue->mWhat;
1915 mTimedQueue->clearJob(storageId);
1916
1917 // test when health status is blocked with storage error
1918 mDataLoader->storageError(storageId);
1919 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1920 timedCallback();
1921 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1922 timedCallback = mTimedQueue->mWhat;
1923 mTimedQueue->clearJob(storageId);
1924
1925 // test when health status is unhealthy with transport error
1926 mDataLoader->transportError(storageId);
1927 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1928 timedCallback();
1929 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1930 mTimedQueue->clearJob(storageId);
1931}
1932
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001933static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1934 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1935 std::vector<PerUidReadTimeouts> result;
1936 for (auto&& tuple : tuples) {
1937 result.emplace_back();
1938 auto& timeouts = result.back();
1939 timeouts.uid = std::get<0>(tuple);
1940 timeouts.minTimeUs = std::get<1>(tuple);
1941 timeouts.minPendingTimeUs = std::get<2>(tuple);
1942 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1943 }
1944 return result;
1945}
1946
1947static ErrorCode checkPerUidTimeouts(const Control& control,
1948 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1949 std::vector<PerUidReadTimeouts> expected =
1950 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1951 EXPECT_EQ(expected, perUidReadTimeouts);
1952 return 0;
1953}
1954
1955static ErrorCode checkPerUidTimeoutsEmpty(
1956 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1957 EXPECT_EQ(0u, perUidReadTimeouts.size());
1958 return 0;
1959}
1960
1961TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001962 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001963 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1964 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001965 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001966 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1967 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001968 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001969 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1970 TemporaryDir tempDir;
1971 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001972 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1973 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001974 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001975 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1976 createPerUidTimeouts(
1977 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001978}
1979
1980TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
1981 mVold->setIncFsMountOptionsSuccess();
1982 mAppOpsManager->checkPermissionSuccess();
1983 mFs->hasFiles();
1984
1985 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
1986 // First call.
1987 .WillOnce(Invoke(&checkPerUidTimeouts))
1988 // Fully loaded and no readlogs.
1989 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
1990 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
1991
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001992 // Loading storage.
1993 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1994 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
1995 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001996 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001997
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001998 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
1999 mDataLoaderParcel.packageName = "android";
2000
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002001 TemporaryDir tempDir;
2002 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002003 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2004 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002005 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002006 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2007 createPerUidTimeouts(
2008 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002009
2010 {
2011 // Timed callback present -> 0 progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002012 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002013 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2014 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002015 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002016
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002017 // Call it again.
2018 timedCallback();
2019 }
2020
2021 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002022 // Still present -> some progress.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002023 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002024 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2025 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002026 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002027
2028 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002029 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2030
2031 // Call it again.
2032 timedCallback();
2033 }
2034
2035 {
2036 // Still present -> fully loaded + readlogs.
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002037 ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002038 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2039 const auto timedCallback = mTimedQueue->mWhat;
Yurii Zubrytskyi9acc9ac2021-03-24 00:48:24 -07002040 mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002041
2042 // Now disable readlogs.
2043 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2044
2045 // Call it again.
2046 timedCallback();
2047 }
2048
2049 // No callbacks anymore -> fully loaded and no readlogs.
2050 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2051}
2052
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002053TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2054 const auto invalidStorageId = 100;
2055 android::os::PersistableBundle result{};
2056 mIncrementalService->getMetrics(invalidStorageId, &result);
2057 int64_t expected = -1, value = -1;
2058 ASSERT_FALSE(
2059 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2060 .c_str()),
2061 &value));
2062 ASSERT_EQ(expected, value);
2063 ASSERT_TRUE(result.empty());
2064}
2065
2066TEST_F(IncrementalServiceTest, testNoMetrics) {
2067 mVold->setIncFsMountOptionsSuccess();
2068 TemporaryDir tempDir;
2069 int storageId =
2070 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2071 IncrementalService::CreateOptions::CreateNew);
2072 ASSERT_GE(storageId, 0);
2073 android::os::PersistableBundle result{};
2074 mIncrementalService->getMetrics(storageId, &result);
2075 int64_t expected = -1, value = -1;
2076 ASSERT_FALSE(
2077 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2078 .c_str()),
2079 &value));
2080 ASSERT_EQ(expected, value);
2081 ASSERT_EQ(0, (int)result.size());
2082}
2083
2084TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2085 mVold->setIncFsMountOptionsSuccess();
2086 TemporaryDir tempDir;
2087 int storageId =
2088 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2089 IncrementalService::CreateOptions::CreateNew);
2090 ASSERT_GE(storageId, 0);
2091 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2092 {}, {}));
2093 android::os::PersistableBundle result{};
2094 mIncrementalService->getMetrics(storageId, &result);
2095 int64_t expected = -1, value = -1;
2096 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2097 ASSERT_EQ(expected, value);
2098 ASSERT_EQ(1, (int)result.size());
2099}
2100
Songchun Fan3c82a302019-11-29 14:23:45 -08002101} // namespace android::os::incremental