blob: 1ae9e256c9f4916467abaef32e9b7a3ff30ddae6 [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>
24
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -070025#include <chrono>
Songchun Fan3c82a302019-11-29 14:23:45 -080026#include <future>
27
28#include "IncrementalService.h"
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070029#include "IncrementalServiceValidation.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080030#include "Metadata.pb.h"
31#include "ServiceWrappers.h"
32
33using namespace testing;
34using namespace android::incremental;
35using namespace std::literals;
36using testing::_;
37using testing::Invoke;
38using testing::NiceMock;
39
40#undef LOG_TAG
41#define LOG_TAG "IncrementalServiceTest"
42
43using namespace android::incfs;
44using namespace android::content::pm;
45
46namespace android::os::incremental {
47
48class MockVoldService : public VoldServiceWrapper {
49public:
50 MOCK_CONST_METHOD4(mountIncFs,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080051 binder::Status(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080052 int32_t flags,
53 IncrementalFileSystemControlParcel* _aidl_return));
54 MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
55 MOCK_CONST_METHOD2(bindMount,
56 binder::Status(const std::string& sourceDir, const std::string& argetDir));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070057 MOCK_CONST_METHOD2(setIncFsMountOptions,
58 binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&, bool));
Songchun Fan3c82a302019-11-29 14:23:45 -080059
60 void mountIncFsFails() {
61 ON_CALL(*this, mountIncFs(_, _, _, _))
62 .WillByDefault(
63 Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
64 }
65 void mountIncFsInvalidControlParcel() {
66 ON_CALL(*this, mountIncFs(_, _, _, _))
67 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
68 }
69 void mountIncFsSuccess() {
70 ON_CALL(*this, mountIncFs(_, _, _, _))
71 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
72 }
73 void bindMountFails() {
74 ON_CALL(*this, bindMount(_, _))
75 .WillByDefault(Return(
76 binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
77 }
78 void bindMountSuccess() {
79 ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
80 }
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070081 void setIncFsMountOptionsFails() const {
82 ON_CALL(*this, setIncFsMountOptions(_, _))
83 .WillByDefault(
84 Return(binder::Status::fromExceptionCode(1, String8("failed to set options"))));
85 }
86 void setIncFsMountOptionsSuccess() {
87 ON_CALL(*this, setIncFsMountOptions(_, _)).WillByDefault(Return(binder::Status::ok()));
88 }
Songchun Fan3c82a302019-11-29 14:23:45 -080089 binder::Status getInvalidControlParcel(const std::string& imagePath,
90 const std::string& targetDir, int32_t flags,
91 IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080092 _aidl_return = {};
Songchun Fan3c82a302019-11-29 14:23:45 -080093 return binder::Status::ok();
94 }
95 binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
96 int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080097 _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
98 _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
99 _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
Songchun Fan3c82a302019-11-29 14:23:45 -0800100 return binder::Status::ok();
101 }
102
103private:
104 TemporaryFile cmdFile;
105 TemporaryFile logFile;
Songchun Fan3c82a302019-11-29 14:23:45 -0800106};
107
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700108class MockDataLoader : public IDataLoader {
Songchun Fan3c82a302019-11-29 14:23:45 -0800109public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700110 MockDataLoader() {
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700111 ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
112 ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
113 ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
114 ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
115 ON_CALL(*this, prepareImage(_, _, _))
116 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700117 }
Songchun Fan68645c42020-02-27 15:57:35 -0800118 IBinder* onAsBinder() override { return nullptr; }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700119 MOCK_METHOD4(create,
120 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
121 const FileSystemControlParcel& control,
122 const sp<IDataLoaderStatusListener>& listener));
123 MOCK_METHOD1(start, binder::Status(int32_t id));
124 MOCK_METHOD1(stop, binder::Status(int32_t id));
125 MOCK_METHOD1(destroy, binder::Status(int32_t id));
126 MOCK_METHOD3(prepareImage,
127 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
128 const std::vector<std::string>& removedFiles));
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700129
130 void initializeCreateOkNoStatus() {
131 ON_CALL(*this, create(_, _, _, _))
132 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
133 }
134
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700135 binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
136 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700137 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700138 createOkNoStatus(id, params, control, listener);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700139 if (mListener) {
140 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_CREATED);
141 }
142 return binder::Status::ok();
143 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700144 binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
145 const content::pm::FileSystemControlParcel& control,
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700146 const sp<content::pm::IDataLoaderStatusListener>& listener) {
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700147 mServiceConnector = control.service;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700148 mListener = listener;
149 return binder::Status::ok();
150 }
151 binder::Status startOk(int32_t id) {
152 if (mListener) {
153 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
154 }
155 return binder::Status::ok();
156 }
157 binder::Status stopOk(int32_t id) {
158 if (mListener) {
159 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
160 }
161 return binder::Status::ok();
162 }
163 binder::Status destroyOk(int32_t id) {
164 if (mListener) {
165 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
166 }
167 mListener = nullptr;
168 return binder::Status::ok();
169 }
170 binder::Status prepareImageOk(int32_t id,
171 const ::std::vector<content::pm::InstallationFileParcel>&,
172 const ::std::vector<::std::string>&) {
173 if (mListener) {
174 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
175 }
176 return binder::Status::ok();
177 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700178 int32_t setStorageParams(bool enableReadLogs) {
179 int32_t result = -1;
180 EXPECT_NE(mServiceConnector.get(), nullptr);
181 EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
182 return result;
183 }
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700184
185private:
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700186 sp<IIncrementalServiceConnector> mServiceConnector;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700187 sp<IDataLoaderStatusListener> mListener;
Songchun Fan68645c42020-02-27 15:57:35 -0800188};
189
190class MockDataLoaderManager : public DataLoaderManagerWrapper {
191public:
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700192 MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
193 EXPECT_TRUE(mDataLoaderHolder != nullptr);
194 }
195
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700196 MOCK_CONST_METHOD4(bindToDataLoader,
Songchun Fan68645c42020-02-27 15:57:35 -0800197 binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
Songchun Fan3c82a302019-11-29 14:23:45 -0800198 const sp<IDataLoaderStatusListener>& listener,
199 bool* _aidl_return));
Songchun Fan68645c42020-02-27 15:57:35 -0800200 MOCK_CONST_METHOD2(getDataLoader,
201 binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700202 MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
Songchun Fan3c82a302019-11-29 14:23:45 -0800203
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700204 void bindToDataLoaderSuccess() {
205 ON_CALL(*this, bindToDataLoader(_, _, _, _))
206 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700207 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700208 void bindToDataLoaderFails() {
209 ON_CALL(*this, bindToDataLoader(_, _, _, _))
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700210 .WillByDefault(Return(
211 (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
212 }
213 void getDataLoaderSuccess() {
214 ON_CALL(*this, getDataLoader(_, _))
215 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
216 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700217 void unbindFromDataLoaderSuccess() {
218 ON_CALL(*this, unbindFromDataLoader(_))
219 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700220 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700221 binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
222 const sp<IDataLoaderStatusListener>& listener,
223 bool* _aidl_return) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800224 mId = mountId;
225 mListener = listener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700226 mDataLoader = mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800227 *_aidl_return = true;
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700228 if (mListener) {
229 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
230 }
231 return binder::Status::ok();
Songchun Fan3c82a302019-11-29 14:23:45 -0800232 }
Songchun Fan68645c42020-02-27 15:57:35 -0800233 binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
234 *_aidl_return = mDataLoader;
Songchun Fan3c82a302019-11-29 14:23:45 -0800235 return binder::Status::ok();
236 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700237 void setDataLoaderStatusCreated() {
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800238 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
Songchun Fan3c82a302019-11-29 14:23:45 -0800239 }
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700240 void setDataLoaderStatusStarted() {
241 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
242 }
243 void setDataLoaderStatusDestroyed() {
244 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
245 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700246 void setDataLoaderStatusUnavailable() {
247 mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
248 }
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700249 binder::Status unbindFromDataLoaderOk(int32_t id) {
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700250 if (mDataLoader) {
251 if (auto status = mDataLoader->destroy(id); !status.isOk()) {
252 return status;
253 }
254 mDataLoader = nullptr;
255 }
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700256 if (mListener) {
257 mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
258 }
259 return binder::Status::ok();
260 }
Alex Buynytskyy0a646ca2020-04-08 12:18:01 -0700261
Songchun Fan3c82a302019-11-29 14:23:45 -0800262private:
263 int mId;
264 sp<IDataLoaderStatusListener> mListener;
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700265 sp<IDataLoader> mDataLoader;
266 sp<IDataLoader> mDataLoaderHolder;
Songchun Fan3c82a302019-11-29 14:23:45 -0800267};
268
269class MockIncFs : public IncFsWrapper {
270public:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700271 MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
272 MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800273 MOCK_CONST_METHOD3(createControl, Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs));
Songchun Fan3c82a302019-11-29 14:23:45 -0800274 MOCK_CONST_METHOD5(makeFile,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800275 ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800276 NewFileParams params));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800277 MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700278 MOCK_CONST_METHOD3(makeDirs,
279 ErrorCode(const Control& control, std::string_view path, int mode));
Songchun Fan20d6ef22020-03-03 09:47:15 -0800280 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
281 MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
282 MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800283 MOCK_CONST_METHOD3(link,
Songchun Fan20d6ef22020-03-03 09:47:15 -0800284 ErrorCode(const Control& control, std::string_view from, std::string_view to));
285 MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
Yurii Zubrytskyie82cdd72020-04-01 12:19:26 -0700286 MOCK_CONST_METHOD2(openForSpecialOps, base::unique_fd(const Control& control, FileId id));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700287 MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700288 MOCK_CONST_METHOD3(waitForPendingReads,
289 WaitResult(const Control& control, std::chrono::milliseconds timeout,
290 std::vector<incfs::ReadInfo>* pendingReadsBuffer));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700291
292 MockIncFs() { ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return()); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800293
294 void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
295 void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700296 void openMountSuccess() {
297 ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
298 }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700299
300 // 1000ms
301 void waitForPendingReadsSuccess(uint64_t ts = 0) {
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700302 ON_CALL(*this, waitForPendingReads(_, _, _))
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700303 .WillByDefault(
304 Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
305 std::vector<incfs::ReadInfo>* pendingReadsBuffer) {
306 pendingReadsBuffer->push_back({.bootClockTsUs = ts});
307 return android::incfs::WaitResult::HaveData;
308 }));
309 }
310
311 void waitForPendingReadsTimeout() {
312 ON_CALL(*this, waitForPendingReads(_, _, _))
313 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700314 }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700315
316 static constexpr auto kPendingReadsFd = 42;
317 Control openMountForHealth(std::string_view) {
318 return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1));
319 }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700320
Songchun Fan20d6ef22020-03-03 09:47:15 -0800321 RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800322 metadata::Mount m;
323 m.mutable_storage()->set_id(100);
324 m.mutable_loader()->set_package_name("com.test");
325 m.mutable_loader()->set_arguments("com.uri");
326 const auto metadata = m.SerializeAsString();
327 m.mutable_loader()->release_arguments();
328 m.mutable_loader()->release_package_name();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800329 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800330 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800331 RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800332 metadata::Storage st;
333 st.set_id(100);
334 auto metadata = st.SerializeAsString();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800335 return {metadata.begin(), metadata.end()};
Songchun Fan3c82a302019-11-29 14:23:45 -0800336 }
Songchun Fan20d6ef22020-03-03 09:47:15 -0800337 RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800338 metadata::BindPoint bp;
339 std::string destPath = "dest";
340 std::string srcPath = "src";
341 bp.set_storage_id(100);
342 bp.set_allocated_dest_path(&destPath);
343 bp.set_allocated_source_subdir(&srcPath);
344 const auto metadata = bp.SerializeAsString();
345 bp.release_source_subdir();
346 bp.release_dest_path();
347 return std::vector<char>(metadata.begin(), metadata.end());
348 }
349};
350
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700351class MockAppOpsManager : public AppOpsManagerWrapper {
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700352public:
353 MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700354 MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700355 MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
356
357 void checkPermissionSuccess() {
358 ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
359 }
360 void checkPermissionFails() {
361 ON_CALL(*this, checkPermission(_, _, _))
362 .WillByDefault(
363 Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
364 }
365 void initializeStartWatchingMode() {
366 ON_CALL(*this, startWatchingMode(_, _, _))
367 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
368 }
369 void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
370 mStoredCallback = cb;
371 }
372
373 sp<IAppOpsCallback> mStoredCallback;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700374};
375
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700376class MockJniWrapper : public JniWrapper {
377public:
378 MOCK_CONST_METHOD0(initializeForCurrentThread, void());
379
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700380 MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700381};
382
383class MockLooperWrapper : public LooperWrapper {
384public:
385 MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
386 MOCK_METHOD1(removeFd, int(int));
387 MOCK_METHOD0(wake, void());
388 MOCK_METHOD1(pollAll, int(int));
389
390 MockLooperWrapper() {
391 ON_CALL(*this, addFd(_, _, _, _, _))
392 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
393 ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700394 ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700395 }
396
397 int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
398 mCallback = callback;
399 mCallbackData = data;
400 return 0;
401 }
402
403 int clearCallback(int) {
404 mCallback = nullptr;
405 mCallbackData = nullptr;
406 return 0;
407 }
408
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700409 int wait10Ms(int) {
410 // This is called from a loop in runCmdLooper.
411 // Sleeping for 10ms only to avoid busy looping.
412 std::this_thread::sleep_for(10ms);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700413 return 0;
414 }
415
416 android::Looper_callbackFunc mCallback = nullptr;
417 void* mCallbackData = nullptr;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700418};
419
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700420class MockTimedQueueWrapper : public TimedQueueWrapper {
421public:
422 MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
423 MOCK_METHOD1(removeJobs, void(MountId));
424 MOCK_METHOD0(stop, void());
425
426 MockTimedQueueWrapper() {
427 ON_CALL(*this, addJob(_, _, _))
428 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
429 ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
430 }
431
432 void storeJob(MountId id, Milliseconds after, Job what) {
433 mId = id;
434 mAfter = after;
435 mWhat = std::move(what);
436 }
437
438 void clearJob(MountId id) {
439 if (mId == id) {
440 mAfter = {};
441 mWhat = {};
442 }
443 }
444
445 MountId mId = -1;
446 Milliseconds mAfter;
447 Job mWhat;
448};
449
450class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
451public:
452 MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
453
454 MockStorageHealthListener() {
455 ON_CALL(*this, onHealthStatus(_, _))
456 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
457 }
458
459 binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
460 mStorageId = storageId;
461 mStatus = status;
462 return binder::Status::ok();
463 }
464
465 int32_t mStorageId = -1;
466 int32_t mStatus = -1;
467};
468
Songchun Fan3c82a302019-11-29 14:23:45 -0800469class MockServiceManager : public ServiceManagerWrapper {
470public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800471 MockServiceManager(std::unique_ptr<MockVoldService> vold,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700472 std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700473 std::unique_ptr<MockIncFs> incfs,
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700474 std::unique_ptr<MockAppOpsManager> appOpsManager,
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700475 std::unique_ptr<MockJniWrapper> jni,
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700476 std::unique_ptr<MockLooperWrapper> looper,
477 std::unique_ptr<MockTimedQueueWrapper> timedQueue)
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800478 : mVold(std::move(vold)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700479 mDataLoaderManager(std::move(dataLoaderManager)),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700480 mIncFs(std::move(incfs)),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700481 mAppOpsManager(std::move(appOpsManager)),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700482 mJni(std::move(jni)),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700483 mLooper(std::move(looper)),
484 mTimedQueue(std::move(timedQueue)) {}
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800485 std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
Songchun Fan68645c42020-02-27 15:57:35 -0800486 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
487 return std::move(mDataLoaderManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800488 }
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800489 std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700490 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final { return std::move(mAppOpsManager); }
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700491 std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700492 std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700493 std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
Songchun Fan3c82a302019-11-29 14:23:45 -0800494
495private:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800496 std::unique_ptr<MockVoldService> mVold;
Songchun Fan68645c42020-02-27 15:57:35 -0800497 std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800498 std::unique_ptr<MockIncFs> mIncFs;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700499 std::unique_ptr<MockAppOpsManager> mAppOpsManager;
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700500 std::unique_ptr<MockJniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700501 std::unique_ptr<MockLooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700502 std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
Songchun Fan3c82a302019-11-29 14:23:45 -0800503};
504
505// --- IncrementalServiceTest ---
506
Songchun Fan3c82a302019-11-29 14:23:45 -0800507class IncrementalServiceTest : public testing::Test {
508public:
509 void SetUp() override {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800510 auto vold = std::make_unique<NiceMock<MockVoldService>>();
511 mVold = vold.get();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700512 sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
513 mDataLoader = dataLoader.get();
514 auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
Songchun Fan68645c42020-02-27 15:57:35 -0800515 mDataLoaderManager = dataloaderManager.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800516 auto incFs = std::make_unique<NiceMock<MockIncFs>>();
517 mIncFs = incFs.get();
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700518 auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
519 mAppOpsManager = appOps.get();
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700520 auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
521 mJni = jni.get();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700522 auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
523 mLooper = looper.get();
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700524 auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
525 mTimedQueue = timedQueue.get();
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800526 mIncrementalService =
527 std::make_unique<IncrementalService>(MockServiceManager(std::move(vold),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700528 std::move(
529 dataloaderManager),
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700530 std::move(incFs),
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700531 std::move(appOps),
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700532 std::move(jni),
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700533 std::move(looper),
534 std::move(timedQueue)),
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800535 mRootDir.path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800536 mDataLoaderParcel.packageName = "com.test";
Alex Buynytskyy1ecfcec2019-12-17 12:10:41 -0800537 mDataLoaderParcel.arguments = "uri";
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700538 mDataLoaderManager->unbindFromDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -0800539 mIncrementalService->onSystemReady();
540 }
541
542 void setUpExistingMountDir(const std::string& rootDir) {
543 const auto dir = rootDir + "/dir1";
544 const auto mountDir = dir + "/mount";
545 const auto backingDir = dir + "/backing_store";
546 const auto storageDir = mountDir + "/st0";
547 ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
548 ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
549 ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
550 ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
551 const auto mountInfoFile = rootDir + "/dir1/mount/.info";
552 const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
553 ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
554 ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800555 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
556 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
557 ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
558 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
559 ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
560 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
Songchun Fan3c82a302019-11-29 14:23:45 -0800561 }
562
563protected:
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700564 NiceMock<MockVoldService>* mVold = nullptr;
565 NiceMock<MockIncFs>* mIncFs = nullptr;
566 NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
567 NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
568 NiceMock<MockJniWrapper>* mJni = nullptr;
569 NiceMock<MockLooperWrapper>* mLooper = nullptr;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700570 NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700571 NiceMock<MockDataLoader>* mDataLoader = nullptr;
Songchun Fan3c82a302019-11-29 14:23:45 -0800572 std::unique_ptr<IncrementalService> mIncrementalService;
573 TemporaryDir mRootDir;
574 DataLoaderParamsParcel mDataLoaderParcel;
575};
576
Songchun Fan3c82a302019-11-29 14:23:45 -0800577TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
578 mVold->mountIncFsFails();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700579 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800580 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700581 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
582 IncrementalService::CreateOptions::CreateNew,
583 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800584 ASSERT_LT(storageId, 0);
585}
586
587TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
588 mVold->mountIncFsInvalidControlParcel();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700589 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
590 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800591 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700592 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
593 IncrementalService::CreateOptions::CreateNew,
594 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800595 ASSERT_LT(storageId, 0);
596}
597
598TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
599 mVold->mountIncFsSuccess();
600 mIncFs->makeFileFails();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700601 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
602 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800603 EXPECT_CALL(*mVold, unmountIncFs(_));
604 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700605 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
606 IncrementalService::CreateOptions::CreateNew,
607 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800608 ASSERT_LT(storageId, 0);
609}
610
611TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
612 mVold->mountIncFsSuccess();
613 mIncFs->makeFileSuccess();
614 mVold->bindMountFails();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700615 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
616 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800617 EXPECT_CALL(*mVold, unmountIncFs(_));
618 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700619 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
620 IncrementalService::CreateOptions::CreateNew,
621 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800622 ASSERT_LT(storageId, 0);
623}
624
625TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
626 mVold->mountIncFsSuccess();
627 mIncFs->makeFileSuccess();
628 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700629 mDataLoaderManager->bindToDataLoaderFails();
630 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
631 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700632 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
633 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
634 EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
Songchun Fan3c82a302019-11-29 14:23:45 -0800635 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
636 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700637 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
638 IncrementalService::CreateOptions::CreateNew,
639 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800640 ASSERT_LT(storageId, 0);
641}
642
643TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
644 mVold->mountIncFsSuccess();
645 mIncFs->makeFileSuccess();
646 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700647 mDataLoaderManager->bindToDataLoaderSuccess();
648 mDataLoaderManager->getDataLoaderSuccess();
649 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
650 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700651 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
652 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
653 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800654 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
655 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700656 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
657 IncrementalService::CreateOptions::CreateNew,
658 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800659 ASSERT_GE(storageId, 0);
660 mIncrementalService->deleteStorage(storageId);
661}
662
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700663TEST_F(IncrementalServiceTest, testDataLoaderDestroyed) {
Songchun Fan3c82a302019-11-29 14:23:45 -0800664 mVold->mountIncFsSuccess();
665 mIncFs->makeFileSuccess();
666 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700667 mDataLoaderManager->bindToDataLoaderSuccess();
Songchun Fan68645c42020-02-27 15:57:35 -0800668 mDataLoaderManager->getDataLoaderSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700669 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2);
670 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700671 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
672 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
673 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
Songchun Fan3c82a302019-11-29 14:23:45 -0800674 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
675 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700676 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
677 IncrementalService::CreateOptions::CreateNew,
678 {}, {}, {});
Songchun Fan3c82a302019-11-29 14:23:45 -0800679 ASSERT_GE(storageId, 0);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700680 // Simulated crash/other connection breakage.
681 mDataLoaderManager->setDataLoaderStatusDestroyed();
682}
683
684TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
685 mVold->mountIncFsSuccess();
686 mIncFs->makeFileSuccess();
687 mVold->bindMountSuccess();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700688 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700689 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700690 mDataLoaderManager->getDataLoaderSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700691 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
692 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700693 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
694 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
695 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
696 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
697 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700698 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
699 IncrementalService::CreateOptions::CreateNew,
700 {}, {}, {});
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700701 ASSERT_GE(storageId, 0);
702 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -0800703 ASSERT_TRUE(mIncrementalService->startLoading(storageId));
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700704 mDataLoaderManager->setDataLoaderStatusStarted();
705}
706
707TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
708 mVold->mountIncFsSuccess();
709 mIncFs->makeFileSuccess();
710 mVold->bindMountSuccess();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700711 mDataLoader->initializeCreateOkNoStatus();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700712 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700713 mDataLoaderManager->getDataLoaderSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700714 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
715 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700716 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700717 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
718 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
719 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
720 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700721 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
722 IncrementalService::CreateOptions::CreateNew,
723 {}, {}, {});
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700724 ASSERT_GE(storageId, 0);
725 ASSERT_TRUE(mIncrementalService->startLoading(storageId));
726 mDataLoaderManager->setDataLoaderStatusCreated();
Songchun Fan3c82a302019-11-29 14:23:45 -0800727}
728
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700729TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
730 mVold->mountIncFsSuccess();
731 mIncFs->makeFileSuccess();
732 mVold->bindMountSuccess();
733 mDataLoader->initializeCreateOkNoStatus();
734 mDataLoaderManager->bindToDataLoaderSuccess();
735 mDataLoaderManager->getDataLoaderSuccess();
736 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
737 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
738 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
739 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
740 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
741 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
742 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700743 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
744 IncrementalService::CreateOptions::CreateNew,
745 {}, {}, {});
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700746 ASSERT_GE(storageId, 0);
747 mDataLoaderManager->setDataLoaderStatusUnavailable();
748}
749
750TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
751 mVold->mountIncFsSuccess();
752 mIncFs->makeFileSuccess();
753 mIncFs->openMountSuccess();
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700754 mIncFs->waitForPendingReadsSuccess();
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700755 mVold->bindMountSuccess();
756 mDataLoader->initializeCreateOkNoStatus();
757 mDataLoaderManager->bindToDataLoaderSuccess();
758 mDataLoaderManager->getDataLoaderSuccess();
759 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -0700760 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700761 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
762 EXPECT_CALL(*mDataLoader, start(_)).Times(0);
Alex Buynytskyy4dbc0602020-05-12 11:24:14 -0700763 EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700764 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
765 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
766 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
767 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700768 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
769 IncrementalService::CreateOptions::CreateNew,
770 {}, {}, {});
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700771 ASSERT_GE(storageId, 0);
772 mDataLoaderManager->setDataLoaderStatusUnavailable();
773 ASSERT_NE(nullptr, mLooper->mCallback);
774 ASSERT_NE(nullptr, mLooper->mCallbackData);
775 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
776}
777
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700778TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
779 mVold->mountIncFsSuccess();
780 mIncFs->makeFileSuccess();
781 mIncFs->openMountSuccess();
782 mVold->bindMountSuccess();
783 mDataLoaderManager->bindToDataLoaderSuccess();
784 mDataLoaderManager->getDataLoaderSuccess();
785 EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
786 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
787 EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
788 EXPECT_CALL(*mDataLoader, start(_)).Times(1);
789 EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
790 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
791 EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
792 EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
793 EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
794
795 sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
796 NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
797 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
798 .Times(2);
799 EXPECT_CALL(*listenerMock,
800 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
801 .Times(1);
802 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
803 .Times(1);
804 EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
805 .Times(2);
806
807 StorageHealthCheckParams params;
808 params.blockedTimeoutMs = 10000;
809 params.unhealthyTimeoutMs = 20000;
810 params.unhealthyMonitoringMs = 30000;
811
812 using MS = std::chrono::milliseconds;
813 using MCS = std::chrono::microseconds;
814
815 const auto blockedTimeout = MS(params.blockedTimeoutMs);
816 const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
817 const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
818
819 const uint64_t kFirstTimestampUs = 1000000000ll;
820 const uint64_t kBlockedTimestampUs =
821 kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
822 const uint64_t kUnhealthyTimestampUs =
823 kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
824
825 TemporaryDir tempDir;
826 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
827 IncrementalService::CreateOptions::CreateNew,
828 {}, std::move(params), listener);
829 ASSERT_GE(storageId, 0);
830
831 // Healthy state, registered for pending reads.
832 ASSERT_NE(nullptr, mLooper->mCallback);
833 ASSERT_NE(nullptr, mLooper->mCallbackData);
834 ASSERT_EQ(storageId, listener->mStorageId);
835 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
836
837 // Looper/epoll callback.
838 mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
839 mLooper->mCallback(-1, -1, mLooper->mCallbackData);
840
841 // Unregister from pending reads and wait.
842 ASSERT_EQ(nullptr, mLooper->mCallback);
843 ASSERT_EQ(nullptr, mLooper->mCallbackData);
844 ASSERT_EQ(storageId, listener->mStorageId);
845 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
846 // Timed callback present.
847 ASSERT_EQ(storageId, mTimedQueue->mId);
848 ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
849 auto timedCallback = mTimedQueue->mWhat;
850 mTimedQueue->clearJob(storageId);
851
852 // Timed job callback for blocked.
853 mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
854 timedCallback();
855
856 // Still not registered, and blocked.
857 ASSERT_EQ(nullptr, mLooper->mCallback);
858 ASSERT_EQ(nullptr, mLooper->mCallbackData);
859 ASSERT_EQ(storageId, listener->mStorageId);
860 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
861 // Timed callback present.
862 ASSERT_EQ(storageId, mTimedQueue->mId);
863 ASSERT_GE(mTimedQueue->mAfter, 1000ms);
864 timedCallback = mTimedQueue->mWhat;
865 mTimedQueue->clearJob(storageId);
866
867 // Timed job callback for unhealthy.
868 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
869 timedCallback();
870
871 // Still not registered, and blocked.
872 ASSERT_EQ(nullptr, mLooper->mCallback);
873 ASSERT_EQ(nullptr, mLooper->mCallbackData);
874 ASSERT_EQ(storageId, listener->mStorageId);
875 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
876 // Timed callback present.
877 ASSERT_EQ(storageId, mTimedQueue->mId);
878 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
879 timedCallback = mTimedQueue->mWhat;
880 mTimedQueue->clearJob(storageId);
881
882 // One more unhealthy.
883 mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
884 timedCallback();
885
886 // Still not registered, and blocked.
887 ASSERT_EQ(nullptr, mLooper->mCallback);
888 ASSERT_EQ(nullptr, mLooper->mCallbackData);
889 ASSERT_EQ(storageId, listener->mStorageId);
890 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
891 // Timed callback present.
892 ASSERT_EQ(storageId, mTimedQueue->mId);
893 ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
894 timedCallback = mTimedQueue->mWhat;
895 mTimedQueue->clearJob(storageId);
896
897 // And now healthy.
898 mIncFs->waitForPendingReadsTimeout();
899 timedCallback();
900
901 // Healthy state, registered for pending reads.
902 ASSERT_NE(nullptr, mLooper->mCallback);
903 ASSERT_NE(nullptr, mLooper->mCallbackData);
904 ASSERT_EQ(storageId, listener->mStorageId);
905 ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
906}
907
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700908TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
909 mVold->mountIncFsSuccess();
910 mIncFs->makeFileSuccess();
911 mVold->bindMountSuccess();
912 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700913 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700914 mDataLoaderManager->getDataLoaderSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700915 mAppOpsManager->checkPermissionSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700916 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700917 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700918 // We are calling setIncFsMountOptions(true).
919 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
920 // After setIncFsMountOptions succeeded expecting to start watching.
921 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
922 // Not expecting callback removal.
923 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700924 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700925 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
926 IncrementalService::CreateOptions::CreateNew,
927 {}, {}, {});
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700928 ASSERT_GE(storageId, 0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700929 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700930}
931
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -0700932TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
933 mVold->mountIncFsSuccess();
934 mIncFs->makeFileSuccess();
935 mVold->bindMountSuccess();
936 mVold->setIncFsMountOptionsSuccess();
937 mDataLoaderManager->bindToDataLoaderSuccess();
938 mDataLoaderManager->getDataLoaderSuccess();
939 mAppOpsManager->checkPermissionSuccess();
940 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
941 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
942 // Enabling and then disabling readlogs.
943 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
944 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
945 // After setIncFsMountOptions succeeded expecting to start watching.
946 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
947 // Not expecting callback removal.
948 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
949 TemporaryDir tempDir;
950 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
951 IncrementalService::CreateOptions::CreateNew,
952 {}, {}, {});
953 ASSERT_GE(storageId, 0);
954 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
955 // Now disable.
956 mIncrementalService->disableReadLogs(storageId);
957 ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
958}
959
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700960TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
961 mVold->mountIncFsSuccess();
962 mIncFs->makeFileSuccess();
963 mVold->bindMountSuccess();
964 mVold->setIncFsMountOptionsSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700965 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700966 mDataLoaderManager->getDataLoaderSuccess();
967 mAppOpsManager->checkPermissionSuccess();
968 mAppOpsManager->initializeStartWatchingMode();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700969 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700970 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
971 // We are calling setIncFsMountOptions(true).
972 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
973 // setIncFsMountOptions(false) is called on the callback.
974 EXPECT_CALL(*mVold, setIncFsMountOptions(_, false)).Times(1);
975 // After setIncFsMountOptions succeeded expecting to start watching.
976 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
977 // After callback is called, disable read logs and remove callback.
978 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
979 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700980 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
981 IncrementalService::CreateOptions::CreateNew,
982 {}, {}, {});
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700983 ASSERT_GE(storageId, 0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700984 ASSERT_GE(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700985 ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
986 mAppOpsManager->mStoredCallback->opChanged(0, {});
987}
988
989TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
990 mVold->mountIncFsSuccess();
991 mIncFs->makeFileSuccess();
992 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700993 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700994 mDataLoaderManager->getDataLoaderSuccess();
995 mAppOpsManager->checkPermissionFails();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700996 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700997 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
998 // checkPermission fails, no calls to set opitions, start or stop WatchingMode.
999 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
1000 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1001 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1002 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001003 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
1004 IncrementalService::CreateOptions::CreateNew,
1005 {}, {}, {});
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001006 ASSERT_GE(storageId, 0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001007 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001008}
1009
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001010TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
1011 mVold->mountIncFsSuccess();
1012 mIncFs->makeFileSuccess();
1013 mVold->bindMountSuccess();
1014 mVold->setIncFsMountOptionsFails();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001015 mDataLoaderManager->bindToDataLoaderSuccess();
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001016 mDataLoaderManager->getDataLoaderSuccess();
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001017 mAppOpsManager->checkPermissionSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001018 EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001019 EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
Alex Buynytskyy1d892162020-04-03 23:00:19 -07001020 // We are calling setIncFsMountOptions.
1021 EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
1022 // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1023 EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1024 EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001025 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001026 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
1027 IncrementalService::CreateOptions::CreateNew,
1028 {}, {}, {});
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001029 ASSERT_GE(storageId, 0);
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001030 ASSERT_LT(mDataLoader->setStorageParams(true), 0);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -07001031}
1032
Songchun Fan3c82a302019-11-29 14:23:45 -08001033TEST_F(IncrementalServiceTest, testMakeDirectory) {
1034 mVold->mountIncFsSuccess();
1035 mIncFs->makeFileSuccess();
1036 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001037 mDataLoaderManager->bindToDataLoaderSuccess();
Songchun Fan68645c42020-02-27 15:57:35 -08001038 mDataLoaderManager->getDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -08001039 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001040 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
1041 IncrementalService::CreateOptions::CreateNew,
1042 {}, {}, {});
Songchun Fan103ba1d2020-02-03 17:32:32 -08001043 std::string dir_path("test");
Songchun Fan3c82a302019-11-29 14:23:45 -08001044
Songchun Fan103ba1d2020-02-03 17:32:32 -08001045 // Expecting incfs to call makeDir on a path like:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001046 // <root>/*/mount/<storage>/test
1047 EXPECT_CALL(*mIncFs,
1048 makeDir(_, Truly([&](std::string_view arg) {
1049 return arg.starts_with(mRootDir.path) &&
1050 arg.ends_with("/mount/st_1_0/" + dir_path);
1051 }),
1052 _));
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001053 auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1054 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001055}
1056
1057TEST_F(IncrementalServiceTest, testMakeDirectories) {
1058 mVold->mountIncFsSuccess();
1059 mIncFs->makeFileSuccess();
1060 mVold->bindMountSuccess();
Alex Buynytskyyea1390f2020-04-22 16:08:50 -07001061 mDataLoaderManager->bindToDataLoaderSuccess();
Songchun Fan68645c42020-02-27 15:57:35 -08001062 mDataLoaderManager->getDataLoaderSuccess();
Songchun Fan3c82a302019-11-29 14:23:45 -08001063 TemporaryDir tempDir;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -07001064 int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel),
1065 IncrementalService::CreateOptions::CreateNew,
1066 {}, {}, {});
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001067 auto first = "first"sv;
1068 auto second = "second"sv;
1069 auto third = "third"sv;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001070 auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
Songchun Fan103ba1d2020-02-03 17:32:32 -08001071
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -07001072 EXPECT_CALL(*mIncFs,
1073 makeDirs(_, Truly([&](std::string_view arg) {
1074 return arg.starts_with(mRootDir.path) &&
1075 arg.ends_with("/mount/st_1_0/" + dir_path);
1076 }),
1077 _));
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -07001078 auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -08001079 ASSERT_EQ(res, 0);
Songchun Fan3c82a302019-11-29 14:23:45 -08001080}
1081} // namespace android::os::incremental