blob: e6d487255eff6ef3e87eb13ed5fa1a5850c74a11 [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));
382 MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800383 MOCK_CONST_METHOD3(link,
Songchun Fan374f7652020-08-20 08:40:29 -0700384 ErrorCode(const Control& control, std::string_view from,
385 std::string_view to));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800386 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700387 MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700388 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700389 MOCK_CONST_METHOD3(reserveSpace,
390 ErrorCode(const Control& control, std::string_view path, 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 Zubrytskyi629051fd2020-04-17 23:13:47 -0700397
Yurii Zubrytskyi65fc38a2021-03-17 13:18:30 -0700398 MockIncFs() {
399 ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
400 ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
401 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800402
403 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
404 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Songchun Fan374f7652020-08-20 08:40:29 -0700405
406 void countFilledBlocksSuccess() {
407 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
408 }
409
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700410 void countFilledBlocksFullyLoaded() {
411 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
412 }
413
Songchun Fan374f7652020-08-20 08:40:29 -0700414 void countFilledBlocksFails() {
415 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
416 }
417
418 void countFilledBlocksEmpty() {
419 ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
420 }
421
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700422 void openMountSuccess() {
423 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
424 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700425
426 // 1000ms
427 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700428 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700429 .WillByDefault(
430 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
431 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
432 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
433 return android::incfs::WaitResult::HaveData;
434 }));
435 }
436
437 void waitForPendingReadsTimeout() {
438 ON_CALL(*this, waitForPendingReads(_, _, _))
439 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700440 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700441
442 static constexpr auto kPendingReadsFd = 42;
443 Control openMountForHealth(std::string_view) {
Yurii Zubrytskyi5f692922020-12-08 07:35:24 -0800444 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700445 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700446
Songchun Fan20d6ef22020-03-03 09:47:15 -0800447 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800448 metadata::Mount m;
449 m.mutable_storage()->set_id(100);
450 m.mutable_loader()->set_package_name("com.test");
451 m.mutable_loader()->set_arguments("com.uri");
452 const auto metadata = m.SerializeAsString();
453 m.mutable_loader()->release_arguments();
454 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800455 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800456 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800457 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800458 metadata::Storage st;
459 st.set_id(100);
460 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800461 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800462 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800463 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800464 metadata::BindPoint bp;
465 std::string destPath = "dest";
466 std::string srcPath = "src";
467 bp.set_storage_id(100);
468 bp.set_allocated_dest_path(&destPath);
469 bp.set_allocated_source_subdir(&srcPath);
470 const auto metadata = bp.SerializeAsString();
471 bp.release_source_subdir();
472 bp.release_dest_path();
473 return std::vector<char>(metadata.begin(), metadata.end());
474 }
475};
476
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700477class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700478public:
479 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700480 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700481 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
482
483 void checkPermissionSuccess() {
484 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
485 }
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -0800486 void checkPermissionNoCrossUsers() {
487 ON_CALL(*this,
488 checkPermission("android.permission.LOADER_USAGE_STATS",
489 "android:loader_usage_stats", _))
490 .WillByDefault(Return(android::incremental::Ok()));
491 ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
492 .WillByDefault(
493 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
494 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700495 void checkPermissionFails() {
496 ON_CALL(*this, checkPermission(_, _, _))
497 .WillByDefault(
498 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
499 }
500 void initializeStartWatchingMode() {
501 ON_CALL(*this, startWatchingMode(_, _, _))
502 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
503 }
504 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
505 mStoredCallback = cb;
506 }
507
508 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700509};
510
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700511class MockJniWrapper : public JniWrapper {
512public:
513 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
514
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700515 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700516};
517
518class MockLooperWrapper : public LooperWrapper {
519public:
520 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
521 MOCK_METHOD1(removeFd, int(int));
522 MOCK_METHOD0(wake, void());
523 MOCK_METHOD1(pollAll, int(int));
524
525 MockLooperWrapper() {
526 ON_CALL(*this, addFd(_, _, _, _, _))
527 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
528 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700529 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700530 }
531
532 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
533 mCallback = callback;
534 mCallbackData = data;
535 return 0;
536 }
537
538 int clearCallback(int) {
539 mCallback = nullptr;
540 mCallbackData = nullptr;
541 return 0;
542 }
543
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700544 int wait10Ms(int) {
545 // This is called from a loop in runCmdLooper.
546 // Sleeping for 10ms only to avoid busy looping.
547 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700548 return 0;
549 }
550
551 android::Looper_callbackFunc mCallback = nullptr;
552 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700553};
554
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700555class MockTimedQueueWrapper : public TimedQueueWrapper {
556public:
557 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
558 MOCK_METHOD1(removeJobs, void(MountId));
559 MOCK_METHOD0(stop, void());
560
561 MockTimedQueueWrapper() {
562 ON_CALL(*this, addJob(_, _, _))
563 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
564 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
565 }
566
567 void storeJob(MountId id, Milliseconds after, Job what) {
568 mId = id;
569 mAfter = after;
570 mWhat = std::move(what);
571 }
572
573 void clearJob(MountId id) {
574 if (mId == id) {
575 mAfter = {};
576 mWhat = {};
577 }
578 }
579
580 MountId mId = -1;
581 Milliseconds mAfter;
582 Job mWhat;
583};
584
Songchun Fan374f7652020-08-20 08:40:29 -0700585class MockFsWrapper : public FsWrapper {
586public:
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800587 MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
588 void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
Songchun Fan374f7652020-08-20 08:40:29 -0700589 void hasFiles() {
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800590 ON_CALL(*this, listFilesRecursive(_, _))
Songchun Fan374f7652020-08-20 08:40:29 -0700591 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
592 }
Yurii Zubrytskyi3fde5722021-02-19 00:08:36 -0800593 void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
594 for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
595 if (!onFile(file)) break;
596 }
Songchun Fan374f7652020-08-20 08:40:29 -0700597 }
598};
599
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800600class MockClockWrapper : public ClockWrapper {
601public:
602 MOCK_CONST_METHOD0(now, TimePoint());
603
604 void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
605 template <class Delta>
606 void advance(Delta delta) {
607 mClock += delta;
608 }
609
610 TimePoint getClock() const { return mClock; }
611
612 TimePoint mClock = Clock::now();
613};
614
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700615class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
616public:
617 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
618
619 MockStorageHealthListener() {
620 ON_CALL(*this, onHealthStatus(_, _))
621 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
622 }
623
624 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
625 mStorageId = storageId;
626 mStatus = status;
627 return binder::Status::ok();
628 }
629
630 int32_t mStorageId = -1;
631 int32_t mStatus = -1;
632};
633
Songchun Fana7098592020-09-03 11:45:53 -0700634class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
635public:
636 MockStorageLoadingProgressListener() = default;
637 MOCK_METHOD2(onStorageLoadingProgressChanged,
638 binder::Status(int32_t storageId, float progress));
639 MOCK_METHOD0(onAsBinder, IBinder*());
640};
641
Songchun Fan3c82a302019-11-29 14:23:45 -0800642class MockServiceManager : public ServiceManagerWrapper {
643public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800644 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700645 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700646 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700647 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700648 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700649 std::unique_ptr<MockLooperWrapper> looper,
Songchun Fan374f7652020-08-20 08:40:29 -0700650 std::unique_ptr<MockTimedQueueWrapper> timedQueue,
Songchun Fana7098592020-09-03 11:45:53 -0700651 std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800652 std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800653 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700654 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700655 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700656 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700657 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700658 mLooper(std::move(looper)),
Songchun Fan374f7652020-08-20 08:40:29 -0700659 mTimedQueue(std::move(timedQueue)),
Songchun Fana7098592020-09-03 11:45:53 -0700660 mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800661 mFs(std::move(fs)),
662 mClock(std::move(clock)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800663 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800664 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
665 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800666 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800667 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Songchun Fan374f7652020-08-20 08:40:29 -0700668 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
669 return std::move(mAppOpsManager);
670 }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700671 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700672 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700673 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fana7098592020-09-03 11:45:53 -0700674 std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
675 return std::move(mProgressUpdateJobQueue);
676 }
Songchun Fan374f7652020-08-20 08:40:29 -0700677 std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800678 std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800679
680private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800681 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800682 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800683 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700684 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700685 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700686 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700687 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700688 std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700689 std::unique_ptr<MockFsWrapper> mFs;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800690 std::unique_ptr<MockClockWrapper> mClock;
Songchun Fan3c82a302019-11-29 14:23:45 -0800691};
692
693// --- IncrementalServiceTest ---
694
Songchun Fan3c82a302019-11-29 14:23:45 -0800695class IncrementalServiceTest : public testing::Test {
696public:
697 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800698 auto vold = std::make_unique<NiceMock<MockVoldService>>();
699 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700700 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
701 mDataLoader = dataLoader.get();
702 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800703 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800704 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
705 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700706 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
707 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700708 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
709 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700710 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
711 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700712 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
713 mTimedQueue = timedQueue.get();
Songchun Fana7098592020-09-03 11:45:53 -0700714 auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
715 mProgressUpdateJobQueue = progressUpdateJobQueue.get();
Songchun Fan374f7652020-08-20 08:40:29 -0700716 auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
717 mFs = fs.get();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800718 auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
719 mClock = clock.get();
Songchun Fana7098592020-09-03 11:45:53 -0700720 mIncrementalService = std::make_unique<
721 IncrementalService>(MockServiceManager(std::move(vold),
722 std::move(dataloaderManager),
723 std::move(incFs), std::move(appOps),
724 std::move(jni), std::move(looper),
725 std::move(timedQueue),
726 std::move(progressUpdateJobQueue),
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800727 std::move(fs), std::move(clock)),
Songchun Fana7098592020-09-03 11:45:53 -0700728 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800729 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800730 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700731 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800732 mIncrementalService->onSystemReady();
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800733 mClock->start();
Songchun Fan374f7652020-08-20 08:40:29 -0700734 setupSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800735 }
736
737 void setUpExistingMountDir(const std::string& rootDir) {
738 const auto dir = rootDir + "/dir1";
739 const auto mountDir = dir + "/mount";
740 const auto backingDir = dir + "/backing_store";
741 const auto storageDir = mountDir + "/st0";
742 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
743 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
744 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
745 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
746 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
747 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
748 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
749 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800750 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
751 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
752 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
753 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
754 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
755 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800756 }
757
Songchun Fan374f7652020-08-20 08:40:29 -0700758 void setupSuccess() {
759 mVold->mountIncFsSuccess();
760 mIncFs->makeFileSuccess();
761 mVold->bindMountSuccess();
762 mDataLoaderManager->bindToDataLoaderSuccess();
763 mDataLoaderManager->getDataLoaderSuccess();
764 }
765
Songchun Fan1b76ccf2021-02-24 22:25:59 +0000766 void checkMillisSinceOldestPendingRead(int storageId, long expected) {
767 android::os::PersistableBundle result{};
768 mIncrementalService->getMetrics(storageId, &result);
769 int64_t value = -1;
770 ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
771 METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
772 .c_str()),
773 &value));
774 ASSERT_EQ(expected, value);
775 ASSERT_EQ(1, (int)result.size());
776 }
777
Songchun Fan3c82a302019-11-29 14:23:45 -0800778protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700779 NiceMock<MockVoldService>* mVold = nullptr;
780 NiceMock<MockIncFs>* mIncFs = nullptr;
781 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
782 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
783 NiceMock<MockJniWrapper>* mJni = nullptr;
784 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700785 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Songchun Fana7098592020-09-03 11:45:53 -0700786 NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
Songchun Fan374f7652020-08-20 08:40:29 -0700787 NiceMock<MockFsWrapper>* mFs = nullptr;
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800788 NiceMock<MockClockWrapper>* mClock = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700789 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800790 std::unique_ptr<IncrementalService> mIncrementalService;
791 TemporaryDir mRootDir;
792 DataLoaderParamsParcel mDataLoaderParcel;
793};
794
Songchun Fan3c82a302019-11-29 14:23:45 -0800795TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
796 mVold->mountIncFsFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800797 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800798 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800799 int storageId =
800 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
801 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800802 ASSERT_LT(storageId, 0);
803}
804
805TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
806 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800807 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700808 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800809 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800810 int storageId =
811 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
812 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800813 ASSERT_LT(storageId, 0);
814}
815
816TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
817 mVold->mountIncFsSuccess();
818 mIncFs->makeFileFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800819 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700820 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800821 EXPECT_CALL(*mVold, unmountIncFs(_));
822 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800823 int storageId =
824 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
825 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800826 ASSERT_LT(storageId, 0);
827}
828
829TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
830 mVold->mountIncFsSuccess();
831 mIncFs->makeFileSuccess();
832 mVold->bindMountFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800833 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700834 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800835 EXPECT_CALL(*mVold, unmountIncFs(_));
836 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800837 int storageId =
838 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
839 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800840 ASSERT_LT(storageId, 0);
841}
842
843TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
844 mVold->mountIncFsSuccess();
845 mIncFs->makeFileSuccess();
846 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700847 mDataLoaderManager->bindToDataLoaderFails();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800848 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700849 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700850 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
851 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
852 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800853 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
854 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800855 int storageId =
856 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
857 IncrementalService::CreateOptions::CreateNew);
858 ASSERT_GE(storageId, 0);
859 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800860}
861
862TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700863 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800864 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700865 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800866 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
867 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800868 int storageId =
869 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
870 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800871 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800872 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800873 mIncrementalService->deleteStorage(storageId);
874}
875
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800876TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700877 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700878 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700879 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
880 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700881 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800882 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
883 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800884 int storageId =
885 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
886 IncrementalService::CreateOptions::CreateNew);
Songchun Fan3c82a302019-11-29 14:23:45 -0800887 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -0800888 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800889
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700890 // Simulated crash/other connection breakage.
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800891
892 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
893 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700894 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
895 mDataLoaderManager->setDataLoaderStatusDestroyed();
896
897 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
898 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -0800899 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
900 mDataLoaderManager->setDataLoaderStatusDestroyed();
901
902 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
903 .WillByDefault(Invoke(mDataLoaderManager,
904 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
905 mDataLoaderManager->setDataLoaderStatusDestroyed();
906
907 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
908 .WillByDefault(Invoke(mDataLoaderManager,
909 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
910 mDataLoaderManager->setDataLoaderStatusDestroyed();
911
912 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
913 .WillByDefault(Invoke(mDataLoaderManager,
914 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
915 mDataLoaderManager->setDataLoaderStatusDestroyed();
916
917 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
918 .WillByDefault(Invoke(mDataLoaderManager,
919 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700920 mDataLoaderManager->setDataLoaderStatusDestroyed();
921}
922
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800923TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
924 mIncFs->waitForPendingReadsSuccess();
925 mIncFs->openMountSuccess();
926
927 constexpr auto bindRetryInterval = 5s;
928
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700929 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800930 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -0700931 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
932 EXPECT_CALL(*mDataLoader, start(_)).Times(7);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800933 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
934 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -0700935 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyy7e06d712021-03-09 19:24:23 -0800936 TemporaryDir tempDir;
937 int storageId =
938 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
939 IncrementalService::CreateOptions::CreateNew);
940 ASSERT_GE(storageId, 0);
941
942 // First binds to DataLoader fails... because it's restart.
943 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
944 .WillByDefault(Invoke(mDataLoaderManager,
945 &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
946
947 // Request DL start.
948 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
949
950 // Retry callback present.
951 ASSERT_EQ(storageId, mTimedQueue->mId);
952 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
953 auto retryCallback = mTimedQueue->mWhat;
954 mTimedQueue->clearJob(storageId);
955
956 // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
957 mClock->advance(5s);
958
959 retryCallback();
960 // Retry callback present.
961 ASSERT_EQ(storageId, mTimedQueue->mId);
962 ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
963 retryCallback = mTimedQueue->mWhat;
964 mTimedQueue->clearJob(storageId);
965
966 // Returning "binding" so that we can retry.
967 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
968 .WillByDefault(Invoke(mDataLoaderManager,
969 &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
970
971 // Expecting bindToDataLoaderBindingWithNoDelay call.
972 mClock->advance(5s);
973
974 retryCallback();
975 // No retry callback.
976 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
977 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
978
979 // Should not change the bindToDataLoader call count
980 ASSERT_NE(nullptr, mLooper->mCallback);
981 ASSERT_NE(nullptr, mLooper->mCallbackData);
982 auto looperCb = mLooper->mCallback;
983 auto looperCbData = mLooper->mCallbackData;
984 looperCb(-1, -1, looperCbData);
985
986 // Expecting the same bindToDataLoaderBindingWithNoDelay call.
987 mClock->advance(5s);
988
989 // Use pending reads callback to trigger binding.
990 looperCb(-1, -1, looperCbData);
991
992 // No retry callback.
993 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
994 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
995
996 // Now we are out of 10m "retry" budget, let's finally bind.
997 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
998 .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
999 mClock->advance(11min);
1000
1001 // Use pending reads callback to trigger binding.
1002 looperCb(-1, -1, looperCbData);
1003
1004 // No retry callback.
1005 ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1006 ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1007
1008 // And test the rest of the backoff.
1009 // Simulated crash/other connection breakage.
1010 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1011 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7b3e06e2021-03-23 11:29:05 -07001012 &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1013 mDataLoaderManager->setDataLoaderStatusDestroyed();
1014
1015 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1016 .WillByDefault(Invoke(mDataLoaderManager,
Alex Buynytskyy7e06d712021-03-09 19:24:23 -08001017 &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1018 mDataLoaderManager->setDataLoaderStatusDestroyed();
1019
1020 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1021 .WillByDefault(Invoke(mDataLoaderManager,
1022 &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
1023 mDataLoaderManager->setDataLoaderStatusDestroyed();
1024
1025 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1026 .WillByDefault(Invoke(mDataLoaderManager,
1027 &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
1028 mDataLoaderManager->setDataLoaderStatusDestroyed();
1029
1030 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1031 .WillByDefault(Invoke(mDataLoaderManager,
1032 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1033 mDataLoaderManager->setDataLoaderStatusDestroyed();
1034
1035 ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1036 .WillByDefault(Invoke(mDataLoaderManager,
1037 &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1038 mDataLoaderManager->setDataLoaderStatusDestroyed();
1039}
1040
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001041TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001042 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001043 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001044 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001045 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1046 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1047 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1048 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1049 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001050 int storageId =
1051 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1052 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001053 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001054 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1055 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001056 mDataLoaderManager->setDataLoaderStatusCreated();
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001057 mDataLoaderManager->setDataLoaderStatusStarted();
1058}
1059
1060TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -07001061 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001062 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001063 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001064 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001065 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1066 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1067 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1068 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001069 int storageId =
1070 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1071 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001072 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001073 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1074 {}, {}));
Alex Buynytskyy0b202662020-04-13 09:53:04 -07001075 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -08001076}
1077
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001078TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001079 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001080 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001081 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1082 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1083 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1084 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1085 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1086 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001087 int storageId =
1088 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1089 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001090 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001091 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1092 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001093 mDataLoaderManager->setDataLoaderStatusUnavailable();
1094}
1095
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001096TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1097 mDataLoader->initializeCreateOkNoStatus();
1098 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1099 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1100 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1101 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1102 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1103 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1104 TemporaryDir tempDir;
1105 int storageId =
1106 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1107 IncrementalService::CreateOptions::CreateNew);
1108 ASSERT_GE(storageId, 0);
1109 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1110 {}, {}));
1111 mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1112}
1113
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001114TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001115 mIncFs->waitForPendingReadsSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001116 mIncFs->openMountSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001117 mDataLoader->initializeCreateOkNoStatus();
Songchun Fan374f7652020-08-20 08:40:29 -07001118
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001119 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001120 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001121 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1122 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -07001123 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001124 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1125 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1126 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1127 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001128 int storageId =
1129 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1130 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001131 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001132 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1133 {}, {}));
Alex Buynytskyycca2c112020-05-05 12:48:41 -07001134 mDataLoaderManager->setDataLoaderStatusUnavailable();
1135 ASSERT_NE(nullptr, mLooper->mCallback);
1136 ASSERT_NE(nullptr, mLooper->mCallbackData);
1137 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1138}
1139
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001140TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001141 mIncFs->openMountSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001142
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001143 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001144 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1145 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1146 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1147 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1148 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1149 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1150 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001151 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001152
1153 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1154 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1155 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1156 .Times(2);
1157 EXPECT_CALL(*listenerMock,
1158 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1159 .Times(1);
1160 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1161 .Times(1);
1162 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1163 .Times(2);
1164
1165 StorageHealthCheckParams params;
1166 params.blockedTimeoutMs = 10000;
1167 params.unhealthyTimeoutMs = 20000;
1168 params.unhealthyMonitoringMs = 30000;
1169
1170 using MS = std::chrono::milliseconds;
1171 using MCS = std::chrono::microseconds;
1172
1173 const auto blockedTimeout = MS(params.blockedTimeoutMs);
1174 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1175 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1176
1177 const uint64_t kFirstTimestampUs = 1000000000ll;
1178 const uint64_t kBlockedTimestampUs =
1179 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1180 const uint64_t kUnhealthyTimestampUs =
1181 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1182
1183 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001184 int storageId =
1185 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1186 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001187 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001188 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1189 std::move(params), listener, {});
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001190
1191 // Healthy state, registered for pending reads.
1192 ASSERT_NE(nullptr, mLooper->mCallback);
1193 ASSERT_NE(nullptr, mLooper->mCallbackData);
1194 ASSERT_EQ(storageId, listener->mStorageId);
1195 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001196 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001197
1198 // Looper/epoll callback.
1199 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1200 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1201
1202 // Unregister from pending reads and wait.
1203 ASSERT_EQ(nullptr, mLooper->mCallback);
1204 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1205 ASSERT_EQ(storageId, listener->mStorageId);
1206 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1207 // Timed callback present.
1208 ASSERT_EQ(storageId, mTimedQueue->mId);
1209 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1210 auto timedCallback = mTimedQueue->mWhat;
1211 mTimedQueue->clearJob(storageId);
1212
1213 // Timed job callback for blocked.
1214 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1215 timedCallback();
1216
1217 // Still not registered, and blocked.
1218 ASSERT_EQ(nullptr, mLooper->mCallback);
1219 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1220 ASSERT_EQ(storageId, listener->mStorageId);
1221 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001222 checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
1223
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001224 // Timed callback present.
1225 ASSERT_EQ(storageId, mTimedQueue->mId);
1226 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1227 timedCallback = mTimedQueue->mWhat;
1228 mTimedQueue->clearJob(storageId);
1229
1230 // Timed job callback for unhealthy.
1231 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1232 timedCallback();
1233
1234 // Still not registered, and blocked.
1235 ASSERT_EQ(nullptr, mLooper->mCallback);
1236 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1237 ASSERT_EQ(storageId, listener->mStorageId);
1238 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001239 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1240
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001241 // Timed callback present.
1242 ASSERT_EQ(storageId, mTimedQueue->mId);
1243 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1244 timedCallback = mTimedQueue->mWhat;
1245 mTimedQueue->clearJob(storageId);
1246
1247 // One more unhealthy.
1248 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1249 timedCallback();
1250
1251 // Still not registered, and blocked.
1252 ASSERT_EQ(nullptr, mLooper->mCallback);
1253 ASSERT_EQ(nullptr, mLooper->mCallbackData);
1254 ASSERT_EQ(storageId, listener->mStorageId);
1255 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001256 checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
1257
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001258 // Timed callback present.
1259 ASSERT_EQ(storageId, mTimedQueue->mId);
1260 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1261 timedCallback = mTimedQueue->mWhat;
1262 mTimedQueue->clearJob(storageId);
1263
1264 // And now healthy.
1265 mIncFs->waitForPendingReadsTimeout();
1266 timedCallback();
1267
1268 // Healthy state, registered for pending reads.
1269 ASSERT_NE(nullptr, mLooper->mCallback);
1270 ASSERT_NE(nullptr, mLooper->mCallbackData);
1271 ASSERT_EQ(storageId, listener->mStorageId);
1272 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
Songchun Fan1b76ccf2021-02-24 22:25:59 +00001273 checkMillisSinceOldestPendingRead(storageId, 0);
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -07001274}
1275
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001276TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001277 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001278 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001279
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001280 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001281 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001282 // We are calling setIncFsMountOptions(true).
1283 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1284 // After setIncFsMountOptions succeeded expecting to start watching.
1285 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1286 // Not expecting callback removal.
1287 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001288 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001289 int storageId =
1290 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1291 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001292 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001293 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1294 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001295 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001296}
1297
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001298TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001299 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001300 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001301
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001302 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1303 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1304 // Enabling and then disabling readlogs.
1305 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1306 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1307 // After setIncFsMountOptions succeeded expecting to start watching.
1308 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1309 // Not expecting callback removal.
1310 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1311 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001312 int storageId =
1313 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1314 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001315 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001316 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1317 {}, {}));
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001318 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1319 // Now disable.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001320 mIncrementalService->disallowReadLogs(storageId);
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -07001321 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1322}
1323
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001324TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1325 mVold->setIncFsMountOptionsSuccess();
1326 mAppOpsManager->checkPermissionSuccess();
1327
1328 const auto readLogsMaxInterval = 2h;
1329
1330 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1331 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1332 // Enabling and then disabling readlogs.
1333 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(2);
1334 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1335 // After setIncFsMountOptions succeeded expecting to start watching.
1336 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1337 // Not expecting callback removal.
1338 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001339 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001340 TemporaryDir tempDir;
1341 int storageId =
1342 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1343 IncrementalService::CreateOptions::CreateNew);
1344 ASSERT_GE(storageId, 0);
1345 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1346 {}, {}));
1347
1348 // Disable readlogs callback present.
1349 ASSERT_EQ(storageId, mTimedQueue->mId);
1350 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1351 auto callback = mTimedQueue->mWhat;
1352 mTimedQueue->clearJob(storageId);
1353
1354 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1355 // Now advance clock for 1hr.
1356 mClock->advance(1h);
1357 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1358 // Now call the timed callback, it should turn off the readlogs.
1359 callback();
1360 // Now advance clock for 2hrs.
1361 mClock->advance(readLogsMaxInterval);
1362 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1363}
1364
1365TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1366 mVold->setIncFsMountOptionsSuccess();
1367 mAppOpsManager->checkPermissionSuccess();
1368
1369 const auto readLogsMaxInterval = 2h;
1370
1371 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1372 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1373 // Enabling and then disabling readlogs.
1374 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1375 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(0);
1376 // After setIncFsMountOptions succeeded expecting to start watching.
1377 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1378 // Not expecting callback removal.
1379 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001380 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001381 // System data loader.
1382 mDataLoaderParcel.packageName = "android";
1383 TemporaryDir tempDir;
1384 int storageId =
1385 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1386 IncrementalService::CreateOptions::CreateNew);
1387 ASSERT_GE(storageId, 0);
1388 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1389 {}, {}));
1390
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001391 // IfsState callback.
1392 auto callback = mTimedQueue->mWhat;
1393 mTimedQueue->clearJob(storageId);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001394
1395 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1396 // Now advance clock for 1hr.
1397 mClock->advance(1h);
1398 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1399 // Now advance clock for 2hrs.
1400 mClock->advance(readLogsMaxInterval);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001401 // IfsStorage callback should not affect anything.
1402 callback();
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001403 ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1404}
1405
1406TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1407 mVold->setIncFsMountOptionsSuccess();
1408 mAppOpsManager->checkPermissionSuccess();
1409
1410 const auto readLogsMaxInterval = 2h;
1411
1412 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1413 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1414 // Enabling and then disabling readlogs.
1415 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(3);
1416 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1417 // After setIncFsMountOptions succeeded expecting to start watching.
1418 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1419 // Not expecting callback removal.
1420 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001421 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001422 TemporaryDir tempDir;
1423 int storageId =
1424 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1425 IncrementalService::CreateOptions::CreateNew);
1426 ASSERT_GE(storageId, 0);
1427
1428 auto dataLoaderParcel = mDataLoaderParcel;
1429 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1430 {}, {}));
1431
1432 // Disable readlogs callback present.
1433 ASSERT_EQ(storageId, mTimedQueue->mId);
1434 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1435 auto callback = mTimedQueue->mWhat;
1436 mTimedQueue->clearJob(storageId);
1437
1438 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1439 // Now advance clock for 1.5hrs.
1440 mClock->advance(90min);
1441 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1442
1443 // New installation.
1444 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1445 {}, {}));
1446
1447 // New callback present.
1448 ASSERT_EQ(storageId, mTimedQueue->mId);
1449 ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1450 auto callback2 = mTimedQueue->mWhat;
1451 mTimedQueue->clearJob(storageId);
1452
1453 // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1454 callback();
1455 // Advance clock for another 1.5hrs.
1456 mClock->advance(90min);
1457 // Still success even it's 3hrs past first install.
1458 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1459
1460 // New one should disable.
1461 callback2();
1462 // And timeout.
1463 mClock->advance(90min);
1464 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1465}
1466
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001467TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001468 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001469 mAppOpsManager->checkPermissionSuccess();
1470 mAppOpsManager->initializeStartWatchingMode();
Songchun Fan374f7652020-08-20 08:40:29 -07001471
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001472 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001473 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1474 // We are calling setIncFsMountOptions(true).
1475 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1476 // setIncFsMountOptions(false) is called on the callback.
1477 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
1478 // After setIncFsMountOptions succeeded expecting to start watching.
1479 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1480 // After callback is called, disable read logs and remove callback.
1481 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1482 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001483 int storageId =
1484 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1485 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001486 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001487 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1488 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001489 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001490 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1491 mAppOpsManager->mStoredCallback->opChanged(0, {});
1492}
1493
1494TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001495 mAppOpsManager->checkPermissionFails();
Songchun Fan374f7652020-08-20 08:40:29 -07001496
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001497 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001498 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1499 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1500 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1501 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1502 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1503 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001504 int storageId =
1505 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1506 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001507 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001508 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1509 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001510 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001511}
1512
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001513TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1514 mAppOpsManager->checkPermissionNoCrossUsers();
1515
1516 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1517 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1518 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
1519 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1520 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1521 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1522 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001523 int storageId =
1524 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1525 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001526 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001527 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1528 {}, {}));
Alex Buynytskyy42d4ba42021-01-12 11:10:03 -08001529 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1530}
1531
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001532TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001533 mVold->setIncFsMountOptionsFails();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001534 mAppOpsManager->checkPermissionSuccess();
Songchun Fan374f7652020-08-20 08:40:29 -07001535
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001536 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001537 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001538 // We are calling setIncFsMountOptions.
1539 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1540 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1541 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1542 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001543 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001544 int storageId =
1545 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1546 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001547 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001548 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1549 {}, {}));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001550 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001551}
1552
Songchun Fan3c82a302019-11-29 14:23:45 -08001553TEST_F(IncrementalServiceTest, testMakeDirectory) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001554 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001555 int storageId =
1556 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1557 IncrementalService::CreateOptions::CreateNew);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001558 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001559
Songchun Fan103ba1d2020-02-03 17:32:32 -08001560 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001561 // <root>/*/mount/<storage>/test
1562 EXPECT_CALL(*mIncFs,
1563 makeDir(_, Truly([&](std::string_view arg) {
1564 return arg.starts_with(mRootDir.path) &&
1565 arg.ends_with("/mount/st_1_0/" + dir_path);
1566 }),
1567 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001568 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1569 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001570}
1571
1572TEST_F(IncrementalServiceTest, testMakeDirectories) {
Songchun Fan3c82a302019-11-29 14:23:45 -08001573 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001574 int storageId =
1575 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1576 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001577 auto first = "first"sv;
1578 auto second = "second"sv;
1579 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001580 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001581
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001582 EXPECT_CALL(*mIncFs,
1583 makeDirs(_, Truly([&](std::string_view arg) {
1584 return arg.starts_with(mRootDir.path) &&
1585 arg.ends_with("/mount/st_1_0/" + dir_path);
1586 }),
1587 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001588 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001589 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001590}
Songchun Fan374f7652020-08-20 08:40:29 -07001591
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001592TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001593 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001594 int storageId =
1595 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1596 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001597 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1598 .Times(1)
1599 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1600 ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001601}
1602
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001603TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001604 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001605 int storageId =
1606 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1607 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001608 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1609 .Times(1)
1610 .WillOnce(Return(incfs::LoadingState(-1)));
1611 ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001612}
1613
1614TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001615 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001616 int storageId =
1617 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1618 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi256a1a42021-03-18 14:21:54 -07001619 EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, _))
1620 .Times(1)
1621 .WillOnce(Return(incfs::LoadingState::Full));
1622 ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -07001623}
1624
Songchun Fan425862f2020-08-25 13:12:16 -07001625TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
Songchun Fan374f7652020-08-20 08:40:29 -07001626 mIncFs->countFilledBlocksSuccess();
1627 mFs->hasNoFile();
1628
1629 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001630 int storageId =
1631 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1632 IncrementalService::CreateOptions::CreateNew);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001633 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001634}
1635
1636TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1637 mIncFs->countFilledBlocksFails();
1638 mFs->hasFiles();
1639
1640 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001641 int storageId =
1642 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1643 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001644 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001645 ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001646}
1647
Songchun Fan425862f2020-08-25 13:12:16 -07001648TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
Songchun Fan374f7652020-08-20 08:40:29 -07001649 mIncFs->countFilledBlocksEmpty();
1650 mFs->hasFiles();
1651
1652 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001653 int storageId =
1654 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1655 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001656 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001657 ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001658}
1659
1660TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1661 mIncFs->countFilledBlocksSuccess();
1662 mFs->hasFiles();
1663
1664 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001665 int storageId =
1666 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1667 IncrementalService::CreateOptions::CreateNew);
Songchun Fan374f7652020-08-20 08:40:29 -07001668 EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001669 ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
Songchun Fan374f7652020-08-20 08:40:29 -07001670}
Songchun Fana7098592020-09-03 11:45:53 -07001671
1672TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1673 mIncFs->countFilledBlocksSuccess();
1674 mFs->hasFiles();
1675
1676 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001677 int storageId =
1678 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1679 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001680 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1681 new NiceMock<MockStorageLoadingProgressListener>};
1682 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1683 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1684 EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1685 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1686 // Timed callback present.
1687 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1688 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1689 auto timedCallback = mProgressUpdateJobQueue->mWhat;
1690 timedCallback();
1691 ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1692 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1693 mIncrementalService->unregisterLoadingProgressListener(storageId);
1694 ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1695}
1696
1697TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1698 mIncFs->countFilledBlocksFails();
1699 mFs->hasFiles();
1700
1701 TemporaryDir tempDir;
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001702 int storageId =
1703 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1704 IncrementalService::CreateOptions::CreateNew);
Songchun Fana7098592020-09-03 11:45:53 -07001705 sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1706 new NiceMock<MockStorageLoadingProgressListener>};
1707 NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1708 EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1709 mIncrementalService->registerLoadingProgressListener(storageId, listener);
1710}
Songchun Fan2570ec02020-10-08 17:22:33 -07001711
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001712TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1713 mFs->hasFiles();
1714
1715 const auto stateUpdateInterval = 1s;
1716
1717 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1718 // No unbinding just yet.
1719 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1720 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1721 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1722 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1723 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1724 // System data loader to get rid of readlog timeout callback.
1725 mDataLoaderParcel.packageName = "android";
1726 TemporaryDir tempDir;
1727 int storageId =
1728 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1729 IncrementalService::CreateOptions::CreateNew);
1730 ASSERT_GE(storageId, 0);
1731 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1732 {}, {}));
1733
1734 // Started.
1735 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1736
1737 // IfsState callback present.
1738 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1739 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1740 auto callback = mTimedQueue->mWhat;
1741 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1742
1743 // Not loaded yet.
1744 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1745 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1746
1747 // Send the callback, should not do anything.
1748 callback();
1749
1750 // Still started.
1751 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1752
1753 // Still present.
1754 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1755 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1756 callback = mTimedQueue->mWhat;
1757 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1758
1759 // Fully loaded.
1760 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1761 // Expect the unbind.
1762 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1763
1764 callback();
1765
1766 // Destroyed.
1767 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1768}
1769
1770TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1771 mFs->hasFiles();
1772
1773 // Readlogs.
1774 mVold->setIncFsMountOptionsSuccess();
1775 mAppOpsManager->checkPermissionSuccess();
1776
1777 const auto stateUpdateInterval = 1s;
1778
1779 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1780 // No unbinding just yet.
1781 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1782 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1783 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1784 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1785 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1786 // System data loader to get rid of readlog timeout callback.
1787 mDataLoaderParcel.packageName = "android";
1788 TemporaryDir tempDir;
1789 int storageId =
1790 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1791 IncrementalService::CreateOptions::CreateNew);
1792 ASSERT_GE(storageId, 0);
1793 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1794 {}, {}));
1795
1796 // Started.
1797 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1798
1799 // IfsState callback present.
1800 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1801 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1802 auto callback = mTimedQueue->mWhat;
1803 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1804
1805 // Not loaded yet.
1806 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1807 .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1808
1809 // Send the callback, should not do anything.
1810 callback();
1811
1812 // Still started.
1813 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1814
1815 // Still present.
1816 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1817 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1818 callback = mTimedQueue->mWhat;
1819 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1820
1821 // Fully loaded.
1822 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1823 .WillOnce(Return(incfs::LoadingState::Full))
1824 .WillOnce(Return(incfs::LoadingState::Full));
1825 // But with readlogs.
1826 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1827
1828 // Send the callback, still nothing.
1829 callback();
1830
1831 // Still started.
1832 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1833
1834 // Still present.
1835 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
1836 ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1837 callback = mTimedQueue->mWhat;
1838 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
1839
1840 // Disable readlogs and expect the unbind.
1841 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1842 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
1843
1844 callback();
1845
1846 // Destroyed.
1847 ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1848}
1849
Songchun Fan2570ec02020-10-08 17:22:33 -07001850TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
1851 mIncFs->openMountSuccess();
1852 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1853 sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
1854 NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
1855
1856 TemporaryDir tempDir;
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001857 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001858 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1859 IncrementalService::CreateOptions::CreateNew);
Songchun Fan2570ec02020-10-08 17:22:33 -07001860 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001861 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
1862 {});
1863
Songchun Fan2570ec02020-10-08 17:22:33 -07001864 StorageHealthCheckParams newParams;
1865 newParams.blockedTimeoutMs = 10000;
1866 newParams.unhealthyTimeoutMs = 20000;
1867 newParams.unhealthyMonitoringMs = 30000;
1868 ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
1869 newListener));
1870
1871 using MS = std::chrono::milliseconds;
1872 using MCS = std::chrono::microseconds;
1873
1874 const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
1875 const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
1876
1877 const uint64_t kFirstTimestampUs = 1000000000ll;
1878 const uint64_t kBlockedTimestampUs =
1879 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1880 const uint64_t kUnhealthyTimestampUs =
1881 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1882
1883 // test that old listener was not called
1884 EXPECT_CALL(*listener.get(),
1885 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1886 .Times(0);
1887 EXPECT_CALL(*newListenerMock,
1888 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1889 .Times(1);
1890 EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1891 .Times(1);
1892 EXPECT_CALL(*newListenerMock,
1893 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
1894 .Times(1);
1895 EXPECT_CALL(*newListenerMock,
1896 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
1897 .Times(1);
1898 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1899 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1900
1901 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
1902 ASSERT_EQ(storageId, newListener->mStorageId);
1903
1904 auto timedCallback = mTimedQueue->mWhat;
1905 mTimedQueue->clearJob(storageId);
1906
1907 // test when health status is blocked with transport error
1908 mDataLoader->transportError(storageId);
1909 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1910 timedCallback();
1911 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
1912 timedCallback = mTimedQueue->mWhat;
1913 mTimedQueue->clearJob(storageId);
1914
1915 // test when health status is blocked with storage error
1916 mDataLoader->storageError(storageId);
1917 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1918 timedCallback();
1919 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
1920 timedCallback = mTimedQueue->mWhat;
1921 mTimedQueue->clearJob(storageId);
1922
1923 // test when health status is unhealthy with transport error
1924 mDataLoader->transportError(storageId);
1925 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1926 timedCallback();
1927 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
1928 mTimedQueue->clearJob(storageId);
1929}
1930
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001931static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
1932 std::initializer_list<std::tuple<int, int, int, int>> tuples) {
1933 std::vector<PerUidReadTimeouts> result;
1934 for (auto&& tuple : tuples) {
1935 result.emplace_back();
1936 auto& timeouts = result.back();
1937 timeouts.uid = std::get<0>(tuple);
1938 timeouts.minTimeUs = std::get<1>(tuple);
1939 timeouts.minPendingTimeUs = std::get<2>(tuple);
1940 timeouts.maxPendingTimeUs = std::get<3>(tuple);
1941 }
1942 return result;
1943}
1944
1945static ErrorCode checkPerUidTimeouts(const Control& control,
1946 const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1947 std::vector<PerUidReadTimeouts> expected =
1948 createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
1949 EXPECT_EQ(expected, perUidReadTimeouts);
1950 return 0;
1951}
1952
1953static ErrorCode checkPerUidTimeoutsEmpty(
1954 const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
1955 EXPECT_EQ(0u, perUidReadTimeouts.size());
1956 return 0;
1957}
1958
1959TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
Alex Buynytskyyb19ee3e2021-02-06 20:31:43 -08001960 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001961 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1962 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001963 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001964 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1965 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
Alex Buynytskyycb163f92021-03-18 21:21:27 -07001966 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001967 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1968 TemporaryDir tempDir;
1969 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001970 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1971 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001972 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08001973 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
1974 createPerUidTimeouts(
1975 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001976}
1977
1978TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
1979 mVold->setIncFsMountOptionsSuccess();
1980 mAppOpsManager->checkPermissionSuccess();
1981 mFs->hasFiles();
1982
1983 EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
1984 // First call.
1985 .WillOnce(Invoke(&checkPerUidTimeouts))
1986 // Fully loaded and no readlogs.
1987 .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
1988 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
1989
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001990 // Loading storage.
1991 EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1992 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
1993 .WillOnce(Return(incfs::LoadingState::MissingBlocks))
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07001994 .WillOnce(Return(incfs::LoadingState::Full));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001995
Alex Buynytskyyd7aa3462021-03-14 22:20:20 -07001996 // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
1997 mDataLoaderParcel.packageName = "android";
1998
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08001999 TemporaryDir tempDir;
2000 int storageId =
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002001 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2002 IncrementalService::CreateOptions::CreateNew);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002003 ASSERT_GE(storageId, 0);
Alex Buynytskyy07694ed2021-01-27 06:58:55 -08002004 mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2005 createPerUidTimeouts(
2006 {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002007
2008 {
2009 // Timed callback present -> 0 progress.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002010 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002011 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2012 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002013 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002014
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002015 // Call it again.
2016 timedCallback();
2017 }
2018
2019 {
Yurii Zubrytskyi883a27a2021-03-18 19:30:56 -07002020 // Still present -> some progress.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002021 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002022 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2023 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002024 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002025
2026 // Fully loaded but readlogs collection enabled.
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002027 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2028
2029 // Call it again.
2030 timedCallback();
2031 }
2032
2033 {
2034 // Still present -> fully loaded + readlogs.
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002035 ASSERT_EQ(IncrementalService::kMaxStorageId, mTimedQueue->mId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002036 ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2037 const auto timedCallback = mTimedQueue->mWhat;
Alex Buynytskyycb163f92021-03-18 21:21:27 -07002038 mTimedQueue->clearJob(IncrementalService::kMaxStorageId);
Alex Buynytskyyaa8e95e2020-12-14 21:50:04 -08002039
2040 // Now disable readlogs.
2041 ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2042
2043 // Call it again.
2044 timedCallback();
2045 }
2046
2047 // No callbacks anymore -> fully loaded and no readlogs.
2048 ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2049}
2050
Songchun Fan1b76ccf2021-02-24 22:25:59 +00002051TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2052 const auto invalidStorageId = 100;
2053 android::os::PersistableBundle result{};
2054 mIncrementalService->getMetrics(invalidStorageId, &result);
2055 int64_t expected = -1, value = -1;
2056 ASSERT_FALSE(
2057 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2058 .c_str()),
2059 &value));
2060 ASSERT_EQ(expected, value);
2061 ASSERT_TRUE(result.empty());
2062}
2063
2064TEST_F(IncrementalServiceTest, testNoMetrics) {
2065 mVold->setIncFsMountOptionsSuccess();
2066 TemporaryDir tempDir;
2067 int storageId =
2068 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2069 IncrementalService::CreateOptions::CreateNew);
2070 ASSERT_GE(storageId, 0);
2071 android::os::PersistableBundle result{};
2072 mIncrementalService->getMetrics(storageId, &result);
2073 int64_t expected = -1, value = -1;
2074 ASSERT_FALSE(
2075 result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2076 .c_str()),
2077 &value));
2078 ASSERT_EQ(expected, value);
2079 ASSERT_EQ(0, (int)result.size());
2080}
2081
2082TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2083 mVold->setIncFsMountOptionsSuccess();
2084 TemporaryDir tempDir;
2085 int storageId =
2086 mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2087 IncrementalService::CreateOptions::CreateNew);
2088 ASSERT_GE(storageId, 0);
2089 ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2090 {}, {}));
2091 android::os::PersistableBundle result{};
2092 mIncrementalService->getMetrics(storageId, &result);
2093 int64_t expected = -1, value = -1;
2094 ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2095 ASSERT_EQ(expected, value);
2096 ASSERT_EQ(1, (int)result.size());
2097}
2098
Songchun Fan3c82a302019-11-29 14:23:45 -08002099} // namespace android::os::incremental