xref: /aosp_15_r20/frameworks/base/services/incremental/test/IncrementalServiceTest.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include <android-base/file.h>
18*d57664e9SAndroid Build Coastguard Worker #include <android-base/logging.h>
19*d57664e9SAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
20*d57664e9SAndroid Build Coastguard Worker #include <binder/ParcelFileDescriptor.h>
21*d57664e9SAndroid Build Coastguard Worker #include <gmock/gmock.h>
22*d57664e9SAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/String16.h>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include <chrono>
27*d57664e9SAndroid Build Coastguard Worker #include <future>
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker #include "IncrementalService.h"
30*d57664e9SAndroid Build Coastguard Worker #include "IncrementalServiceValidation.h"
31*d57664e9SAndroid Build Coastguard Worker #include "Metadata.pb.h"
32*d57664e9SAndroid Build Coastguard Worker #include "ServiceWrappers.h"
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker using namespace testing;
35*d57664e9SAndroid Build Coastguard Worker using namespace android::incremental;
36*d57664e9SAndroid Build Coastguard Worker using namespace std::literals;
37*d57664e9SAndroid Build Coastguard Worker using testing::_;
38*d57664e9SAndroid Build Coastguard Worker using testing::Invoke;
39*d57664e9SAndroid Build Coastguard Worker using testing::NiceMock;
40*d57664e9SAndroid Build Coastguard Worker 
41*d57664e9SAndroid Build Coastguard Worker #undef LOG_TAG
42*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "IncrementalServiceTest"
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker using namespace android::incfs;
45*d57664e9SAndroid Build Coastguard Worker using namespace android::content::pm;
46*d57664e9SAndroid Build Coastguard Worker using PerUidReadTimeouts = android::os::incremental::PerUidReadTimeouts;
47*d57664e9SAndroid Build Coastguard Worker 
48*d57664e9SAndroid Build Coastguard Worker namespace android::os::incremental {
49*d57664e9SAndroid Build Coastguard Worker 
50*d57664e9SAndroid Build Coastguard Worker class MockVoldService : public VoldServiceWrapper {
51*d57664e9SAndroid Build Coastguard Worker public:
52*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD5(mountIncFs,
53*d57664e9SAndroid Build Coastguard Worker                        binder::Status(const std::string& backingPath, const std::string& targetDir,
54*d57664e9SAndroid Build Coastguard Worker                                       int32_t flags, const std::string& sysfsName,
55*d57664e9SAndroid Build Coastguard Worker                                       IncrementalFileSystemControlParcel* _aidl_return));
56*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir));
57*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(bindMount,
58*d57664e9SAndroid Build Coastguard Worker                        binder::Status(const std::string& sourceDir, const std::string& argetDir));
59*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD4(
60*d57664e9SAndroid Build Coastguard Worker             setIncFsMountOptions,
61*d57664e9SAndroid Build Coastguard Worker             binder::Status(const ::android::os::incremental::IncrementalFileSystemControlParcel&,
62*d57664e9SAndroid Build Coastguard Worker                            bool, bool, const std::string&));
63*d57664e9SAndroid Build Coastguard Worker 
mountIncFsFails()64*d57664e9SAndroid Build Coastguard Worker     void mountIncFsFails() {
65*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, mountIncFs(_, _, _, _, _))
66*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(
67*d57664e9SAndroid Build Coastguard Worker                         Return(binder::Status::fromExceptionCode(1, String8("failed to mount"))));
68*d57664e9SAndroid Build Coastguard Worker     }
mountIncFsInvalidControlParcel()69*d57664e9SAndroid Build Coastguard Worker     void mountIncFsInvalidControlParcel() {
70*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, mountIncFs(_, _, _, _, _))
71*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel));
72*d57664e9SAndroid Build Coastguard Worker     }
mountIncFsSuccess()73*d57664e9SAndroid Build Coastguard Worker     void mountIncFsSuccess() {
74*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, mountIncFs(_, _, _, _, _))
75*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess));
76*d57664e9SAndroid Build Coastguard Worker     }
bindMountFails()77*d57664e9SAndroid Build Coastguard Worker     void bindMountFails() {
78*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, bindMount(_, _))
79*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Return(
80*d57664e9SAndroid Build Coastguard Worker                         binder::Status::fromExceptionCode(1, String8("failed to bind-mount"))));
81*d57664e9SAndroid Build Coastguard Worker     }
bindMountSuccess()82*d57664e9SAndroid Build Coastguard Worker     void bindMountSuccess() {
83*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, bindMount(_, _)).WillByDefault(Return(binder::Status::ok()));
84*d57664e9SAndroid Build Coastguard Worker     }
setIncFsMountOptionsFails() const85*d57664e9SAndroid Build Coastguard Worker     void setIncFsMountOptionsFails() const {
86*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, setIncFsMountOptions(_, _, _, _))
87*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Return(
88*d57664e9SAndroid Build Coastguard Worker                         binder::Status::fromExceptionCode(1, String8("failed to set options"))));
89*d57664e9SAndroid Build Coastguard Worker     }
setIncFsMountOptionsSuccess()90*d57664e9SAndroid Build Coastguard Worker     void setIncFsMountOptionsSuccess() {
91*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, setIncFsMountOptions(_, _, _, _))
92*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockVoldService::setIncFsMountOptionsOk));
93*d57664e9SAndroid Build Coastguard Worker     }
getInvalidControlParcel(const std::string & imagePath,const std::string & targetDir,int32_t flags,const std::string & sysfsName,IncrementalFileSystemControlParcel * _aidl_return)94*d57664e9SAndroid Build Coastguard Worker     binder::Status getInvalidControlParcel(const std::string& imagePath,
95*d57664e9SAndroid Build Coastguard Worker                                            const std::string& targetDir, int32_t flags,
96*d57664e9SAndroid Build Coastguard Worker                                            const std::string& sysfsName,
97*d57664e9SAndroid Build Coastguard Worker                                            IncrementalFileSystemControlParcel* _aidl_return) {
98*d57664e9SAndroid Build Coastguard Worker         _aidl_return = {};
99*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
100*d57664e9SAndroid Build Coastguard Worker     }
incFsSuccess(const std::string & imagePath,const std::string & targetDir,int32_t flags,const std::string & sysfsName,IncrementalFileSystemControlParcel * _aidl_return)101*d57664e9SAndroid Build Coastguard Worker     binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir,
102*d57664e9SAndroid Build Coastguard Worker                                 int32_t flags, const std::string& sysfsName,
103*d57664e9SAndroid Build Coastguard Worker                                 IncrementalFileSystemControlParcel* _aidl_return) {
104*d57664e9SAndroid Build Coastguard Worker         _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO)));
105*d57664e9SAndroid Build Coastguard Worker         _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO)));
106*d57664e9SAndroid Build Coastguard Worker         _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO)));
107*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
108*d57664e9SAndroid Build Coastguard Worker     }
setIncFsMountOptionsOk(const::android::os::incremental::IncrementalFileSystemControlParcel & control,bool enableReadLogs,bool enableReadTimeouts,const std::string & sysfsName)109*d57664e9SAndroid Build Coastguard Worker     binder::Status setIncFsMountOptionsOk(
110*d57664e9SAndroid Build Coastguard Worker             const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
111*d57664e9SAndroid Build Coastguard Worker             bool enableReadLogs, bool enableReadTimeouts, const std::string& sysfsName) {
112*d57664e9SAndroid Build Coastguard Worker         mReadLogsEnabled = enableReadLogs;
113*d57664e9SAndroid Build Coastguard Worker         mReadTimeoutsEnabled = enableReadTimeouts;
114*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
115*d57664e9SAndroid Build Coastguard Worker     }
116*d57664e9SAndroid Build Coastguard Worker 
readLogsEnabled() const117*d57664e9SAndroid Build Coastguard Worker     bool readLogsEnabled() const { return mReadLogsEnabled; }
readTimeoutsEnabled() const118*d57664e9SAndroid Build Coastguard Worker     bool readTimeoutsEnabled() const { return mReadTimeoutsEnabled; }
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker private:
121*d57664e9SAndroid Build Coastguard Worker     TemporaryFile cmdFile;
122*d57664e9SAndroid Build Coastguard Worker     TemporaryFile logFile;
123*d57664e9SAndroid Build Coastguard Worker 
124*d57664e9SAndroid Build Coastguard Worker     bool mReadLogsEnabled = false;
125*d57664e9SAndroid Build Coastguard Worker     bool mReadTimeoutsEnabled = true;
126*d57664e9SAndroid Build Coastguard Worker };
127*d57664e9SAndroid Build Coastguard Worker 
128*d57664e9SAndroid Build Coastguard Worker class MockDataLoader : public IDataLoader {
129*d57664e9SAndroid Build Coastguard Worker public:
MockDataLoader()130*d57664e9SAndroid Build Coastguard Worker     MockDataLoader() {
131*d57664e9SAndroid Build Coastguard Worker         initializeCreateOk();
132*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
133*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
134*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
135*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, prepareImage(_, _, _))
136*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
137*d57664e9SAndroid Build Coastguard Worker     }
onAsBinder()138*d57664e9SAndroid Build Coastguard Worker     IBinder* onAsBinder() override { return nullptr; }
139*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD4(create,
140*d57664e9SAndroid Build Coastguard Worker                  binder::Status(int32_t id, const DataLoaderParamsParcel& params,
141*d57664e9SAndroid Build Coastguard Worker                                 const FileSystemControlParcel& control,
142*d57664e9SAndroid Build Coastguard Worker                                 const sp<IDataLoaderStatusListener>& listener));
143*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(start, binder::Status(int32_t id));
144*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(stop, binder::Status(int32_t id));
145*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(destroy, binder::Status(int32_t id));
146*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD3(prepareImage,
147*d57664e9SAndroid Build Coastguard Worker                  binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
148*d57664e9SAndroid Build Coastguard Worker                                 const std::vector<std::string>& removedFiles));
149*d57664e9SAndroid Build Coastguard Worker 
initializeCreateOk()150*d57664e9SAndroid Build Coastguard Worker     void initializeCreateOk() {
151*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
152*d57664e9SAndroid Build Coastguard Worker     }
153*d57664e9SAndroid Build Coastguard Worker 
initializeCreateOkNoStatus()154*d57664e9SAndroid Build Coastguard Worker     void initializeCreateOkNoStatus() {
155*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, create(_, _, _, _))
156*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
157*d57664e9SAndroid Build Coastguard Worker     }
158*d57664e9SAndroid Build Coastguard Worker 
createOk(int32_t id,const content::pm::DataLoaderParamsParcel & params,const content::pm::FileSystemControlParcel & control,const sp<content::pm::IDataLoaderStatusListener> & listener)159*d57664e9SAndroid Build Coastguard Worker     binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
160*d57664e9SAndroid Build Coastguard Worker                             const content::pm::FileSystemControlParcel& control,
161*d57664e9SAndroid Build Coastguard Worker                             const sp<content::pm::IDataLoaderStatusListener>& listener) {
162*d57664e9SAndroid Build Coastguard Worker         createOkNoStatus(id, params, control, listener);
163*d57664e9SAndroid Build Coastguard Worker         reportStatus(id);
164*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
165*d57664e9SAndroid Build Coastguard Worker     }
createOkNoStatus(int32_t id,const content::pm::DataLoaderParamsParcel & params,const content::pm::FileSystemControlParcel & control,const sp<content::pm::IDataLoaderStatusListener> & listener)166*d57664e9SAndroid Build Coastguard Worker     binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
167*d57664e9SAndroid Build Coastguard Worker                                     const content::pm::FileSystemControlParcel& control,
168*d57664e9SAndroid Build Coastguard Worker                                     const sp<content::pm::IDataLoaderStatusListener>& listener) {
169*d57664e9SAndroid Build Coastguard Worker         mServiceConnector = control.service;
170*d57664e9SAndroid Build Coastguard Worker         mListener = listener;
171*d57664e9SAndroid Build Coastguard Worker         mStatus = IDataLoaderStatusListener::DATA_LOADER_CREATED;
172*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
173*d57664e9SAndroid Build Coastguard Worker     }
startOk(int32_t id)174*d57664e9SAndroid Build Coastguard Worker     binder::Status startOk(int32_t id) {
175*d57664e9SAndroid Build Coastguard Worker         setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
176*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
177*d57664e9SAndroid Build Coastguard Worker     }
stopOk(int32_t id)178*d57664e9SAndroid Build Coastguard Worker     binder::Status stopOk(int32_t id) {
179*d57664e9SAndroid Build Coastguard Worker         setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
180*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
181*d57664e9SAndroid Build Coastguard Worker     }
destroyOk(int32_t id)182*d57664e9SAndroid Build Coastguard Worker     binder::Status destroyOk(int32_t id) {
183*d57664e9SAndroid Build Coastguard Worker         setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
184*d57664e9SAndroid Build Coastguard Worker         mListener = nullptr;
185*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
186*d57664e9SAndroid Build Coastguard Worker     }
prepareImageOk(int32_t id,const::std::vector<content::pm::InstallationFileParcel> &,const::std::vector<::std::string> &)187*d57664e9SAndroid Build Coastguard Worker     binder::Status prepareImageOk(int32_t id,
188*d57664e9SAndroid Build Coastguard Worker                                   const ::std::vector<content::pm::InstallationFileParcel>&,
189*d57664e9SAndroid Build Coastguard Worker                                   const ::std::vector<::std::string>&) {
190*d57664e9SAndroid Build Coastguard Worker         setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
191*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
192*d57664e9SAndroid Build Coastguard Worker     }
setStorageParams(bool enableReadLogs)193*d57664e9SAndroid Build Coastguard Worker     int32_t setStorageParams(bool enableReadLogs) {
194*d57664e9SAndroid Build Coastguard Worker         int32_t result = -1;
195*d57664e9SAndroid Build Coastguard Worker         EXPECT_NE(mServiceConnector.get(), nullptr);
196*d57664e9SAndroid Build Coastguard Worker         EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
197*d57664e9SAndroid Build Coastguard Worker         return result;
198*d57664e9SAndroid Build Coastguard Worker     }
status() const199*d57664e9SAndroid Build Coastguard Worker     int status() const { return mStatus; }
200*d57664e9SAndroid Build Coastguard Worker 
201*d57664e9SAndroid Build Coastguard Worker private:
setAndReportStatus(int id,int status)202*d57664e9SAndroid Build Coastguard Worker     void setAndReportStatus(int id, int status) {
203*d57664e9SAndroid Build Coastguard Worker         mStatus = status;
204*d57664e9SAndroid Build Coastguard Worker         reportStatus(id);
205*d57664e9SAndroid Build Coastguard Worker     }
reportStatus(int id)206*d57664e9SAndroid Build Coastguard Worker     void reportStatus(int id) {
207*d57664e9SAndroid Build Coastguard Worker         if (mListener) {
208*d57664e9SAndroid Build Coastguard Worker             mListener->onStatusChanged(id, mStatus);
209*d57664e9SAndroid Build Coastguard Worker         }
210*d57664e9SAndroid Build Coastguard Worker     }
211*d57664e9SAndroid Build Coastguard Worker 
212*d57664e9SAndroid Build Coastguard Worker     sp<IIncrementalServiceConnector> mServiceConnector;
213*d57664e9SAndroid Build Coastguard Worker     sp<IDataLoaderStatusListener> mListener;
214*d57664e9SAndroid Build Coastguard Worker     int mStatus = IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
215*d57664e9SAndroid Build Coastguard Worker };
216*d57664e9SAndroid Build Coastguard Worker 
217*d57664e9SAndroid Build Coastguard Worker class MockDataLoaderManager : public DataLoaderManagerWrapper {
218*d57664e9SAndroid Build Coastguard Worker public:
MockDataLoaderManager(sp<IDataLoader> dataLoader)219*d57664e9SAndroid Build Coastguard Worker     MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
220*d57664e9SAndroid Build Coastguard Worker         EXPECT_TRUE(mDataLoaderHolder != nullptr);
221*d57664e9SAndroid Build Coastguard Worker     }
222*d57664e9SAndroid Build Coastguard Worker 
223*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD5(bindToDataLoader,
224*d57664e9SAndroid Build Coastguard Worker                        binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
225*d57664e9SAndroid Build Coastguard Worker                                       int bindDelayMs,
226*d57664e9SAndroid Build Coastguard Worker                                       const sp<IDataLoaderStatusListener>& listener,
227*d57664e9SAndroid Build Coastguard Worker                                       bool* _aidl_return));
228*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(getDataLoader,
229*d57664e9SAndroid Build Coastguard Worker                        binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
230*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
231*d57664e9SAndroid Build Coastguard Worker 
bindToDataLoaderSuccess()232*d57664e9SAndroid Build Coastguard Worker     void bindToDataLoaderSuccess() {
233*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
234*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
235*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderFails()236*d57664e9SAndroid Build Coastguard Worker     void bindToDataLoaderFails() {
237*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, bindToDataLoader(_, _, _, _, _))
238*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Return(
239*d57664e9SAndroid Build Coastguard Worker                         (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
240*d57664e9SAndroid Build Coastguard Worker     }
getDataLoaderSuccess()241*d57664e9SAndroid Build Coastguard Worker     void getDataLoaderSuccess() {
242*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, getDataLoader(_, _))
243*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
244*d57664e9SAndroid Build Coastguard Worker     }
unbindFromDataLoaderSuccess()245*d57664e9SAndroid Build Coastguard Worker     void unbindFromDataLoaderSuccess() {
246*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, unbindFromDataLoader(_))
247*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
248*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOk(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)249*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
250*d57664e9SAndroid Build Coastguard Worker                                       int bindDelayMs,
251*d57664e9SAndroid Build Coastguard Worker                                       const sp<IDataLoaderStatusListener>& listener,
252*d57664e9SAndroid Build Coastguard Worker                                       bool* _aidl_return) {
253*d57664e9SAndroid Build Coastguard Worker         mId = mountId;
254*d57664e9SAndroid Build Coastguard Worker         mListener = listener;
255*d57664e9SAndroid Build Coastguard Worker         mDataLoader = mDataLoaderHolder;
256*d57664e9SAndroid Build Coastguard Worker         mBindDelayMs = bindDelayMs;
257*d57664e9SAndroid Build Coastguard Worker         *_aidl_return = true;
258*d57664e9SAndroid Build Coastguard Worker         if (mListener) {
259*d57664e9SAndroid Build Coastguard Worker             mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
260*d57664e9SAndroid Build Coastguard Worker         }
261*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
262*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderNotOkWithNoDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)263*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderNotOkWithNoDelay(int32_t mountId,
264*d57664e9SAndroid Build Coastguard Worker                                                     const DataLoaderParamsParcel& params,
265*d57664e9SAndroid Build Coastguard Worker                                                     int bindDelayMs,
266*d57664e9SAndroid Build Coastguard Worker                                                     const sp<IDataLoaderStatusListener>& listener,
267*d57664e9SAndroid Build Coastguard Worker                                                     bool* _aidl_return) {
268*d57664e9SAndroid Build Coastguard Worker         CHECK(bindDelayMs == 0) << bindDelayMs;
269*d57664e9SAndroid Build Coastguard Worker         *_aidl_return = false;
270*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
271*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderBindingWithNoDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)272*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderBindingWithNoDelay(int32_t mountId,
273*d57664e9SAndroid Build Coastguard Worker                                                       const DataLoaderParamsParcel& params,
274*d57664e9SAndroid Build Coastguard Worker                                                       int bindDelayMs,
275*d57664e9SAndroid Build Coastguard Worker                                                       const sp<IDataLoaderStatusListener>& listener,
276*d57664e9SAndroid Build Coastguard Worker                                                       bool* _aidl_return) {
277*d57664e9SAndroid Build Coastguard Worker         CHECK(bindDelayMs == 0) << bindDelayMs;
278*d57664e9SAndroid Build Coastguard Worker         *_aidl_return = true;
279*d57664e9SAndroid Build Coastguard Worker         if (listener) {
280*d57664e9SAndroid Build Coastguard Worker             listener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BINDING);
281*d57664e9SAndroid Build Coastguard Worker         }
282*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
283*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWithNoDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)284*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWithNoDelay(int32_t mountId,
285*d57664e9SAndroid Build Coastguard Worker                                                  const DataLoaderParamsParcel& params,
286*d57664e9SAndroid Build Coastguard Worker                                                  int bindDelayMs,
287*d57664e9SAndroid Build Coastguard Worker                                                  const sp<IDataLoaderStatusListener>& listener,
288*d57664e9SAndroid Build Coastguard Worker                                                  bool* _aidl_return) {
289*d57664e9SAndroid Build Coastguard Worker         CHECK(bindDelayMs == 0) << bindDelayMs;
290*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
291*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWith1sDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)292*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
293*d57664e9SAndroid Build Coastguard Worker                                                  const DataLoaderParamsParcel& params,
294*d57664e9SAndroid Build Coastguard Worker                                                  int bindDelayMs,
295*d57664e9SAndroid Build Coastguard Worker                                                  const sp<IDataLoaderStatusListener>& listener,
296*d57664e9SAndroid Build Coastguard Worker                                                  bool* _aidl_return) {
297*d57664e9SAndroid Build Coastguard Worker         CHECK(100 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11) << bindDelayMs;
298*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
299*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWith10sDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)300*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWith10sDelay(int32_t mountId,
301*d57664e9SAndroid Build Coastguard Worker                                                   const DataLoaderParamsParcel& params,
302*d57664e9SAndroid Build Coastguard Worker                                                   int bindDelayMs,
303*d57664e9SAndroid Build Coastguard Worker                                                   const sp<IDataLoaderStatusListener>& listener,
304*d57664e9SAndroid Build Coastguard Worker                                                   bool* _aidl_return) {
305*d57664e9SAndroid Build Coastguard Worker         CHECK(100 * 9 * 9 <= bindDelayMs && bindDelayMs <= 100 * 11 * 11) << bindDelayMs;
306*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
307*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWith100sDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)308*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWith100sDelay(int32_t mountId,
309*d57664e9SAndroid Build Coastguard Worker                                                    const DataLoaderParamsParcel& params,
310*d57664e9SAndroid Build Coastguard Worker                                                    int bindDelayMs,
311*d57664e9SAndroid Build Coastguard Worker                                                    const sp<IDataLoaderStatusListener>& listener,
312*d57664e9SAndroid Build Coastguard Worker                                                    bool* _aidl_return) {
313*d57664e9SAndroid Build Coastguard Worker         CHECK(100 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11) << bindDelayMs;
314*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
315*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWith1000sDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)316*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWith1000sDelay(int32_t mountId,
317*d57664e9SAndroid Build Coastguard Worker                                                     const DataLoaderParamsParcel& params,
318*d57664e9SAndroid Build Coastguard Worker                                                     int bindDelayMs,
319*d57664e9SAndroid Build Coastguard Worker                                                     const sp<IDataLoaderStatusListener>& listener,
320*d57664e9SAndroid Build Coastguard Worker                                                     bool* _aidl_return) {
321*d57664e9SAndroid Build Coastguard Worker         CHECK(100 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11)
322*d57664e9SAndroid Build Coastguard Worker                 << bindDelayMs;
323*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
324*d57664e9SAndroid Build Coastguard Worker     }
bindToDataLoaderOkWith10000sDelay(int32_t mountId,const DataLoaderParamsParcel & params,int bindDelayMs,const sp<IDataLoaderStatusListener> & listener,bool * _aidl_return)325*d57664e9SAndroid Build Coastguard Worker     binder::Status bindToDataLoaderOkWith10000sDelay(int32_t mountId,
326*d57664e9SAndroid Build Coastguard Worker                                                      const DataLoaderParamsParcel& params,
327*d57664e9SAndroid Build Coastguard Worker                                                      int bindDelayMs,
328*d57664e9SAndroid Build Coastguard Worker                                                      const sp<IDataLoaderStatusListener>& listener,
329*d57664e9SAndroid Build Coastguard Worker                                                      bool* _aidl_return) {
330*d57664e9SAndroid Build Coastguard Worker         CHECK(100 * 9 * 9 * 9 * 9 * 9 < bindDelayMs && bindDelayMs < 100 * 11 * 11 * 11 * 11 * 11)
331*d57664e9SAndroid Build Coastguard Worker                 << bindDelayMs;
332*d57664e9SAndroid Build Coastguard Worker         return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
333*d57664e9SAndroid Build Coastguard Worker     }
334*d57664e9SAndroid Build Coastguard Worker 
getDataLoaderOk(int32_t mountId,sp<IDataLoader> * _aidl_return)335*d57664e9SAndroid Build Coastguard Worker     binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
336*d57664e9SAndroid Build Coastguard Worker         *_aidl_return = mDataLoader;
337*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
338*d57664e9SAndroid Build Coastguard Worker     }
setDataLoaderStatusCreated()339*d57664e9SAndroid Build Coastguard Worker     void setDataLoaderStatusCreated() {
340*d57664e9SAndroid Build Coastguard Worker         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
341*d57664e9SAndroid Build Coastguard Worker     }
setDataLoaderStatusStarted()342*d57664e9SAndroid Build Coastguard Worker     void setDataLoaderStatusStarted() {
343*d57664e9SAndroid Build Coastguard Worker         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
344*d57664e9SAndroid Build Coastguard Worker     }
setDataLoaderStatusDestroyed()345*d57664e9SAndroid Build Coastguard Worker     void setDataLoaderStatusDestroyed() {
346*d57664e9SAndroid Build Coastguard Worker         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
347*d57664e9SAndroid Build Coastguard Worker     }
setDataLoaderStatusUnavailable()348*d57664e9SAndroid Build Coastguard Worker     void setDataLoaderStatusUnavailable() {
349*d57664e9SAndroid Build Coastguard Worker         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
350*d57664e9SAndroid Build Coastguard Worker     }
setDataLoaderStatusUnrecoverable()351*d57664e9SAndroid Build Coastguard Worker     void setDataLoaderStatusUnrecoverable() {
352*d57664e9SAndroid Build Coastguard Worker         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
353*d57664e9SAndroid Build Coastguard Worker     }
unbindFromDataLoaderOk(int32_t id)354*d57664e9SAndroid Build Coastguard Worker     binder::Status unbindFromDataLoaderOk(int32_t id) {
355*d57664e9SAndroid Build Coastguard Worker         mBindDelayMs = -1;
356*d57664e9SAndroid Build Coastguard Worker         if (mDataLoader) {
357*d57664e9SAndroid Build Coastguard Worker             if (auto status = mDataLoader->destroy(id); !status.isOk()) {
358*d57664e9SAndroid Build Coastguard Worker                 return status;
359*d57664e9SAndroid Build Coastguard Worker             }
360*d57664e9SAndroid Build Coastguard Worker             mDataLoader = nullptr;
361*d57664e9SAndroid Build Coastguard Worker         } else if (mListener) {
362*d57664e9SAndroid Build Coastguard Worker             mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
363*d57664e9SAndroid Build Coastguard Worker         }
364*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
365*d57664e9SAndroid Build Coastguard Worker     }
366*d57664e9SAndroid Build Coastguard Worker 
bindDelayMs() const367*d57664e9SAndroid Build Coastguard Worker     int bindDelayMs() const { return mBindDelayMs; }
368*d57664e9SAndroid Build Coastguard Worker 
369*d57664e9SAndroid Build Coastguard Worker private:
370*d57664e9SAndroid Build Coastguard Worker     int mId = -1;
371*d57664e9SAndroid Build Coastguard Worker     int mBindDelayMs = -1;
372*d57664e9SAndroid Build Coastguard Worker     sp<IDataLoaderStatusListener> mListener;
373*d57664e9SAndroid Build Coastguard Worker     sp<IDataLoader> mDataLoader;
374*d57664e9SAndroid Build Coastguard Worker     sp<IDataLoader> mDataLoaderHolder;
375*d57664e9SAndroid Build Coastguard Worker };
376*d57664e9SAndroid Build Coastguard Worker 
377*d57664e9SAndroid Build Coastguard Worker class MockIncFs : public IncFsWrapper {
378*d57664e9SAndroid Build Coastguard Worker public:
379*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(features, Features());
380*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
381*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
382*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD4(createControl,
383*d57664e9SAndroid Build Coastguard Worker                        Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
384*d57664e9SAndroid Build Coastguard Worker                                IncFsFd blocksWritten));
385*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD5(makeFile,
386*d57664e9SAndroid Build Coastguard Worker                        ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
387*d57664e9SAndroid Build Coastguard Worker                                  NewFileParams params));
388*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD4(makeMappedFile,
389*d57664e9SAndroid Build Coastguard Worker                        ErrorCode(const Control& control, std::string_view path, int mode,
390*d57664e9SAndroid Build Coastguard Worker                                  NewMappedFileParams params));
391*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
392*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(makeDirs,
393*d57664e9SAndroid Build Coastguard Worker                        ErrorCode(const Control& control, std::string_view path, int mode));
394*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
395*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
396*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
397*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(countFilledBlocks,
398*d57664e9SAndroid Build Coastguard Worker                        std::pair<IncFsBlockIndex, IncFsBlockIndex>(const Control& control,
399*d57664e9SAndroid Build Coastguard Worker                                                                    std::string_view path));
400*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(isFileFullyLoaded,
401*d57664e9SAndroid Build Coastguard Worker                        incfs::LoadingState(const Control& control, std::string_view path));
402*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(isFileFullyLoaded, incfs::LoadingState(const Control& control, FileId id));
403*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(isEverythingFullyLoaded, incfs::LoadingState(const Control& control));
404*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(link,
405*d57664e9SAndroid Build Coastguard Worker                        ErrorCode(const Control& control, std::string_view from,
406*d57664e9SAndroid Build Coastguard Worker                                  std::string_view to));
407*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
408*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(openForSpecialOps, UniqueFd(const Control& control, FileId id));
409*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
410*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(reserveSpace, ErrorCode(const Control& control, FileId id, IncFsSize size));
411*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(waitForPendingReads,
412*d57664e9SAndroid Build Coastguard Worker                        WaitResult(const Control& control, std::chrono::milliseconds timeout,
413*d57664e9SAndroid Build Coastguard Worker                                   std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer));
414*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(setUidReadTimeouts,
415*d57664e9SAndroid Build Coastguard Worker                        ErrorCode(const Control& control,
416*d57664e9SAndroid Build Coastguard Worker                                  const std::vector<PerUidReadTimeouts>& perUidReadTimeouts));
417*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
418*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
419*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(getMetrics, std::optional<Metrics>(std::string_view path));
420*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(getLastReadError, std::optional<LastReadError>(const Control& control));
421*d57664e9SAndroid Build Coastguard Worker 
MockIncFs()422*d57664e9SAndroid Build Coastguard Worker     MockIncFs() {
423*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());
424*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, reserveSpace(_, _, _)).WillByDefault(Return(0));
425*d57664e9SAndroid Build Coastguard Worker     }
426*d57664e9SAndroid Build Coastguard Worker 
makeFileFails()427*d57664e9SAndroid Build Coastguard Worker     void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
makeFileSuccess()428*d57664e9SAndroid Build Coastguard Worker     void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
429*d57664e9SAndroid Build Coastguard Worker 
countFilledBlocksSuccess()430*d57664e9SAndroid Build Coastguard Worker     void countFilledBlocksSuccess() {
431*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(1, 2)));
432*d57664e9SAndroid Build Coastguard Worker     }
433*d57664e9SAndroid Build Coastguard Worker 
countFilledBlocksFullyLoaded()434*d57664e9SAndroid Build Coastguard Worker     void countFilledBlocksFullyLoaded() {
435*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(10000, 10000)));
436*d57664e9SAndroid Build Coastguard Worker     }
437*d57664e9SAndroid Build Coastguard Worker 
countFilledBlocksFails()438*d57664e9SAndroid Build Coastguard Worker     void countFilledBlocksFails() {
439*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(-1, -1)));
440*d57664e9SAndroid Build Coastguard Worker     }
441*d57664e9SAndroid Build Coastguard Worker 
countFilledBlocksEmpty()442*d57664e9SAndroid Build Coastguard Worker     void countFilledBlocksEmpty() {
443*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, countFilledBlocks(_, _)).WillByDefault(Return(std::make_pair(0, 0)));
444*d57664e9SAndroid Build Coastguard Worker     }
445*d57664e9SAndroid Build Coastguard Worker 
openMountSuccess()446*d57664e9SAndroid Build Coastguard Worker     void openMountSuccess() {
447*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth));
448*d57664e9SAndroid Build Coastguard Worker     }
449*d57664e9SAndroid Build Coastguard Worker 
450*d57664e9SAndroid Build Coastguard Worker     // 1000ms
waitForPendingReadsSuccess(uint64_t ts=0)451*d57664e9SAndroid Build Coastguard Worker     void waitForPendingReadsSuccess(uint64_t ts = 0) {
452*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, waitForPendingReads(_, _, _))
453*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(
454*d57664e9SAndroid Build Coastguard Worker                         Invoke([ts](const Control& control, std::chrono::milliseconds timeout,
455*d57664e9SAndroid Build Coastguard Worker                                     std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) {
456*d57664e9SAndroid Build Coastguard Worker                             pendingReadsBuffer->push_back({.bootClockTsUs = ts});
457*d57664e9SAndroid Build Coastguard Worker                             return android::incfs::WaitResult::HaveData;
458*d57664e9SAndroid Build Coastguard Worker                         }));
459*d57664e9SAndroid Build Coastguard Worker     }
460*d57664e9SAndroid Build Coastguard Worker 
waitForPendingReadsTimeout()461*d57664e9SAndroid Build Coastguard Worker     void waitForPendingReadsTimeout() {
462*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, waitForPendingReads(_, _, _))
463*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Return(android::incfs::WaitResult::Timeout));
464*d57664e9SAndroid Build Coastguard Worker     }
465*d57664e9SAndroid Build Coastguard Worker 
466*d57664e9SAndroid Build Coastguard Worker     static constexpr auto kPendingReadsFd = 42;
openMountForHealth(std::string_view)467*d57664e9SAndroid Build Coastguard Worker     Control openMountForHealth(std::string_view) {
468*d57664e9SAndroid Build Coastguard Worker         return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1, -1));
469*d57664e9SAndroid Build Coastguard Worker     }
470*d57664e9SAndroid Build Coastguard Worker 
getMountInfoMetadata(const Control & control,std::string_view path)471*d57664e9SAndroid Build Coastguard Worker     RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
472*d57664e9SAndroid Build Coastguard Worker         metadata::Mount m;
473*d57664e9SAndroid Build Coastguard Worker         m.mutable_storage()->set_id(100);
474*d57664e9SAndroid Build Coastguard Worker         m.mutable_loader()->set_package_name("com.test");
475*d57664e9SAndroid Build Coastguard Worker         m.mutable_loader()->set_arguments("com.uri");
476*d57664e9SAndroid Build Coastguard Worker         const auto metadata = m.SerializeAsString();
477*d57664e9SAndroid Build Coastguard Worker         static_cast<void>(m.mutable_loader()->release_arguments());
478*d57664e9SAndroid Build Coastguard Worker         static_cast<void>(m.mutable_loader()->release_package_name());
479*d57664e9SAndroid Build Coastguard Worker         return {metadata.begin(), metadata.end()};
480*d57664e9SAndroid Build Coastguard Worker     }
getStorageMetadata(const Control & control,std::string_view path)481*d57664e9SAndroid Build Coastguard Worker     RawMetadata getStorageMetadata(const Control& control, std::string_view path) {
482*d57664e9SAndroid Build Coastguard Worker         metadata::Storage st;
483*d57664e9SAndroid Build Coastguard Worker         st.set_id(100);
484*d57664e9SAndroid Build Coastguard Worker         auto metadata = st.SerializeAsString();
485*d57664e9SAndroid Build Coastguard Worker         return {metadata.begin(), metadata.end()};
486*d57664e9SAndroid Build Coastguard Worker     }
getBindPointMetadata(const Control & control,std::string_view path)487*d57664e9SAndroid Build Coastguard Worker     RawMetadata getBindPointMetadata(const Control& control, std::string_view path) {
488*d57664e9SAndroid Build Coastguard Worker         metadata::BindPoint bp;
489*d57664e9SAndroid Build Coastguard Worker         std::string destPath = "dest";
490*d57664e9SAndroid Build Coastguard Worker         std::string srcPath = "src";
491*d57664e9SAndroid Build Coastguard Worker         bp.set_storage_id(100);
492*d57664e9SAndroid Build Coastguard Worker         bp.set_allocated_dest_path(&destPath);
493*d57664e9SAndroid Build Coastguard Worker         bp.set_allocated_source_subdir(&srcPath);
494*d57664e9SAndroid Build Coastguard Worker         const auto metadata = bp.SerializeAsString();
495*d57664e9SAndroid Build Coastguard Worker         static_cast<void>(bp.release_source_subdir());
496*d57664e9SAndroid Build Coastguard Worker         static_cast<void>(bp.release_dest_path());
497*d57664e9SAndroid Build Coastguard Worker         return std::vector<char>(metadata.begin(), metadata.end());
498*d57664e9SAndroid Build Coastguard Worker     }
499*d57664e9SAndroid Build Coastguard Worker };
500*d57664e9SAndroid Build Coastguard Worker 
501*d57664e9SAndroid Build Coastguard Worker class MockAppOpsManager : public AppOpsManagerWrapper {
502*d57664e9SAndroid Build Coastguard Worker public:
503*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD3(checkPermission, binder::Status(const char*, const char*, const char*));
504*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&));
505*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(stopWatchingMode, void(const sp<IAppOpsCallback>&));
506*d57664e9SAndroid Build Coastguard Worker 
checkPermissionSuccess()507*d57664e9SAndroid Build Coastguard Worker     void checkPermissionSuccess() {
508*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, checkPermission(_, _, _)).WillByDefault(Return(android::incremental::Ok()));
509*d57664e9SAndroid Build Coastguard Worker     }
checkPermissionNoCrossUsers()510*d57664e9SAndroid Build Coastguard Worker     void checkPermissionNoCrossUsers() {
511*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this,
512*d57664e9SAndroid Build Coastguard Worker                 checkPermission("android.permission.LOADER_USAGE_STATS",
513*d57664e9SAndroid Build Coastguard Worker                                 "android:loader_usage_stats", _))
514*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Return(android::incremental::Ok()));
515*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, checkPermission("android.permission.INTERACT_ACROSS_USERS", nullptr, _))
516*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(
517*d57664e9SAndroid Build Coastguard Worker                         Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
518*d57664e9SAndroid Build Coastguard Worker     }
checkPermissionFails()519*d57664e9SAndroid Build Coastguard Worker     void checkPermissionFails() {
520*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, checkPermission(_, _, _))
521*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(
522*d57664e9SAndroid Build Coastguard Worker                         Return(android::incremental::Exception(binder::Status::EX_SECURITY, {})));
523*d57664e9SAndroid Build Coastguard Worker     }
initializeStartWatchingMode()524*d57664e9SAndroid Build Coastguard Worker     void initializeStartWatchingMode() {
525*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, startWatchingMode(_, _, _))
526*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockAppOpsManager::storeCallback));
527*d57664e9SAndroid Build Coastguard Worker     }
storeCallback(int32_t,const String16 &,const sp<IAppOpsCallback> & cb)528*d57664e9SAndroid Build Coastguard Worker     void storeCallback(int32_t, const String16&, const sp<IAppOpsCallback>& cb) {
529*d57664e9SAndroid Build Coastguard Worker         mStoredCallback = cb;
530*d57664e9SAndroid Build Coastguard Worker     }
531*d57664e9SAndroid Build Coastguard Worker 
532*d57664e9SAndroid Build Coastguard Worker     sp<IAppOpsCallback> mStoredCallback;
533*d57664e9SAndroid Build Coastguard Worker };
534*d57664e9SAndroid Build Coastguard Worker 
535*d57664e9SAndroid Build Coastguard Worker class MockJniWrapper : public JniWrapper {
536*d57664e9SAndroid Build Coastguard Worker public:
537*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(initializeForCurrentThread, void());
538*d57664e9SAndroid Build Coastguard Worker 
MockJniWrapper()539*d57664e9SAndroid Build Coastguard Worker     MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); }
540*d57664e9SAndroid Build Coastguard Worker };
541*d57664e9SAndroid Build Coastguard Worker 
542*d57664e9SAndroid Build Coastguard Worker class MockLooperWrapper : public LooperWrapper {
543*d57664e9SAndroid Build Coastguard Worker public:
544*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*));
545*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(removeFd, int(int));
546*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD0(wake, void());
547*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(pollAll, int(int));
548*d57664e9SAndroid Build Coastguard Worker 
MockLooperWrapper()549*d57664e9SAndroid Build Coastguard Worker     MockLooperWrapper() {
550*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, addFd(_, _, _, _, _))
551*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback));
552*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback));
553*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::wait10Ms));
554*d57664e9SAndroid Build Coastguard Worker     }
555*d57664e9SAndroid Build Coastguard Worker 
storeCallback(int,int,int,android::Looper_callbackFunc callback,void * data)556*d57664e9SAndroid Build Coastguard Worker     int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) {
557*d57664e9SAndroid Build Coastguard Worker         mCallback = callback;
558*d57664e9SAndroid Build Coastguard Worker         mCallbackData = data;
559*d57664e9SAndroid Build Coastguard Worker         return 0;
560*d57664e9SAndroid Build Coastguard Worker     }
561*d57664e9SAndroid Build Coastguard Worker 
clearCallback(int)562*d57664e9SAndroid Build Coastguard Worker     int clearCallback(int) {
563*d57664e9SAndroid Build Coastguard Worker         mCallback = nullptr;
564*d57664e9SAndroid Build Coastguard Worker         mCallbackData = nullptr;
565*d57664e9SAndroid Build Coastguard Worker         return 0;
566*d57664e9SAndroid Build Coastguard Worker     }
567*d57664e9SAndroid Build Coastguard Worker 
wait10Ms(int)568*d57664e9SAndroid Build Coastguard Worker     int wait10Ms(int) {
569*d57664e9SAndroid Build Coastguard Worker         // This is called from a loop in runCmdLooper.
570*d57664e9SAndroid Build Coastguard Worker         // Sleeping for 10ms only to avoid busy looping.
571*d57664e9SAndroid Build Coastguard Worker         std::this_thread::sleep_for(10ms);
572*d57664e9SAndroid Build Coastguard Worker         return 0;
573*d57664e9SAndroid Build Coastguard Worker     }
574*d57664e9SAndroid Build Coastguard Worker 
575*d57664e9SAndroid Build Coastguard Worker     android::Looper_callbackFunc mCallback = nullptr;
576*d57664e9SAndroid Build Coastguard Worker     void* mCallbackData = nullptr;
577*d57664e9SAndroid Build Coastguard Worker };
578*d57664e9SAndroid Build Coastguard Worker 
579*d57664e9SAndroid Build Coastguard Worker class MockTimedQueueWrapper : public TimedQueueWrapper {
580*d57664e9SAndroid Build Coastguard Worker public:
581*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD3(addJob, void(MountId, Milliseconds, Job));
582*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD1(removeJobs, void(MountId));
583*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD0(stop, void());
584*d57664e9SAndroid Build Coastguard Worker 
MockTimedQueueWrapper()585*d57664e9SAndroid Build Coastguard Worker     MockTimedQueueWrapper() {
586*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, addJob(_, _, _))
587*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockTimedQueueWrapper::storeJob));
588*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, removeJobs(_)).WillByDefault(Invoke(this, &MockTimedQueueWrapper::clearJob));
589*d57664e9SAndroid Build Coastguard Worker     }
590*d57664e9SAndroid Build Coastguard Worker 
storeJob(MountId id,Milliseconds after,Job what)591*d57664e9SAndroid Build Coastguard Worker     void storeJob(MountId id, Milliseconds after, Job what) {
592*d57664e9SAndroid Build Coastguard Worker         mId = id;
593*d57664e9SAndroid Build Coastguard Worker         mAfter = after;
594*d57664e9SAndroid Build Coastguard Worker         mWhat = std::move(what);
595*d57664e9SAndroid Build Coastguard Worker     }
596*d57664e9SAndroid Build Coastguard Worker 
clearJob(MountId id)597*d57664e9SAndroid Build Coastguard Worker     void clearJob(MountId id) {
598*d57664e9SAndroid Build Coastguard Worker         if (mId == id) {
599*d57664e9SAndroid Build Coastguard Worker             mAfter = {};
600*d57664e9SAndroid Build Coastguard Worker             mWhat = {};
601*d57664e9SAndroid Build Coastguard Worker         }
602*d57664e9SAndroid Build Coastguard Worker     }
603*d57664e9SAndroid Build Coastguard Worker 
604*d57664e9SAndroid Build Coastguard Worker     MountId mId = -1;
605*d57664e9SAndroid Build Coastguard Worker     Milliseconds mAfter;
606*d57664e9SAndroid Build Coastguard Worker     Job mWhat;
607*d57664e9SAndroid Build Coastguard Worker };
608*d57664e9SAndroid Build Coastguard Worker 
609*d57664e9SAndroid Build Coastguard Worker class MockFsWrapper : public FsWrapper {
610*d57664e9SAndroid Build Coastguard Worker public:
611*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(listFilesRecursive, void(std::string_view, FileCallback));
hasNoFile()612*d57664e9SAndroid Build Coastguard Worker     void hasNoFile() { ON_CALL(*this, listFilesRecursive(_, _)).WillByDefault(Return()); }
hasFiles()613*d57664e9SAndroid Build Coastguard Worker     void hasFiles() {
614*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, listFilesRecursive(_, _))
615*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockFsWrapper::fakeFiles));
616*d57664e9SAndroid Build Coastguard Worker     }
fakeFiles(std::string_view directoryPath,FileCallback onFile)617*d57664e9SAndroid Build Coastguard Worker     void fakeFiles(std::string_view directoryPath, FileCallback onFile) {
618*d57664e9SAndroid Build Coastguard Worker         for (auto file : {"base.apk", "split.apk", "lib/a.so"}) {
619*d57664e9SAndroid Build Coastguard Worker             if (!onFile(file)) break;
620*d57664e9SAndroid Build Coastguard Worker         }
621*d57664e9SAndroid Build Coastguard Worker     }
622*d57664e9SAndroid Build Coastguard Worker };
623*d57664e9SAndroid Build Coastguard Worker 
624*d57664e9SAndroid Build Coastguard Worker class MockClockWrapper : public ClockWrapper {
625*d57664e9SAndroid Build Coastguard Worker public:
626*d57664e9SAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(now, TimePoint());
627*d57664e9SAndroid Build Coastguard Worker 
start()628*d57664e9SAndroid Build Coastguard Worker     void start() { ON_CALL(*this, now()).WillByDefault(Invoke(this, &MockClockWrapper::getClock)); }
629*d57664e9SAndroid Build Coastguard Worker 
630*d57664e9SAndroid Build Coastguard Worker     template <class Delta>
advance(Delta delta)631*d57664e9SAndroid Build Coastguard Worker     void advance(Delta delta) {
632*d57664e9SAndroid Build Coastguard Worker         mClock += delta;
633*d57664e9SAndroid Build Coastguard Worker     }
634*d57664e9SAndroid Build Coastguard Worker 
advanceMs(int deltaMs)635*d57664e9SAndroid Build Coastguard Worker     void advanceMs(int deltaMs) { mClock += std::chrono::milliseconds(deltaMs); }
636*d57664e9SAndroid Build Coastguard Worker 
getClock() const637*d57664e9SAndroid Build Coastguard Worker     TimePoint getClock() const { return mClock; }
getClockMono() const638*d57664e9SAndroid Build Coastguard Worker     std::optional<timespec> getClockMono() const {
639*d57664e9SAndroid Build Coastguard Worker         const auto nsSinceEpoch =
640*d57664e9SAndroid Build Coastguard Worker                 std::chrono::duration_cast<std::chrono::nanoseconds>(mClock.time_since_epoch())
641*d57664e9SAndroid Build Coastguard Worker                         .count();
642*d57664e9SAndroid Build Coastguard Worker         timespec ts = {.tv_sec = static_cast<time_t>(nsSinceEpoch / 1000000000LL),
643*d57664e9SAndroid Build Coastguard Worker                        .tv_nsec = static_cast<long>(nsSinceEpoch % 1000000000LL)};
644*d57664e9SAndroid Build Coastguard Worker         return ts;
645*d57664e9SAndroid Build Coastguard Worker     }
646*d57664e9SAndroid Build Coastguard Worker 
647*d57664e9SAndroid Build Coastguard Worker     TimePoint mClock = Clock::now();
648*d57664e9SAndroid Build Coastguard Worker };
649*d57664e9SAndroid Build Coastguard Worker 
650*d57664e9SAndroid Build Coastguard Worker class MockStorageHealthListener : public os::incremental::BnStorageHealthListener {
651*d57664e9SAndroid Build Coastguard Worker public:
652*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD2(onHealthStatus, binder::Status(int32_t storageId, int32_t status));
653*d57664e9SAndroid Build Coastguard Worker 
MockStorageHealthListener()654*d57664e9SAndroid Build Coastguard Worker     MockStorageHealthListener() {
655*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*this, onHealthStatus(_, _))
656*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(this, &MockStorageHealthListener::storeStorageIdAndStatus));
657*d57664e9SAndroid Build Coastguard Worker     }
658*d57664e9SAndroid Build Coastguard Worker 
storeStorageIdAndStatus(int32_t storageId,int32_t status)659*d57664e9SAndroid Build Coastguard Worker     binder::Status storeStorageIdAndStatus(int32_t storageId, int32_t status) {
660*d57664e9SAndroid Build Coastguard Worker         mStorageId = storageId;
661*d57664e9SAndroid Build Coastguard Worker         mStatus = status;
662*d57664e9SAndroid Build Coastguard Worker         return binder::Status::ok();
663*d57664e9SAndroid Build Coastguard Worker     }
664*d57664e9SAndroid Build Coastguard Worker 
665*d57664e9SAndroid Build Coastguard Worker     int32_t mStorageId = -1;
666*d57664e9SAndroid Build Coastguard Worker     int32_t mStatus = -1;
667*d57664e9SAndroid Build Coastguard Worker };
668*d57664e9SAndroid Build Coastguard Worker 
669*d57664e9SAndroid Build Coastguard Worker class MockStorageLoadingProgressListener : public IStorageLoadingProgressListener {
670*d57664e9SAndroid Build Coastguard Worker public:
671*d57664e9SAndroid Build Coastguard Worker     MockStorageLoadingProgressListener() = default;
672*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD2(onStorageLoadingProgressChanged,
673*d57664e9SAndroid Build Coastguard Worker                  binder::Status(int32_t storageId, float progress));
674*d57664e9SAndroid Build Coastguard Worker     MOCK_METHOD0(onAsBinder, IBinder*());
675*d57664e9SAndroid Build Coastguard Worker };
676*d57664e9SAndroid Build Coastguard Worker 
677*d57664e9SAndroid Build Coastguard Worker class MockServiceManager : public ServiceManagerWrapper {
678*d57664e9SAndroid Build Coastguard Worker public:
MockServiceManager(std::unique_ptr<MockVoldService> vold,std::unique_ptr<MockDataLoaderManager> dataLoaderManager,std::unique_ptr<MockIncFs> incfs,std::unique_ptr<MockAppOpsManager> appOpsManager,std::unique_ptr<MockJniWrapper> jni,std::unique_ptr<MockLooperWrapper> looper,std::unique_ptr<MockTimedQueueWrapper> timedQueue,std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,std::unique_ptr<MockFsWrapper> fs,std::unique_ptr<MockClockWrapper> clock)679*d57664e9SAndroid Build Coastguard Worker     MockServiceManager(std::unique_ptr<MockVoldService> vold,
680*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockDataLoaderManager> dataLoaderManager,
681*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockIncFs> incfs,
682*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockAppOpsManager> appOpsManager,
683*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockJniWrapper> jni,
684*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockLooperWrapper> looper,
685*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockTimedQueueWrapper> timedQueue,
686*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockTimedQueueWrapper> progressUpdateJobQueue,
687*d57664e9SAndroid Build Coastguard Worker                        std::unique_ptr<MockFsWrapper> fs, std::unique_ptr<MockClockWrapper> clock)
688*d57664e9SAndroid Build Coastguard Worker           : mVold(std::move(vold)),
689*d57664e9SAndroid Build Coastguard Worker             mDataLoaderManager(std::move(dataLoaderManager)),
690*d57664e9SAndroid Build Coastguard Worker             mIncFs(std::move(incfs)),
691*d57664e9SAndroid Build Coastguard Worker             mAppOpsManager(std::move(appOpsManager)),
692*d57664e9SAndroid Build Coastguard Worker             mJni(std::move(jni)),
693*d57664e9SAndroid Build Coastguard Worker             mLooper(std::move(looper)),
694*d57664e9SAndroid Build Coastguard Worker             mTimedQueue(std::move(timedQueue)),
695*d57664e9SAndroid Build Coastguard Worker             mProgressUpdateJobQueue(std::move(progressUpdateJobQueue)),
696*d57664e9SAndroid Build Coastguard Worker             mFs(std::move(fs)),
697*d57664e9SAndroid Build Coastguard Worker             mClock(std::move(clock)) {}
getVoldService()698*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); }
getDataLoaderManager()699*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final {
700*d57664e9SAndroid Build Coastguard Worker         return std::move(mDataLoaderManager);
701*d57664e9SAndroid Build Coastguard Worker     }
getIncFs()702*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); }
getAppOpsManager()703*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final {
704*d57664e9SAndroid Build Coastguard Worker         return std::move(mAppOpsManager);
705*d57664e9SAndroid Build Coastguard Worker     }
getJni()706*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); }
getLooper()707*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); }
getTimedQueue()708*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<TimedQueueWrapper> getTimedQueue() final { return std::move(mTimedQueue); }
getProgressUpdateJobQueue()709*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final {
710*d57664e9SAndroid Build Coastguard Worker         return std::move(mProgressUpdateJobQueue);
711*d57664e9SAndroid Build Coastguard Worker     }
getFs()712*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<FsWrapper> getFs() final { return std::move(mFs); }
getClock()713*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<ClockWrapper> getClock() final { return std::move(mClock); }
714*d57664e9SAndroid Build Coastguard Worker 
715*d57664e9SAndroid Build Coastguard Worker private:
716*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockVoldService> mVold;
717*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockDataLoaderManager> mDataLoaderManager;
718*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockIncFs> mIncFs;
719*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockAppOpsManager> mAppOpsManager;
720*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockJniWrapper> mJni;
721*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockLooperWrapper> mLooper;
722*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockTimedQueueWrapper> mTimedQueue;
723*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockTimedQueueWrapper> mProgressUpdateJobQueue;
724*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockFsWrapper> mFs;
725*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<MockClockWrapper> mClock;
726*d57664e9SAndroid Build Coastguard Worker };
727*d57664e9SAndroid Build Coastguard Worker 
728*d57664e9SAndroid Build Coastguard Worker // --- IncrementalServiceTest ---
729*d57664e9SAndroid Build Coastguard Worker 
730*d57664e9SAndroid Build Coastguard Worker class IncrementalServiceTest : public testing::Test {
731*d57664e9SAndroid Build Coastguard Worker public:
SetUp()732*d57664e9SAndroid Build Coastguard Worker     void SetUp() override {
733*d57664e9SAndroid Build Coastguard Worker         auto vold = std::make_unique<NiceMock<MockVoldService>>();
734*d57664e9SAndroid Build Coastguard Worker         mVold = vold.get();
735*d57664e9SAndroid Build Coastguard Worker         sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
736*d57664e9SAndroid Build Coastguard Worker         mDataLoader = dataLoader.get();
737*d57664e9SAndroid Build Coastguard Worker         auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
738*d57664e9SAndroid Build Coastguard Worker         mDataLoaderManager = dataloaderManager.get();
739*d57664e9SAndroid Build Coastguard Worker         auto incFs = std::make_unique<NiceMock<MockIncFs>>();
740*d57664e9SAndroid Build Coastguard Worker         mIncFs = incFs.get();
741*d57664e9SAndroid Build Coastguard Worker         auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>();
742*d57664e9SAndroid Build Coastguard Worker         mAppOpsManager = appOps.get();
743*d57664e9SAndroid Build Coastguard Worker         auto jni = std::make_unique<NiceMock<MockJniWrapper>>();
744*d57664e9SAndroid Build Coastguard Worker         mJni = jni.get();
745*d57664e9SAndroid Build Coastguard Worker         auto looper = std::make_unique<NiceMock<MockLooperWrapper>>();
746*d57664e9SAndroid Build Coastguard Worker         mLooper = looper.get();
747*d57664e9SAndroid Build Coastguard Worker         auto timedQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
748*d57664e9SAndroid Build Coastguard Worker         mTimedQueue = timedQueue.get();
749*d57664e9SAndroid Build Coastguard Worker         auto progressUpdateJobQueue = std::make_unique<NiceMock<MockTimedQueueWrapper>>();
750*d57664e9SAndroid Build Coastguard Worker         mProgressUpdateJobQueue = progressUpdateJobQueue.get();
751*d57664e9SAndroid Build Coastguard Worker         auto fs = std::make_unique<NiceMock<MockFsWrapper>>();
752*d57664e9SAndroid Build Coastguard Worker         mFs = fs.get();
753*d57664e9SAndroid Build Coastguard Worker         auto clock = std::make_unique<NiceMock<MockClockWrapper>>();
754*d57664e9SAndroid Build Coastguard Worker         mClock = clock.get();
755*d57664e9SAndroid Build Coastguard Worker         mIncrementalService = std::make_unique<
756*d57664e9SAndroid Build Coastguard Worker                 IncrementalService>(MockServiceManager(std::move(vold),
757*d57664e9SAndroid Build Coastguard Worker                                                        std::move(dataloaderManager),
758*d57664e9SAndroid Build Coastguard Worker                                                        std::move(incFs), std::move(appOps),
759*d57664e9SAndroid Build Coastguard Worker                                                        std::move(jni), std::move(looper),
760*d57664e9SAndroid Build Coastguard Worker                                                        std::move(timedQueue),
761*d57664e9SAndroid Build Coastguard Worker                                                        std::move(progressUpdateJobQueue),
762*d57664e9SAndroid Build Coastguard Worker                                                        std::move(fs), std::move(clock)),
763*d57664e9SAndroid Build Coastguard Worker                                     mRootDir.path);
764*d57664e9SAndroid Build Coastguard Worker         mDataLoaderParcel.packageName = "com.test";
765*d57664e9SAndroid Build Coastguard Worker         mDataLoaderParcel.arguments = "uri";
766*d57664e9SAndroid Build Coastguard Worker         mDataLoaderManager->unbindFromDataLoaderSuccess();
767*d57664e9SAndroid Build Coastguard Worker         mIncrementalService->onSystemReady();
768*d57664e9SAndroid Build Coastguard Worker         mClock->start();
769*d57664e9SAndroid Build Coastguard Worker         setupSuccess();
770*d57664e9SAndroid Build Coastguard Worker     }
771*d57664e9SAndroid Build Coastguard Worker 
setUpExistingMountDir(const std::string & rootDir)772*d57664e9SAndroid Build Coastguard Worker     void setUpExistingMountDir(const std::string& rootDir) {
773*d57664e9SAndroid Build Coastguard Worker         const auto dir = rootDir + "/dir1";
774*d57664e9SAndroid Build Coastguard Worker         const auto mountDir = dir + "/mount";
775*d57664e9SAndroid Build Coastguard Worker         const auto backingDir = dir + "/backing_store";
776*d57664e9SAndroid Build Coastguard Worker         const auto storageDir = mountDir + "/st0";
777*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(0, mkdir(dir.c_str(), 0755));
778*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(0, mkdir(mountDir.c_str(), 0755));
779*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(0, mkdir(backingDir.c_str(), 0755));
780*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(0, mkdir(storageDir.c_str(), 0755));
781*d57664e9SAndroid Build Coastguard Worker         const auto mountInfoFile = rootDir + "/dir1/mount/.info";
782*d57664e9SAndroid Build Coastguard Worker         const auto mountPointsFile = rootDir + "/dir1/mount/.mountpoint.abcd";
783*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(base::WriteStringToFile("info", mountInfoFile));
784*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(base::WriteStringToFile("mounts", mountPointsFile));
785*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountInfoFile)))
786*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(mIncFs, &MockIncFs::getMountInfoMetadata));
787*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*mIncFs, getMetadata(_, std::string_view(mountPointsFile)))
788*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(mIncFs, &MockIncFs::getBindPointMetadata));
789*d57664e9SAndroid Build Coastguard Worker         ON_CALL(*mIncFs, getMetadata(_, std::string_view(rootDir + "/dir1/mount/st0")))
790*d57664e9SAndroid Build Coastguard Worker                 .WillByDefault(Invoke(mIncFs, &MockIncFs::getStorageMetadata));
791*d57664e9SAndroid Build Coastguard Worker     }
792*d57664e9SAndroid Build Coastguard Worker 
setupSuccess()793*d57664e9SAndroid Build Coastguard Worker     void setupSuccess() {
794*d57664e9SAndroid Build Coastguard Worker         mVold->mountIncFsSuccess();
795*d57664e9SAndroid Build Coastguard Worker         mIncFs->makeFileSuccess();
796*d57664e9SAndroid Build Coastguard Worker         mVold->bindMountSuccess();
797*d57664e9SAndroid Build Coastguard Worker         mDataLoaderManager->bindToDataLoaderSuccess();
798*d57664e9SAndroid Build Coastguard Worker         mDataLoaderManager->getDataLoaderSuccess();
799*d57664e9SAndroid Build Coastguard Worker     }
800*d57664e9SAndroid Build Coastguard Worker 
checkHealthMetrics(int storageId,long expectedMillisSinceOldestPendingRead,int expectedStorageHealthStatusCode)801*d57664e9SAndroid Build Coastguard Worker     void checkHealthMetrics(int storageId, long expectedMillisSinceOldestPendingRead,
802*d57664e9SAndroid Build Coastguard Worker                             int expectedStorageHealthStatusCode) {
803*d57664e9SAndroid Build Coastguard Worker         android::os::PersistableBundle result{};
804*d57664e9SAndroid Build Coastguard Worker         mIncrementalService->getMetrics(storageId, &result);
805*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(6, (int)result.size());
806*d57664e9SAndroid Build Coastguard Worker         int64_t millisSinceOldestPendingRead = -1;
807*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
808*d57664e9SAndroid Build Coastguard Worker                                                     METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
809*d57664e9SAndroid Build Coastguard Worker                                                             .c_str()),
810*d57664e9SAndroid Build Coastguard Worker                                    &millisSinceOldestPendingRead));
811*d57664e9SAndroid Build Coastguard Worker         // Allow 10ms.
812*d57664e9SAndroid Build Coastguard Worker         ASSERT_LE(expectedMillisSinceOldestPendingRead, millisSinceOldestPendingRead);
813*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(expectedMillisSinceOldestPendingRead + 10, millisSinceOldestPendingRead);
814*d57664e9SAndroid Build Coastguard Worker         int storageHealthStatusCode = -1;
815*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(
816*d57664e9SAndroid Build Coastguard Worker                 result.getInt(String16(BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE()
817*d57664e9SAndroid Build Coastguard Worker                                                .c_str()),
818*d57664e9SAndroid Build Coastguard Worker                               &storageHealthStatusCode));
819*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(expectedStorageHealthStatusCode, storageHealthStatusCode);
820*d57664e9SAndroid Build Coastguard Worker         int dataLoaderStatusCode = -1;
821*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
822*d57664e9SAndroid Build Coastguard Worker                                                    .c_str()),
823*d57664e9SAndroid Build Coastguard Worker                                   &dataLoaderStatusCode));
824*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatusCode);
825*d57664e9SAndroid Build Coastguard Worker     }
826*d57664e9SAndroid Build Coastguard Worker 
checkBindingMetrics(int storageId,int64_t expectedMillisSinceLastDataLoaderBind,int64_t expectedDataLoaderBindDelayMillis)827*d57664e9SAndroid Build Coastguard Worker     void checkBindingMetrics(int storageId, int64_t expectedMillisSinceLastDataLoaderBind,
828*d57664e9SAndroid Build Coastguard Worker                              int64_t expectedDataLoaderBindDelayMillis) {
829*d57664e9SAndroid Build Coastguard Worker         android::os::PersistableBundle result{};
830*d57664e9SAndroid Build Coastguard Worker         mIncrementalService->getMetrics(storageId, &result);
831*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(6, (int)result.size());
832*d57664e9SAndroid Build Coastguard Worker         int dataLoaderStatus = -1;
833*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
834*d57664e9SAndroid Build Coastguard Worker                                                    .c_str()),
835*d57664e9SAndroid Build Coastguard Worker                                   &dataLoaderStatus));
836*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatus);
837*d57664e9SAndroid Build Coastguard Worker         int64_t millisSinceLastDataLoaderBind = -1;
838*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
839*d57664e9SAndroid Build Coastguard Worker                                                     METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND()
840*d57664e9SAndroid Build Coastguard Worker                                                             .c_str()),
841*d57664e9SAndroid Build Coastguard Worker                                    &millisSinceLastDataLoaderBind));
842*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(expectedMillisSinceLastDataLoaderBind, millisSinceLastDataLoaderBind);
843*d57664e9SAndroid Build Coastguard Worker         int64_t dataLoaderBindDelayMillis = -1;
844*d57664e9SAndroid Build Coastguard Worker         ASSERT_TRUE(
845*d57664e9SAndroid Build Coastguard Worker                 result.getLong(String16(
846*d57664e9SAndroid Build Coastguard Worker                                        BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS()
847*d57664e9SAndroid Build Coastguard Worker                                                .c_str()),
848*d57664e9SAndroid Build Coastguard Worker                                &dataLoaderBindDelayMillis));
849*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(expectedDataLoaderBindDelayMillis, dataLoaderBindDelayMillis);
850*d57664e9SAndroid Build Coastguard Worker     }
851*d57664e9SAndroid Build Coastguard Worker 
852*d57664e9SAndroid Build Coastguard Worker protected:
853*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockVoldService>* mVold = nullptr;
854*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockIncFs>* mIncFs = nullptr;
855*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr;
856*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr;
857*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockJniWrapper>* mJni = nullptr;
858*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockLooperWrapper>* mLooper = nullptr;
859*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockTimedQueueWrapper>* mTimedQueue = nullptr;
860*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockTimedQueueWrapper>* mProgressUpdateJobQueue = nullptr;
861*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockFsWrapper>* mFs = nullptr;
862*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockClockWrapper>* mClock = nullptr;
863*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockDataLoader>* mDataLoader = nullptr;
864*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<IncrementalService> mIncrementalService;
865*d57664e9SAndroid Build Coastguard Worker     TemporaryDir mRootDir;
866*d57664e9SAndroid Build Coastguard Worker     DataLoaderParamsParcel mDataLoaderParcel;
867*d57664e9SAndroid Build Coastguard Worker };
868*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testCreateStorageMountIncFsFails)869*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
870*d57664e9SAndroid Build Coastguard Worker     mVold->mountIncFsFails();
871*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
872*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
873*d57664e9SAndroid Build Coastguard Worker     int storageId =
874*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
875*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
876*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(storageId, 0);
877*d57664e9SAndroid Build Coastguard Worker }
878*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testCreateStorageMountIncFsInvalidControlParcel)879*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
880*d57664e9SAndroid Build Coastguard Worker     mVold->mountIncFsInvalidControlParcel();
881*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
882*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
883*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
884*d57664e9SAndroid Build Coastguard Worker     int storageId =
885*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
886*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
887*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(storageId, 0);
888*d57664e9SAndroid Build Coastguard Worker }
889*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testCreateStorageMakeFileFails)890*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
891*d57664e9SAndroid Build Coastguard Worker     mVold->mountIncFsSuccess();
892*d57664e9SAndroid Build Coastguard Worker     mIncFs->makeFileFails();
893*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
894*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
895*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_));
896*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
897*d57664e9SAndroid Build Coastguard Worker     int storageId =
898*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
899*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
900*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(storageId, 0);
901*d57664e9SAndroid Build Coastguard Worker }
902*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testCreateStorageBindMountFails)903*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testCreateStorageBindMountFails) {
904*d57664e9SAndroid Build Coastguard Worker     mVold->mountIncFsSuccess();
905*d57664e9SAndroid Build Coastguard Worker     mIncFs->makeFileSuccess();
906*d57664e9SAndroid Build Coastguard Worker     mVold->bindMountFails();
907*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(0);
908*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
909*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_));
910*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
911*d57664e9SAndroid Build Coastguard Worker     int storageId =
912*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
913*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
914*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(storageId, 0);
915*d57664e9SAndroid Build Coastguard Worker }
916*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testCreateStoragePrepareDataLoaderFails)917*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testCreateStoragePrepareDataLoaderFails) {
918*d57664e9SAndroid Build Coastguard Worker     mVold->mountIncFsSuccess();
919*d57664e9SAndroid Build Coastguard Worker     mIncFs->makeFileSuccess();
920*d57664e9SAndroid Build Coastguard Worker     mVold->bindMountSuccess();
921*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->bindToDataLoaderFails();
922*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
923*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
924*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
925*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
926*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
927*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
928*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
929*d57664e9SAndroid Build Coastguard Worker     int storageId =
930*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
931*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
932*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
933*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
934*d57664e9SAndroid Build Coastguard Worker }
935*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testDeleteStorageSuccess)936*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testDeleteStorageSuccess) {
937*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
938*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
939*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
940*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
941*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
942*d57664e9SAndroid Build Coastguard Worker     int storageId =
943*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
944*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
945*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
946*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
947*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->deleteStorage(storageId);
948*d57664e9SAndroid Build Coastguard Worker }
949*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testDataLoaderDestroyedAndDelayed)950*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testDataLoaderDestroyedAndDelayed) {
951*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(7);
952*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
953*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
954*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(7);
955*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
956*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
957*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
958*d57664e9SAndroid Build Coastguard Worker     int storageId =
959*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
960*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
961*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
962*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
963*d57664e9SAndroid Build Coastguard Worker 
964*d57664e9SAndroid Build Coastguard Worker     // Simulated crash/other connection breakage.
965*d57664e9SAndroid Build Coastguard Worker 
966*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
967*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
968*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
969*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, 0);
970*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
971*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, 0);
972*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
973*d57664e9SAndroid Build Coastguard Worker 
974*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
975*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
976*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
977*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
978*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
979*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
980*d57664e9SAndroid Build Coastguard Worker                         mDataLoaderManager->bindDelayMs());
981*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
982*d57664e9SAndroid Build Coastguard Worker 
983*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
984*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
985*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
986*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
987*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
988*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
989*d57664e9SAndroid Build Coastguard Worker                         mDataLoaderManager->bindDelayMs());
990*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
991*d57664e9SAndroid Build Coastguard Worker 
992*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
993*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
994*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
995*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
996*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
997*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
998*d57664e9SAndroid Build Coastguard Worker                         mDataLoaderManager->bindDelayMs());
999*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1000*d57664e9SAndroid Build Coastguard Worker 
1001*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1002*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1003*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1004*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
1005*d57664e9SAndroid Build Coastguard Worker     // Try the reduced delay, just in case.
1006*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
1007*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs() / 2,
1008*d57664e9SAndroid Build Coastguard Worker                         mDataLoaderManager->bindDelayMs());
1009*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1010*d57664e9SAndroid Build Coastguard Worker 
1011*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1012*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1013*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1014*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
1015*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1016*d57664e9SAndroid Build Coastguard Worker     checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
1017*d57664e9SAndroid Build Coastguard Worker                         mDataLoaderManager->bindDelayMs());
1018*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1019*d57664e9SAndroid Build Coastguard Worker }
1020*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testDataLoaderOnRestart)1021*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testDataLoaderOnRestart) {
1022*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess();
1023*d57664e9SAndroid Build Coastguard Worker     mIncFs->openMountSuccess();
1024*d57664e9SAndroid Build Coastguard Worker 
1025*d57664e9SAndroid Build Coastguard Worker     constexpr auto bindRetryInterval = 5s;
1026*d57664e9SAndroid Build Coastguard Worker 
1027*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(11);
1028*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1029*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(7);
1030*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(7);
1031*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1032*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1033*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
1034*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1035*d57664e9SAndroid Build Coastguard Worker     int storageId =
1036*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1037*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1038*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1039*d57664e9SAndroid Build Coastguard Worker 
1040*d57664e9SAndroid Build Coastguard Worker     // First binds to DataLoader fails... because it's restart.
1041*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1042*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1043*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderNotOkWithNoDelay));
1044*d57664e9SAndroid Build Coastguard Worker 
1045*d57664e9SAndroid Build Coastguard Worker     // Request DL start.
1046*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {}, {});
1047*d57664e9SAndroid Build Coastguard Worker 
1048*d57664e9SAndroid Build Coastguard Worker     // Retry callback present.
1049*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1050*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1051*d57664e9SAndroid Build Coastguard Worker     auto retryCallback = mTimedQueue->mWhat;
1052*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1053*d57664e9SAndroid Build Coastguard Worker 
1054*d57664e9SAndroid Build Coastguard Worker     // Expecting the same bindToDataLoaderNotOkWithNoDelay call.
1055*d57664e9SAndroid Build Coastguard Worker     mClock->advance(5s);
1056*d57664e9SAndroid Build Coastguard Worker 
1057*d57664e9SAndroid Build Coastguard Worker     retryCallback();
1058*d57664e9SAndroid Build Coastguard Worker     // Retry callback present.
1059*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1060*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, bindRetryInterval);
1061*d57664e9SAndroid Build Coastguard Worker     retryCallback = mTimedQueue->mWhat;
1062*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1063*d57664e9SAndroid Build Coastguard Worker 
1064*d57664e9SAndroid Build Coastguard Worker     // Returning "binding" so that we can retry.
1065*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1066*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1067*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderBindingWithNoDelay));
1068*d57664e9SAndroid Build Coastguard Worker 
1069*d57664e9SAndroid Build Coastguard Worker     // Expecting bindToDataLoaderBindingWithNoDelay call.
1070*d57664e9SAndroid Build Coastguard Worker     mClock->advance(5s);
1071*d57664e9SAndroid Build Coastguard Worker 
1072*d57664e9SAndroid Build Coastguard Worker     retryCallback();
1073*d57664e9SAndroid Build Coastguard Worker     // No retry callback.
1074*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1075*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1076*d57664e9SAndroid Build Coastguard Worker 
1077*d57664e9SAndroid Build Coastguard Worker     // Should not change the bindToDataLoader call count
1078*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallback);
1079*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallbackData);
1080*d57664e9SAndroid Build Coastguard Worker     auto looperCb = mLooper->mCallback;
1081*d57664e9SAndroid Build Coastguard Worker     auto looperCbData = mLooper->mCallbackData;
1082*d57664e9SAndroid Build Coastguard Worker     looperCb(-1, -1, looperCbData);
1083*d57664e9SAndroid Build Coastguard Worker 
1084*d57664e9SAndroid Build Coastguard Worker     // Expecting the same bindToDataLoaderBindingWithNoDelay call.
1085*d57664e9SAndroid Build Coastguard Worker     mClock->advance(5s);
1086*d57664e9SAndroid Build Coastguard Worker 
1087*d57664e9SAndroid Build Coastguard Worker     // Use pending reads callback to trigger binding.
1088*d57664e9SAndroid Build Coastguard Worker     looperCb(-1, -1, looperCbData);
1089*d57664e9SAndroid Build Coastguard Worker 
1090*d57664e9SAndroid Build Coastguard Worker     // No retry callback.
1091*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1092*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1093*d57664e9SAndroid Build Coastguard Worker 
1094*d57664e9SAndroid Build Coastguard Worker     // Now we are out of 10m "retry" budget, let's finally bind.
1095*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1096*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager, &MockDataLoaderManager::bindToDataLoaderOk));
1097*d57664e9SAndroid Build Coastguard Worker     mClock->advance(11min);
1098*d57664e9SAndroid Build Coastguard Worker 
1099*d57664e9SAndroid Build Coastguard Worker     // Use pending reads callback to trigger binding.
1100*d57664e9SAndroid Build Coastguard Worker     looperCb(-1, -1, looperCbData);
1101*d57664e9SAndroid Build Coastguard Worker 
1102*d57664e9SAndroid Build Coastguard Worker     // No retry callback.
1103*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, 0ms);
1104*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mWhat, nullptr);
1105*d57664e9SAndroid Build Coastguard Worker 
1106*d57664e9SAndroid Build Coastguard Worker     // And test the rest of the backoff.
1107*d57664e9SAndroid Build Coastguard Worker     // Simulated crash/other connection breakage.
1108*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1109*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1110*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1111*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1112*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1113*d57664e9SAndroid Build Coastguard Worker 
1114*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1115*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1116*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1117*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1118*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1119*d57664e9SAndroid Build Coastguard Worker 
1120*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1121*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1122*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
1123*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1124*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1125*d57664e9SAndroid Build Coastguard Worker 
1126*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1127*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1128*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
1129*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1130*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1131*d57664e9SAndroid Build Coastguard Worker 
1132*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1133*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1134*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1135*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1136*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1137*d57664e9SAndroid Build Coastguard Worker 
1138*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1139*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1140*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
1141*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
1142*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusDestroyed();
1143*d57664e9SAndroid Build Coastguard Worker }
1144*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderCreate)1145*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
1146*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1147*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1148*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1149*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1150*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1151*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1152*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1153*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1154*d57664e9SAndroid Build Coastguard Worker     int storageId =
1155*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1156*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1157*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1158*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1159*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1160*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusCreated();
1161*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusStarted();
1162*d57664e9SAndroid Build Coastguard Worker }
1163*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderPendingStart)1164*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
1165*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1166*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1167*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1168*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1169*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1170*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1171*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1172*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1173*d57664e9SAndroid Build Coastguard Worker     int storageId =
1174*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1175*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1176*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1177*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1178*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1179*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusCreated();
1180*d57664e9SAndroid Build Coastguard Worker }
1181*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderCreateUnavailable)1182*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) {
1183*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1184*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1185*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1186*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1187*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1188*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1189*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1190*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1191*d57664e9SAndroid Build Coastguard Worker     int storageId =
1192*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1193*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1194*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1195*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1196*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1197*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusUnavailable();
1198*d57664e9SAndroid Build Coastguard Worker }
1199*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderCreateUnrecoverable)1200*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnrecoverable) {
1201*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1202*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1203*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1204*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1205*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1206*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1207*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1208*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1209*d57664e9SAndroid Build Coastguard Worker     int storageId =
1210*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1211*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1212*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1213*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1214*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1215*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1216*d57664e9SAndroid Build Coastguard Worker }
1217*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderRecreateOnPendingReads)1218*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) {
1219*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess();
1220*d57664e9SAndroid Build Coastguard Worker     mIncFs->openMountSuccess();
1221*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1222*d57664e9SAndroid Build Coastguard Worker 
1223*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(2);
1224*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1225*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
1226*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
1227*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
1228*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1229*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1230*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1231*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1232*d57664e9SAndroid Build Coastguard Worker     int storageId =
1233*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1234*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1235*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1236*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1237*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1238*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusUnrecoverable();
1239*d57664e9SAndroid Build Coastguard Worker 
1240*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1241*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1242*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, 10ms);
1243*d57664e9SAndroid Build Coastguard Worker     auto timedCallback = mTimedQueue->mWhat;
1244*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1245*d57664e9SAndroid Build Coastguard Worker 
1246*d57664e9SAndroid Build Coastguard Worker     // First callback call to propagate unrecoverable.
1247*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1248*d57664e9SAndroid Build Coastguard Worker 
1249*d57664e9SAndroid Build Coastguard Worker     // And second call to trigger recreation.
1250*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallback);
1251*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallbackData);
1252*d57664e9SAndroid Build Coastguard Worker     mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1253*d57664e9SAndroid Build Coastguard Worker }
1254*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderUnavailable)1255*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderUnavailable) {
1256*d57664e9SAndroid Build Coastguard Worker     mIncFs->openMountSuccess();
1257*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOkNoStatus();
1258*d57664e9SAndroid Build Coastguard Worker 
1259*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(3);
1260*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(3);
1261*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(3);
1262*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1263*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
1264*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1265*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
1266*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
1267*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1268*d57664e9SAndroid Build Coastguard Worker     int storageId =
1269*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1270*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1271*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1272*d57664e9SAndroid Build Coastguard Worker 
1273*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1274*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1275*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWithNoDelay));
1276*d57664e9SAndroid Build Coastguard Worker 
1277*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1278*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1279*d57664e9SAndroid Build Coastguard Worker 
1280*d57664e9SAndroid Build Coastguard Worker     // Unavailable.
1281*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusUnavailable();
1282*d57664e9SAndroid Build Coastguard Worker 
1283*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1284*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1285*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, 10ms);
1286*d57664e9SAndroid Build Coastguard Worker     auto timedCallback = mTimedQueue->mWhat;
1287*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1288*d57664e9SAndroid Build Coastguard Worker 
1289*d57664e9SAndroid Build Coastguard Worker     // Propagating unavailable and expecting it to trigger rebind with 1s retry delay.
1290*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1291*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1292*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
1293*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1294*d57664e9SAndroid Build Coastguard Worker 
1295*d57664e9SAndroid Build Coastguard Worker     // Unavailable #2.
1296*d57664e9SAndroid Build Coastguard Worker     mDataLoaderManager->setDataLoaderStatusUnavailable();
1297*d57664e9SAndroid Build Coastguard Worker 
1298*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1299*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1300*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, 10ms);
1301*d57664e9SAndroid Build Coastguard Worker     timedCallback = mTimedQueue->mWhat;
1302*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1303*d57664e9SAndroid Build Coastguard Worker 
1304*d57664e9SAndroid Build Coastguard Worker     // Propagating unavailable and expecting it to trigger rebind with 10s retry delay.
1305*d57664e9SAndroid Build Coastguard Worker     // This time succeed.
1306*d57664e9SAndroid Build Coastguard Worker     mDataLoader->initializeCreateOk();
1307*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
1308*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Invoke(mDataLoaderManager,
1309*d57664e9SAndroid Build Coastguard Worker                                   &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
1310*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1311*d57664e9SAndroid Build Coastguard Worker }
1312*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderUnhealthyStorage)1313*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
1314*d57664e9SAndroid Build Coastguard Worker     mIncFs->openMountSuccess();
1315*d57664e9SAndroid Build Coastguard Worker 
1316*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1317*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1318*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1319*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1320*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1321*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1322*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(2);
1323*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(2);
1324*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(6);
1325*d57664e9SAndroid Build Coastguard Worker 
1326*d57664e9SAndroid Build Coastguard Worker     sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
1327*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockStorageHealthListener>* listenerMock = listener.get();
1328*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_OK))
1329*d57664e9SAndroid Build Coastguard Worker             .Times(2);
1330*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock,
1331*d57664e9SAndroid Build Coastguard Worker                 onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
1332*d57664e9SAndroid Build Coastguard Worker             .Times(1);
1333*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
1334*d57664e9SAndroid Build Coastguard Worker             .Times(1);
1335*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY))
1336*d57664e9SAndroid Build Coastguard Worker             .Times(2);
1337*d57664e9SAndroid Build Coastguard Worker 
1338*d57664e9SAndroid Build Coastguard Worker     StorageHealthCheckParams params;
1339*d57664e9SAndroid Build Coastguard Worker     params.blockedTimeoutMs = 10000;
1340*d57664e9SAndroid Build Coastguard Worker     params.unhealthyTimeoutMs = 20000;
1341*d57664e9SAndroid Build Coastguard Worker     params.unhealthyMonitoringMs = 30000;
1342*d57664e9SAndroid Build Coastguard Worker 
1343*d57664e9SAndroid Build Coastguard Worker     using MS = std::chrono::milliseconds;
1344*d57664e9SAndroid Build Coastguard Worker     using MCS = std::chrono::microseconds;
1345*d57664e9SAndroid Build Coastguard Worker 
1346*d57664e9SAndroid Build Coastguard Worker     const auto blockedTimeout = MS(params.blockedTimeoutMs);
1347*d57664e9SAndroid Build Coastguard Worker     const auto unhealthyTimeout = MS(params.unhealthyTimeoutMs);
1348*d57664e9SAndroid Build Coastguard Worker     const auto unhealthyMonitoring = MS(params.unhealthyMonitoringMs);
1349*d57664e9SAndroid Build Coastguard Worker 
1350*d57664e9SAndroid Build Coastguard Worker     const uint64_t kFirstTimestampUs = 1000000000ll;
1351*d57664e9SAndroid Build Coastguard Worker     const uint64_t kBlockedTimestampUs =
1352*d57664e9SAndroid Build Coastguard Worker             kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
1353*d57664e9SAndroid Build Coastguard Worker     const uint64_t kUnhealthyTimestampUs =
1354*d57664e9SAndroid Build Coastguard Worker             kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
1355*d57664e9SAndroid Build Coastguard Worker 
1356*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1357*d57664e9SAndroid Build Coastguard Worker     int storageId =
1358*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1359*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1360*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1361*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {},
1362*d57664e9SAndroid Build Coastguard Worker                                       std::move(params), listener, {});
1363*d57664e9SAndroid Build Coastguard Worker 
1364*d57664e9SAndroid Build Coastguard Worker     // Healthy state, registered for pending reads.
1365*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallback);
1366*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallbackData);
1367*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1368*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
1369*d57664e9SAndroid Build Coastguard Worker     checkHealthMetrics(storageId, 0, listener->mStatus);
1370*d57664e9SAndroid Build Coastguard Worker 
1371*d57664e9SAndroid Build Coastguard Worker     // Looper/epoll callback.
1372*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
1373*d57664e9SAndroid Build Coastguard Worker     mLooper->mCallback(-1, -1, mLooper->mCallbackData);
1374*d57664e9SAndroid Build Coastguard Worker 
1375*d57664e9SAndroid Build Coastguard Worker     // Unregister from pending reads and wait.
1376*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallback);
1377*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallbackData);
1378*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1379*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, listener->mStatus);
1380*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1381*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1382*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, blockedTimeout);
1383*d57664e9SAndroid Build Coastguard Worker     auto timedCallback = mTimedQueue->mWhat;
1384*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1385*d57664e9SAndroid Build Coastguard Worker 
1386*d57664e9SAndroid Build Coastguard Worker     // Timed job callback for blocked.
1387*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
1388*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1389*d57664e9SAndroid Build Coastguard Worker 
1390*d57664e9SAndroid Build Coastguard Worker     // Still not registered, and blocked.
1391*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallback);
1392*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallbackData);
1393*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1394*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
1395*d57664e9SAndroid Build Coastguard Worker     checkHealthMetrics(storageId, params.blockedTimeoutMs, listener->mStatus);
1396*d57664e9SAndroid Build Coastguard Worker 
1397*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1398*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1399*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, 1000ms);
1400*d57664e9SAndroid Build Coastguard Worker     timedCallback = mTimedQueue->mWhat;
1401*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1402*d57664e9SAndroid Build Coastguard Worker 
1403*d57664e9SAndroid Build Coastguard Worker     // Timed job callback for unhealthy.
1404*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1405*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1406*d57664e9SAndroid Build Coastguard Worker 
1407*d57664e9SAndroid Build Coastguard Worker     // Still not registered, and blocked.
1408*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallback);
1409*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallbackData);
1410*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1411*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
1412*d57664e9SAndroid Build Coastguard Worker     checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
1413*d57664e9SAndroid Build Coastguard Worker 
1414*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1415*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1416*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1417*d57664e9SAndroid Build Coastguard Worker     timedCallback = mTimedQueue->mWhat;
1418*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1419*d57664e9SAndroid Build Coastguard Worker 
1420*d57664e9SAndroid Build Coastguard Worker     // One more unhealthy.
1421*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
1422*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1423*d57664e9SAndroid Build Coastguard Worker 
1424*d57664e9SAndroid Build Coastguard Worker     // Still not registered, and blocked.
1425*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallback);
1426*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, mLooper->mCallbackData);
1427*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1428*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
1429*d57664e9SAndroid Build Coastguard Worker     checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
1430*d57664e9SAndroid Build Coastguard Worker 
1431*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1432*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1433*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mTimedQueue->mAfter, unhealthyMonitoring);
1434*d57664e9SAndroid Build Coastguard Worker     timedCallback = mTimedQueue->mWhat;
1435*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1436*d57664e9SAndroid Build Coastguard Worker 
1437*d57664e9SAndroid Build Coastguard Worker     // And now healthy.
1438*d57664e9SAndroid Build Coastguard Worker     mIncFs->waitForPendingReadsTimeout();
1439*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1440*d57664e9SAndroid Build Coastguard Worker 
1441*d57664e9SAndroid Build Coastguard Worker     // Healthy state, registered for pending reads.
1442*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallback);
1443*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mLooper->mCallbackData);
1444*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, listener->mStorageId);
1445*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
1446*d57664e9SAndroid Build Coastguard Worker     checkHealthMetrics(storageId, 0, listener->mStatus);
1447*d57664e9SAndroid Build Coastguard Worker }
1448*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccess)1449*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
1450*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1451*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1452*d57664e9SAndroid Build Coastguard Worker 
1453*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1454*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1455*d57664e9SAndroid Build Coastguard Worker     // on startLoading
1456*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
1457*d57664e9SAndroid Build Coastguard Worker     // We are calling setIncFsMountOptions(true).
1458*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1459*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1460*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1461*d57664e9SAndroid Build Coastguard Worker     // Not expecting callback removal.
1462*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1463*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1464*d57664e9SAndroid Build Coastguard Worker     int storageId =
1465*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1466*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1467*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1468*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1469*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1470*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1471*d57664e9SAndroid Build Coastguard Worker }
1472*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccessAndDisabled)1473*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndDisabled) {
1474*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1475*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1476*d57664e9SAndroid Build Coastguard Worker 
1477*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1478*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1479*d57664e9SAndroid Build Coastguard Worker     // Enabling and then disabling readlogs.
1480*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1481*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
1482*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1483*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1484*d57664e9SAndroid Build Coastguard Worker     // Not expecting callback removal.
1485*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1486*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1487*d57664e9SAndroid Build Coastguard Worker     int storageId =
1488*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1489*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1490*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1491*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1492*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1493*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1494*d57664e9SAndroid Build Coastguard Worker     // Now disable.
1495*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->disallowReadLogs(storageId);
1496*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1497*d57664e9SAndroid Build Coastguard Worker }
1498*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccessAndTimedOut)1499*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndTimedOut) {
1500*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1501*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1502*d57664e9SAndroid Build Coastguard Worker 
1503*d57664e9SAndroid Build Coastguard Worker     const auto readLogsMaxInterval = 2h;
1504*d57664e9SAndroid Build Coastguard Worker 
1505*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1506*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1507*d57664e9SAndroid Build Coastguard Worker     // Enabling and then disabling readlogs.
1508*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(2);
1509*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
1510*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1511*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1512*d57664e9SAndroid Build Coastguard Worker     // Not expecting callback removal.
1513*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1514*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
1515*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1516*d57664e9SAndroid Build Coastguard Worker     int storageId =
1517*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1518*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1519*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1520*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1521*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1522*d57664e9SAndroid Build Coastguard Worker 
1523*d57664e9SAndroid Build Coastguard Worker     // Disable readlogs callback present.
1524*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1525*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1526*d57664e9SAndroid Build Coastguard Worker     auto callback = mTimedQueue->mWhat;
1527*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1528*d57664e9SAndroid Build Coastguard Worker 
1529*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1530*d57664e9SAndroid Build Coastguard Worker     // Now advance clock for 1hr.
1531*d57664e9SAndroid Build Coastguard Worker     mClock->advance(1h);
1532*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1533*d57664e9SAndroid Build Coastguard Worker     // Now call the timed callback, it should turn off the readlogs.
1534*d57664e9SAndroid Build Coastguard Worker     callback();
1535*d57664e9SAndroid Build Coastguard Worker     // Now advance clock for 2hrs.
1536*d57664e9SAndroid Build Coastguard Worker     mClock->advance(readLogsMaxInterval);
1537*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1538*d57664e9SAndroid Build Coastguard Worker }
1539*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem)1540*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNoTimedOutForSystem) {
1541*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1542*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1543*d57664e9SAndroid Build Coastguard Worker 
1544*d57664e9SAndroid Build Coastguard Worker     const auto readLogsMaxInterval = 2h;
1545*d57664e9SAndroid Build Coastguard Worker 
1546*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1547*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1548*d57664e9SAndroid Build Coastguard Worker     // Enabling and then disabling readlogs.
1549*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(3);
1550*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
1551*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1552*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1553*d57664e9SAndroid Build Coastguard Worker     // Not expecting callback removal.
1554*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1555*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
1556*d57664e9SAndroid Build Coastguard Worker     // System data loader.
1557*d57664e9SAndroid Build Coastguard Worker     mDataLoaderParcel.packageName = "android";
1558*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1559*d57664e9SAndroid Build Coastguard Worker     int storageId =
1560*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1561*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1562*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1563*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1564*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1565*d57664e9SAndroid Build Coastguard Worker 
1566*d57664e9SAndroid Build Coastguard Worker     // IfsState callback.
1567*d57664e9SAndroid Build Coastguard Worker     auto callback = mTimedQueue->mWhat;
1568*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1569*d57664e9SAndroid Build Coastguard Worker 
1570*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1571*d57664e9SAndroid Build Coastguard Worker     // Now advance clock for 1hr.
1572*d57664e9SAndroid Build Coastguard Worker     mClock->advance(1h);
1573*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1574*d57664e9SAndroid Build Coastguard Worker     // Now advance clock for 2hrs.
1575*d57664e9SAndroid Build Coastguard Worker     mClock->advance(readLogsMaxInterval);
1576*d57664e9SAndroid Build Coastguard Worker     // IfsStorage callback should not affect anything.
1577*d57664e9SAndroid Build Coastguard Worker     callback();
1578*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->setStorageParams(true), 0);
1579*d57664e9SAndroid Build Coastguard Worker }
1580*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccessAndNewInstall)1581*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndNewInstall) {
1582*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1583*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1584*d57664e9SAndroid Build Coastguard Worker 
1585*d57664e9SAndroid Build Coastguard Worker     const auto readLogsMaxInterval = 2h;
1586*d57664e9SAndroid Build Coastguard Worker 
1587*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(2);
1588*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1589*d57664e9SAndroid Build Coastguard Worker     // Enabling and then disabling readlogs.
1590*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(5);
1591*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(3);
1592*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1593*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1594*d57664e9SAndroid Build Coastguard Worker     // Not expecting callback removal.
1595*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1596*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(4);
1597*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1598*d57664e9SAndroid Build Coastguard Worker     int storageId =
1599*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1600*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1601*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1602*d57664e9SAndroid Build Coastguard Worker 
1603*d57664e9SAndroid Build Coastguard Worker     // Before install - long timeouts.
1604*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mVold->readTimeoutsEnabled());
1605*d57664e9SAndroid Build Coastguard Worker 
1606*d57664e9SAndroid Build Coastguard Worker     auto dataLoaderParcel = mDataLoaderParcel;
1607*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(dataLoaderParcel), {}, {},
1608*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1609*d57664e9SAndroid Build Coastguard Worker     // During install - short timeouts.
1610*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(mVold->readTimeoutsEnabled());
1611*d57664e9SAndroid Build Coastguard Worker 
1612*d57664e9SAndroid Build Coastguard Worker     // Disable readlogs callback present.
1613*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1614*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1615*d57664e9SAndroid Build Coastguard Worker     auto callback = mTimedQueue->mWhat;
1616*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1617*d57664e9SAndroid Build Coastguard Worker 
1618*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1619*d57664e9SAndroid Build Coastguard Worker     // Now advance clock for 1.5hrs.
1620*d57664e9SAndroid Build Coastguard Worker     mClock->advance(90min);
1621*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1622*d57664e9SAndroid Build Coastguard Worker 
1623*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->onInstallationComplete(storageId);
1624*d57664e9SAndroid Build Coastguard Worker     // After install - long timeouts.
1625*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mVold->readTimeoutsEnabled());
1626*d57664e9SAndroid Build Coastguard Worker 
1627*d57664e9SAndroid Build Coastguard Worker     // New installation.
1628*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1629*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1630*d57664e9SAndroid Build Coastguard Worker     // New installation - short timeouts.
1631*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(mVold->readTimeoutsEnabled());
1632*d57664e9SAndroid Build Coastguard Worker 
1633*d57664e9SAndroid Build Coastguard Worker     // New callback present.
1634*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mTimedQueue->mId);
1635*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, readLogsMaxInterval);
1636*d57664e9SAndroid Build Coastguard Worker     auto callback2 = mTimedQueue->mWhat;
1637*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(storageId);
1638*d57664e9SAndroid Build Coastguard Worker 
1639*d57664e9SAndroid Build Coastguard Worker     // Old callback should not disable readlogs (setIncFsMountOptions should be called only once).
1640*d57664e9SAndroid Build Coastguard Worker     callback();
1641*d57664e9SAndroid Build Coastguard Worker     // Advance clock for another 1.5hrs.
1642*d57664e9SAndroid Build Coastguard Worker     mClock->advance(90min);
1643*d57664e9SAndroid Build Coastguard Worker     // Still success even it's 3hrs past first install.
1644*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1645*d57664e9SAndroid Build Coastguard Worker 
1646*d57664e9SAndroid Build Coastguard Worker     // New one should disable.
1647*d57664e9SAndroid Build Coastguard Worker     callback2();
1648*d57664e9SAndroid Build Coastguard Worker     // And timeout.
1649*d57664e9SAndroid Build Coastguard Worker     mClock->advance(90min);
1650*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->setStorageParams(true), -EPERM);
1651*d57664e9SAndroid Build Coastguard Worker 
1652*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->onInstallationComplete(storageId);
1653*d57664e9SAndroid Build Coastguard Worker     // After install - long timeouts.
1654*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mVold->readTimeoutsEnabled());
1655*d57664e9SAndroid Build Coastguard Worker }
1656*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsSuccessAndPermissionChanged)1657*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
1658*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1659*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1660*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->initializeStartWatchingMode();
1661*d57664e9SAndroid Build Coastguard Worker 
1662*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1663*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1664*d57664e9SAndroid Build Coastguard Worker     // We are calling setIncFsMountOptions(true).
1665*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1666*d57664e9SAndroid Build Coastguard Worker     // setIncFsMountOptions(false) is called on the callback.
1667*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(2);
1668*d57664e9SAndroid Build Coastguard Worker     // After setIncFsMountOptions succeeded expecting to start watching.
1669*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(1);
1670*d57664e9SAndroid Build Coastguard Worker     // After callback is called, disable read logs and remove callback.
1671*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(1);
1672*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1673*d57664e9SAndroid Build Coastguard Worker     int storageId =
1674*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1675*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1676*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1677*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1678*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1679*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
1680*d57664e9SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
1681*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->mStoredCallback->opChanged(0, {});
1682*d57664e9SAndroid Build Coastguard Worker }
1683*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsCheckPermissionFails)1684*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
1685*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionFails();
1686*d57664e9SAndroid Build Coastguard Worker 
1687*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1688*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1689*d57664e9SAndroid Build Coastguard Worker     // checkPermission fails, no calls to set opitions,  start or stop WatchingMode.
1690*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(0);
1691*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
1692*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1693*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1694*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1695*d57664e9SAndroid Build Coastguard Worker     int storageId =
1696*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1697*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1698*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1699*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1700*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1701*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1702*d57664e9SAndroid Build Coastguard Worker }
1703*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsCheckPermissionNoCrossUsers)1704*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionNoCrossUsers) {
1705*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionNoCrossUsers();
1706*d57664e9SAndroid Build Coastguard Worker 
1707*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1708*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1709*d57664e9SAndroid Build Coastguard Worker     // checkPermission fails, no calls to set opitions,  start or stop WatchingMode.
1710*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(0);
1711*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
1712*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1713*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1714*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1715*d57664e9SAndroid Build Coastguard Worker     int storageId =
1716*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1717*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1718*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1719*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1720*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1721*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1722*d57664e9SAndroid Build Coastguard Worker }
1723*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testSetIncFsMountOptionsFails)1724*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
1725*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsFails();
1726*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1727*d57664e9SAndroid Build Coastguard Worker 
1728*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
1729*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1730*d57664e9SAndroid Build Coastguard Worker     // We are calling setIncFsMountOptions.
1731*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true, _, _)).Times(1);
1732*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, setIncFsMountOptions(_, false, _, _)).Times(1);
1733*d57664e9SAndroid Build Coastguard Worker     // setIncFsMountOptions fails, no calls to start or stop WatchingMode.
1734*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, startWatchingMode(_, _, _)).Times(0);
1735*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mAppOpsManager, stopWatchingMode(_)).Times(0);
1736*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1737*d57664e9SAndroid Build Coastguard Worker     int storageId =
1738*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1739*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1740*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1741*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1742*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1743*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT(mDataLoader->setStorageParams(true), 0);
1744*d57664e9SAndroid Build Coastguard Worker }
1745*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testMakeDirectory)1746*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testMakeDirectory) {
1747*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1748*d57664e9SAndroid Build Coastguard Worker     int storageId =
1749*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1750*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1751*d57664e9SAndroid Build Coastguard Worker     std::string dir_path("test");
1752*d57664e9SAndroid Build Coastguard Worker 
1753*d57664e9SAndroid Build Coastguard Worker     // Expecting incfs to call makeDir on a path like:
1754*d57664e9SAndroid Build Coastguard Worker     // <root>/*/mount/<storage>/test
1755*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs,
1756*d57664e9SAndroid Build Coastguard Worker                 makeDir(_, Truly([&](std::string_view arg) {
1757*d57664e9SAndroid Build Coastguard Worker                             return arg.starts_with(mRootDir.path) &&
1758*d57664e9SAndroid Build Coastguard Worker                                     arg.ends_with("/mount/st_1_0/" + dir_path);
1759*d57664e9SAndroid Build Coastguard Worker                         }),
1760*d57664e9SAndroid Build Coastguard Worker                         _));
1761*d57664e9SAndroid Build Coastguard Worker     auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
1762*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(res, 0);
1763*d57664e9SAndroid Build Coastguard Worker }
1764*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testMakeDirectories)1765*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testMakeDirectories) {
1766*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1767*d57664e9SAndroid Build Coastguard Worker     int storageId =
1768*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1769*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1770*d57664e9SAndroid Build Coastguard Worker     auto first = "first"sv;
1771*d57664e9SAndroid Build Coastguard Worker     auto second = "second"sv;
1772*d57664e9SAndroid Build Coastguard Worker     auto third = "third"sv;
1773*d57664e9SAndroid Build Coastguard Worker     auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
1774*d57664e9SAndroid Build Coastguard Worker 
1775*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs,
1776*d57664e9SAndroid Build Coastguard Worker                 makeDirs(_, Truly([&](std::string_view arg) {
1777*d57664e9SAndroid Build Coastguard Worker                              return arg.starts_with(mRootDir.path) &&
1778*d57664e9SAndroid Build Coastguard Worker                                      arg.ends_with("/mount/st_1_0/" + dir_path);
1779*d57664e9SAndroid Build Coastguard Worker                          }),
1780*d57664e9SAndroid Build Coastguard Worker                          _));
1781*d57664e9SAndroid Build Coastguard Worker     auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
1782*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(res, 0);
1783*d57664e9SAndroid Build Coastguard Worker }
1784*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testIsFileFullyLoadedNoData)1785*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testIsFileFullyLoadedNoData) {
1786*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1787*d57664e9SAndroid Build Coastguard Worker     int storageId =
1788*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1789*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1790*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
1791*d57664e9SAndroid Build Coastguard Worker             .Times(1)
1792*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1793*d57664e9SAndroid Build Coastguard Worker     ASSERT_GT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
1794*d57664e9SAndroid Build Coastguard Worker }
1795*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testIsFileFullyLoadedError)1796*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testIsFileFullyLoadedError) {
1797*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1798*d57664e9SAndroid Build Coastguard Worker     int storageId =
1799*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1800*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1801*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
1802*d57664e9SAndroid Build Coastguard Worker             .Times(1)
1803*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState(-1)));
1804*d57664e9SAndroid Build Coastguard Worker     ASSERT_LT((int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"), 0);
1805*d57664e9SAndroid Build Coastguard Worker }
1806*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testIsFileFullyLoadedSuccess)1807*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testIsFileFullyLoadedSuccess) {
1808*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1809*d57664e9SAndroid Build Coastguard Worker     int storageId =
1810*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1811*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1812*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isFileFullyLoaded(_, An<std::string_view>()))
1813*d57664e9SAndroid Build Coastguard Worker             .Times(1)
1814*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::Full));
1815*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(0, (int)mIncrementalService->isFileFullyLoaded(storageId, "base.apk"));
1816*d57664e9SAndroid Build Coastguard Worker }
1817*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testGetLoadingProgressSuccessWithNoFile)1818*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithNoFile) {
1819*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksSuccess();
1820*d57664e9SAndroid Build Coastguard Worker     mFs->hasNoFile();
1821*d57664e9SAndroid Build Coastguard Worker 
1822*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1823*d57664e9SAndroid Build Coastguard Worker     int storageId =
1824*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1825*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1826*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
1827*d57664e9SAndroid Build Coastguard Worker }
1828*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testGetLoadingProgressFailsWithFailedRanges)1829*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testGetLoadingProgressFailsWithFailedRanges) {
1830*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksFails();
1831*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1832*d57664e9SAndroid Build Coastguard Worker 
1833*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1834*d57664e9SAndroid Build Coastguard Worker     int storageId =
1835*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1836*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1837*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(1);
1838*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(-1, mIncrementalService->getLoadingProgress(storageId).getProgress());
1839*d57664e9SAndroid Build Coastguard Worker }
1840*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testGetLoadingProgressSuccessWithEmptyRanges)1841*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccessWithEmptyRanges) {
1842*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksEmpty();
1843*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1844*d57664e9SAndroid Build Coastguard Worker 
1845*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1846*d57664e9SAndroid Build Coastguard Worker     int storageId =
1847*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1848*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1849*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
1850*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(1, mIncrementalService->getLoadingProgress(storageId).getProgress());
1851*d57664e9SAndroid Build Coastguard Worker }
1852*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testGetLoadingProgressSuccess)1853*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testGetLoadingProgressSuccess) {
1854*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksSuccess();
1855*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1856*d57664e9SAndroid Build Coastguard Worker 
1857*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1858*d57664e9SAndroid Build Coastguard Worker     int storageId =
1859*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1860*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1861*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, countFilledBlocks(_, _)).Times(3);
1862*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(0.5, mIncrementalService->getLoadingProgress(storageId).getProgress());
1863*d57664e9SAndroid Build Coastguard Worker }
1864*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testRegisterLoadingProgressListenerSuccess)1865*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerSuccess) {
1866*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksSuccess();
1867*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1868*d57664e9SAndroid Build Coastguard Worker 
1869*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1870*d57664e9SAndroid Build Coastguard Worker     int storageId =
1871*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1872*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1873*d57664e9SAndroid Build Coastguard Worker     sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1874*d57664e9SAndroid Build Coastguard Worker             new NiceMock<MockStorageLoadingProgressListener>};
1875*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1876*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(2);
1877*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mProgressUpdateJobQueue, addJob(_, _, _)).Times(2);
1878*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->registerLoadingProgressListener(storageId, listener);
1879*d57664e9SAndroid Build Coastguard Worker     // Timed callback present.
1880*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1881*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1882*d57664e9SAndroid Build Coastguard Worker     auto timedCallback = mProgressUpdateJobQueue->mWhat;
1883*d57664e9SAndroid Build Coastguard Worker     timedCallback();
1884*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(storageId, mProgressUpdateJobQueue->mId);
1885*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mProgressUpdateJobQueue->mAfter, 1000ms);
1886*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->unregisterLoadingProgressListener(storageId);
1887*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mProgressUpdateJobQueue->mAfter, Milliseconds{});
1888*d57664e9SAndroid Build Coastguard Worker }
1889*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testRegisterLoadingProgressListenerFailsToGetProgress)1890*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProgress) {
1891*d57664e9SAndroid Build Coastguard Worker     mIncFs->countFilledBlocksFails();
1892*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1893*d57664e9SAndroid Build Coastguard Worker 
1894*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1895*d57664e9SAndroid Build Coastguard Worker     int storageId =
1896*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1897*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1898*d57664e9SAndroid Build Coastguard Worker     sp<NiceMock<MockStorageLoadingProgressListener>> listener{
1899*d57664e9SAndroid Build Coastguard Worker             new NiceMock<MockStorageLoadingProgressListener>};
1900*d57664e9SAndroid Build Coastguard Worker     NiceMock<MockStorageLoadingProgressListener>* listenerMock = listener.get();
1901*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0);
1902*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->registerLoadingProgressListener(storageId, listener);
1903*d57664e9SAndroid Build Coastguard Worker }
1904*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderUnbindOnAllDone)1905*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDone) {
1906*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1907*d57664e9SAndroid Build Coastguard Worker 
1908*d57664e9SAndroid Build Coastguard Worker     const auto stateUpdateInterval = 1s;
1909*d57664e9SAndroid Build Coastguard Worker 
1910*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1911*d57664e9SAndroid Build Coastguard Worker     // No unbinding just yet.
1912*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1913*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1914*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1915*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1916*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1917*d57664e9SAndroid Build Coastguard Worker     // System data loader to get rid of readlog timeout callback.
1918*d57664e9SAndroid Build Coastguard Worker     mDataLoaderParcel.packageName = "android";
1919*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1920*d57664e9SAndroid Build Coastguard Worker     int storageId =
1921*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1922*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1923*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1924*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1925*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1926*d57664e9SAndroid Build Coastguard Worker 
1927*d57664e9SAndroid Build Coastguard Worker     // Started.
1928*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1929*d57664e9SAndroid Build Coastguard Worker 
1930*d57664e9SAndroid Build Coastguard Worker     // IfsState callback present.
1931*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
1932*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1933*d57664e9SAndroid Build Coastguard Worker     auto callback = mTimedQueue->mWhat;
1934*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
1935*d57664e9SAndroid Build Coastguard Worker 
1936*d57664e9SAndroid Build Coastguard Worker     // Not loaded yet.
1937*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
1938*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::MissingBlocks));
1939*d57664e9SAndroid Build Coastguard Worker 
1940*d57664e9SAndroid Build Coastguard Worker     // Send the callback, should not do anything.
1941*d57664e9SAndroid Build Coastguard Worker     callback();
1942*d57664e9SAndroid Build Coastguard Worker 
1943*d57664e9SAndroid Build Coastguard Worker     // Still started.
1944*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1945*d57664e9SAndroid Build Coastguard Worker 
1946*d57664e9SAndroid Build Coastguard Worker     // Still present.
1947*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
1948*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1949*d57664e9SAndroid Build Coastguard Worker     callback = mTimedQueue->mWhat;
1950*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
1951*d57664e9SAndroid Build Coastguard Worker 
1952*d57664e9SAndroid Build Coastguard Worker     // Fully loaded.
1953*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_)).WillOnce(Return(incfs::LoadingState::Full));
1954*d57664e9SAndroid Build Coastguard Worker     // Expect the unbind.
1955*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
1956*d57664e9SAndroid Build Coastguard Worker 
1957*d57664e9SAndroid Build Coastguard Worker     callback();
1958*d57664e9SAndroid Build Coastguard Worker 
1959*d57664e9SAndroid Build Coastguard Worker     // Destroyed.
1960*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
1961*d57664e9SAndroid Build Coastguard Worker }
1962*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testStartDataLoaderUnbindOnAllDoneWithReadlogs)1963*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testStartDataLoaderUnbindOnAllDoneWithReadlogs) {
1964*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
1965*d57664e9SAndroid Build Coastguard Worker 
1966*d57664e9SAndroid Build Coastguard Worker     // Readlogs.
1967*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
1968*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
1969*d57664e9SAndroid Build Coastguard Worker 
1970*d57664e9SAndroid Build Coastguard Worker     const auto stateUpdateInterval = 1s;
1971*d57664e9SAndroid Build Coastguard Worker 
1972*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
1973*d57664e9SAndroid Build Coastguard Worker     // No unbinding just yet.
1974*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
1975*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
1976*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
1977*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
1978*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
1979*d57664e9SAndroid Build Coastguard Worker     // System data loader to get rid of readlog timeout callback.
1980*d57664e9SAndroid Build Coastguard Worker     mDataLoaderParcel.packageName = "android";
1981*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
1982*d57664e9SAndroid Build Coastguard Worker     int storageId =
1983*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
1984*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
1985*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
1986*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
1987*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
1988*d57664e9SAndroid Build Coastguard Worker 
1989*d57664e9SAndroid Build Coastguard Worker     // Started.
1990*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
1991*d57664e9SAndroid Build Coastguard Worker 
1992*d57664e9SAndroid Build Coastguard Worker     // IfsState callback present.
1993*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
1994*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
1995*d57664e9SAndroid Build Coastguard Worker     auto callback = mTimedQueue->mWhat;
1996*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
1997*d57664e9SAndroid Build Coastguard Worker 
1998*d57664e9SAndroid Build Coastguard Worker     // Not loaded yet.
1999*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2000*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::MissingBlocks));
2001*d57664e9SAndroid Build Coastguard Worker 
2002*d57664e9SAndroid Build Coastguard Worker     // Send the callback, should not do anything.
2003*d57664e9SAndroid Build Coastguard Worker     callback();
2004*d57664e9SAndroid Build Coastguard Worker 
2005*d57664e9SAndroid Build Coastguard Worker     // Still started.
2006*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2007*d57664e9SAndroid Build Coastguard Worker 
2008*d57664e9SAndroid Build Coastguard Worker     // Still present.
2009*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
2010*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2011*d57664e9SAndroid Build Coastguard Worker     callback = mTimedQueue->mWhat;
2012*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
2013*d57664e9SAndroid Build Coastguard Worker 
2014*d57664e9SAndroid Build Coastguard Worker     // Fully loaded.
2015*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2016*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::Full))
2017*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::Full));
2018*d57664e9SAndroid Build Coastguard Worker     // But with readlogs.
2019*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2020*d57664e9SAndroid Build Coastguard Worker 
2021*d57664e9SAndroid Build Coastguard Worker     // Send the callback, still nothing.
2022*d57664e9SAndroid Build Coastguard Worker     callback();
2023*d57664e9SAndroid Build Coastguard Worker 
2024*d57664e9SAndroid Build Coastguard Worker     // Still started.
2025*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_STARTED);
2026*d57664e9SAndroid Build Coastguard Worker 
2027*d57664e9SAndroid Build Coastguard Worker     // Still present.
2028*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
2029*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, stateUpdateInterval);
2030*d57664e9SAndroid Build Coastguard Worker     callback = mTimedQueue->mWhat;
2031*d57664e9SAndroid Build Coastguard Worker     mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
2032*d57664e9SAndroid Build Coastguard Worker 
2033*d57664e9SAndroid Build Coastguard Worker     // Disable readlogs and expect the unbind.
2034*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2035*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2036*d57664e9SAndroid Build Coastguard Worker 
2037*d57664e9SAndroid Build Coastguard Worker     callback();
2038*d57664e9SAndroid Build Coastguard Worker 
2039*d57664e9SAndroid Build Coastguard Worker     // Destroyed.
2040*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
2041*d57664e9SAndroid Build Coastguard Worker }
2042*d57664e9SAndroid Build Coastguard Worker 
createPerUidTimeouts(std::initializer_list<std::tuple<int,int,int,int>> tuples)2043*d57664e9SAndroid Build Coastguard Worker static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
2044*d57664e9SAndroid Build Coastguard Worker         std::initializer_list<std::tuple<int, int, int, int>> tuples) {
2045*d57664e9SAndroid Build Coastguard Worker     std::vector<PerUidReadTimeouts> result;
2046*d57664e9SAndroid Build Coastguard Worker     for (auto&& tuple : tuples) {
2047*d57664e9SAndroid Build Coastguard Worker         result.emplace_back();
2048*d57664e9SAndroid Build Coastguard Worker         auto& timeouts = result.back();
2049*d57664e9SAndroid Build Coastguard Worker         timeouts.uid = std::get<0>(tuple);
2050*d57664e9SAndroid Build Coastguard Worker         timeouts.minTimeUs = std::get<1>(tuple);
2051*d57664e9SAndroid Build Coastguard Worker         timeouts.minPendingTimeUs = std::get<2>(tuple);
2052*d57664e9SAndroid Build Coastguard Worker         timeouts.maxPendingTimeUs = std::get<3>(tuple);
2053*d57664e9SAndroid Build Coastguard Worker     }
2054*d57664e9SAndroid Build Coastguard Worker     return result;
2055*d57664e9SAndroid Build Coastguard Worker }
2056*d57664e9SAndroid Build Coastguard Worker 
checkPerUidTimeouts(const Control & control,const std::vector<PerUidReadTimeouts> & perUidReadTimeouts)2057*d57664e9SAndroid Build Coastguard Worker static ErrorCode checkPerUidTimeouts(const Control& control,
2058*d57664e9SAndroid Build Coastguard Worker                                      const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2059*d57664e9SAndroid Build Coastguard Worker     std::vector<PerUidReadTimeouts> expected =
2060*d57664e9SAndroid Build Coastguard Worker             createPerUidTimeouts({{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}});
2061*d57664e9SAndroid Build Coastguard Worker     EXPECT_EQ(expected, perUidReadTimeouts);
2062*d57664e9SAndroid Build Coastguard Worker     return 0;
2063*d57664e9SAndroid Build Coastguard Worker }
2064*d57664e9SAndroid Build Coastguard Worker 
checkPerUidTimeoutsEmpty(const Control & control,const std::vector<PerUidReadTimeouts> & perUidReadTimeouts)2065*d57664e9SAndroid Build Coastguard Worker static ErrorCode checkPerUidTimeoutsEmpty(
2066*d57664e9SAndroid Build Coastguard Worker         const Control& control, const std::vector<PerUidReadTimeouts>& perUidReadTimeouts) {
2067*d57664e9SAndroid Build Coastguard Worker     EXPECT_EQ(0u, perUidReadTimeouts.size());
2068*d57664e9SAndroid Build Coastguard Worker     return 0;
2069*d57664e9SAndroid Build Coastguard Worker }
2070*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testPerUidTimeoutsTooShort)2071*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testPerUidTimeoutsTooShort) {
2072*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(1);
2073*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
2074*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
2075*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
2076*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
2077*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _)).Times(0);
2078*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(2);
2079*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
2080*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2081*d57664e9SAndroid Build Coastguard Worker     int storageId =
2082*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2083*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2084*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2085*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2086*d57664e9SAndroid Build Coastguard Worker                                       createPerUidTimeouts(
2087*d57664e9SAndroid Build Coastguard Worker                                               {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}}));
2088*d57664e9SAndroid Build Coastguard Worker }
2089*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testPerUidTimeoutsSuccess)2090*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testPerUidTimeoutsSuccess) {
2091*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
2092*d57664e9SAndroid Build Coastguard Worker     mAppOpsManager->checkPermissionSuccess();
2093*d57664e9SAndroid Build Coastguard Worker     mFs->hasFiles();
2094*d57664e9SAndroid Build Coastguard Worker 
2095*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, setUidReadTimeouts(_, _))
2096*d57664e9SAndroid Build Coastguard Worker             // First call.
2097*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Invoke(&checkPerUidTimeouts))
2098*d57664e9SAndroid Build Coastguard Worker             // Fully loaded and no readlogs.
2099*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Invoke(&checkPerUidTimeoutsEmpty));
2100*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mTimedQueue, addJob(_, _, _)).Times(3);
2101*d57664e9SAndroid Build Coastguard Worker 
2102*d57664e9SAndroid Build Coastguard Worker     // Loading storage.
2103*d57664e9SAndroid Build Coastguard Worker     EXPECT_CALL(*mIncFs, isEverythingFullyLoaded(_))
2104*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2105*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::MissingBlocks))
2106*d57664e9SAndroid Build Coastguard Worker             .WillOnce(Return(incfs::LoadingState::Full));
2107*d57664e9SAndroid Build Coastguard Worker 
2108*d57664e9SAndroid Build Coastguard Worker     // Mark DataLoader as 'system' so that readlogs don't pollute the timed queue.
2109*d57664e9SAndroid Build Coastguard Worker     mDataLoaderParcel.packageName = "android";
2110*d57664e9SAndroid Build Coastguard Worker 
2111*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2112*d57664e9SAndroid Build Coastguard Worker     int storageId =
2113*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2114*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2115*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2116*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, {},
2117*d57664e9SAndroid Build Coastguard Worker                                       createPerUidTimeouts(
2118*d57664e9SAndroid Build Coastguard Worker                                               {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 100000000}}));
2119*d57664e9SAndroid Build Coastguard Worker 
2120*d57664e9SAndroid Build Coastguard Worker     {
2121*d57664e9SAndroid Build Coastguard Worker         // Timed callback present -> 0 progress.
2122*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
2123*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2124*d57664e9SAndroid Build Coastguard Worker         const auto timedCallback = mTimedQueue->mWhat;
2125*d57664e9SAndroid Build Coastguard Worker         mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
2126*d57664e9SAndroid Build Coastguard Worker 
2127*d57664e9SAndroid Build Coastguard Worker         // Call it again.
2128*d57664e9SAndroid Build Coastguard Worker         timedCallback();
2129*d57664e9SAndroid Build Coastguard Worker     }
2130*d57664e9SAndroid Build Coastguard Worker 
2131*d57664e9SAndroid Build Coastguard Worker     {
2132*d57664e9SAndroid Build Coastguard Worker         // Still present -> some progress.
2133*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
2134*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2135*d57664e9SAndroid Build Coastguard Worker         const auto timedCallback = mTimedQueue->mWhat;
2136*d57664e9SAndroid Build Coastguard Worker         mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
2137*d57664e9SAndroid Build Coastguard Worker 
2138*d57664e9SAndroid Build Coastguard Worker         // Fully loaded but readlogs collection enabled.
2139*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(mDataLoader->setStorageParams(true), 0);
2140*d57664e9SAndroid Build Coastguard Worker 
2141*d57664e9SAndroid Build Coastguard Worker         // Call it again.
2142*d57664e9SAndroid Build Coastguard Worker         timedCallback();
2143*d57664e9SAndroid Build Coastguard Worker     }
2144*d57664e9SAndroid Build Coastguard Worker 
2145*d57664e9SAndroid Build Coastguard Worker     {
2146*d57664e9SAndroid Build Coastguard Worker         // Still present -> fully loaded + readlogs.
2147*d57664e9SAndroid Build Coastguard Worker         ASSERT_EQ(IncrementalService::kAllStoragesId, mTimedQueue->mId);
2148*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(mTimedQueue->mAfter, std::chrono::seconds(1));
2149*d57664e9SAndroid Build Coastguard Worker         const auto timedCallback = mTimedQueue->mWhat;
2150*d57664e9SAndroid Build Coastguard Worker         mTimedQueue->clearJob(IncrementalService::kAllStoragesId);
2151*d57664e9SAndroid Build Coastguard Worker 
2152*d57664e9SAndroid Build Coastguard Worker         // Now disable readlogs.
2153*d57664e9SAndroid Build Coastguard Worker         ASSERT_GE(mDataLoader->setStorageParams(false), 0);
2154*d57664e9SAndroid Build Coastguard Worker 
2155*d57664e9SAndroid Build Coastguard Worker         // Call it again.
2156*d57664e9SAndroid Build Coastguard Worker         timedCallback();
2157*d57664e9SAndroid Build Coastguard Worker     }
2158*d57664e9SAndroid Build Coastguard Worker 
2159*d57664e9SAndroid Build Coastguard Worker     // No callbacks anymore -> fully loaded and no readlogs.
2160*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mTimedQueue->mAfter, Milliseconds());
2161*d57664e9SAndroid Build Coastguard Worker }
2162*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testInvalidMetricsQuery)2163*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testInvalidMetricsQuery) {
2164*d57664e9SAndroid Build Coastguard Worker     const auto invalidStorageId = 100;
2165*d57664e9SAndroid Build Coastguard Worker     android::os::PersistableBundle result{};
2166*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->getMetrics(invalidStorageId, &result);
2167*d57664e9SAndroid Build Coastguard Worker     int64_t expected = -1, value = -1;
2168*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(
2169*d57664e9SAndroid Build Coastguard Worker             result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2170*d57664e9SAndroid Build Coastguard Worker                                             .c_str()),
2171*d57664e9SAndroid Build Coastguard Worker                            &value));
2172*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expected, value);
2173*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.empty());
2174*d57664e9SAndroid Build Coastguard Worker }
2175*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testNoDataLoaderMetrics)2176*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testNoDataLoaderMetrics) {
2177*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
2178*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2179*d57664e9SAndroid Build Coastguard Worker     int storageId =
2180*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2181*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2182*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2183*d57664e9SAndroid Build Coastguard Worker     android::os::PersistableBundle result{};
2184*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->getMetrics(storageId, &result);
2185*d57664e9SAndroid Build Coastguard Worker     int64_t expected = -1, value = -1;
2186*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(
2187*d57664e9SAndroid Build Coastguard Worker             result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
2188*d57664e9SAndroid Build Coastguard Worker                                             .c_str()),
2189*d57664e9SAndroid Build Coastguard Worker                            &value));
2190*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expected, value);
2191*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(1, (int)result.size());
2192*d57664e9SAndroid Build Coastguard Worker     bool expectedReadLogsEnabled = false;
2193*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(
2194*d57664e9SAndroid Build Coastguard Worker             result.getBoolean(String16(BnIncrementalService::METRICS_READ_LOGS_ENABLED().c_str()),
2195*d57664e9SAndroid Build Coastguard Worker                               &expectedReadLogsEnabled));
2196*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(mVold->readLogsEnabled(), expectedReadLogsEnabled);
2197*d57664e9SAndroid Build Coastguard Worker }
2198*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testInvalidMetricsKeys)2199*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
2200*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
2201*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2202*d57664e9SAndroid Build Coastguard Worker     int storageId =
2203*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2204*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2205*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2206*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2207*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
2208*d57664e9SAndroid Build Coastguard Worker     android::os::PersistableBundle result{};
2209*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->getMetrics(storageId, &result);
2210*d57664e9SAndroid Build Coastguard Worker     int64_t expected = -1, value = -1;
2211*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(result.getLong(String16("invalid"), &value));
2212*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expected, value);
2213*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(6, (int)result.size());
2214*d57664e9SAndroid Build Coastguard Worker }
2215*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testMetricsWithNoLastReadError)2216*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testMetricsWithNoLastReadError) {
2217*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
2218*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mIncFs, getMetrics(_))
2219*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Return(Metrics{
2220*d57664e9SAndroid Build Coastguard Worker                     .readsDelayedMin = 10,
2221*d57664e9SAndroid Build Coastguard Worker                     .readsDelayedMinUs = 5000,
2222*d57664e9SAndroid Build Coastguard Worker                     .readsDelayedPending = 10,
2223*d57664e9SAndroid Build Coastguard Worker                     .readsDelayedPendingUs = 5000,
2224*d57664e9SAndroid Build Coastguard Worker                     .readsFailedHashVerification = 10,
2225*d57664e9SAndroid Build Coastguard Worker                     .readsFailedOther = 10,
2226*d57664e9SAndroid Build Coastguard Worker                     .readsFailedTimedOut = 10,
2227*d57664e9SAndroid Build Coastguard Worker             }));
2228*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mIncFs, getLastReadError(_)).WillByDefault(Return(LastReadError{}));
2229*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2230*d57664e9SAndroid Build Coastguard Worker     int storageId =
2231*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2232*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2233*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2234*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2235*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
2236*d57664e9SAndroid Build Coastguard Worker     android::os::PersistableBundle result{};
2237*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->getMetrics(storageId, &result);
2238*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(9, (int)result.size());
2239*d57664e9SAndroid Build Coastguard Worker 
2240*d57664e9SAndroid Build Coastguard Worker     int expectedtotalDelayedReads = 20, totalDelayedReads = -1;
2241*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_TOTAL_DELAYED_READS().c_str()),
2242*d57664e9SAndroid Build Coastguard Worker                               &totalDelayedReads));
2243*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedtotalDelayedReads, totalDelayedReads);
2244*d57664e9SAndroid Build Coastguard Worker     int expectedtotalFailedReads = 30, totalFailedReads = -1;
2245*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_TOTAL_FAILED_READS().c_str()),
2246*d57664e9SAndroid Build Coastguard Worker                               &totalFailedReads));
2247*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedtotalFailedReads, totalFailedReads);
2248*d57664e9SAndroid Build Coastguard Worker     int64_t expectedtotalDelayedReadsMillis = 10, totalDelayedReadsMillis = -1;
2249*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.getLong(String16(BnIncrementalService::METRICS_TOTAL_DELAYED_READS_MILLIS()
2250*d57664e9SAndroid Build Coastguard Worker                                                 .c_str()),
2251*d57664e9SAndroid Build Coastguard Worker                                &totalDelayedReadsMillis));
2252*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedtotalDelayedReadsMillis, totalDelayedReadsMillis);
2253*d57664e9SAndroid Build Coastguard Worker 
2254*d57664e9SAndroid Build Coastguard Worker     int64_t expectedMillisSinceLastReadError = -1, millisSinceLastReadError = -1;
2255*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(
2256*d57664e9SAndroid Build Coastguard Worker             result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_LAST_READ_ERROR()
2257*d57664e9SAndroid Build Coastguard Worker                                             .c_str()),
2258*d57664e9SAndroid Build Coastguard Worker                            &millisSinceLastReadError));
2259*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedMillisSinceLastReadError, millisSinceLastReadError);
2260*d57664e9SAndroid Build Coastguard Worker     int expectedLastReadErrorNumber = -1, lastReadErrorNumber = -1;
2261*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(
2262*d57664e9SAndroid Build Coastguard Worker             result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_NUMBER().c_str()),
2263*d57664e9SAndroid Build Coastguard Worker                           &lastReadErrorNumber));
2264*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedLastReadErrorNumber, lastReadErrorNumber);
2265*d57664e9SAndroid Build Coastguard Worker     int expectedLastReadUid = -1, lastReadErrorUid = -1;
2266*d57664e9SAndroid Build Coastguard Worker     ASSERT_FALSE(
2267*d57664e9SAndroid Build Coastguard Worker             result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_UID().c_str()),
2268*d57664e9SAndroid Build Coastguard Worker                           &lastReadErrorUid));
2269*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedLastReadUid, lastReadErrorUid);
2270*d57664e9SAndroid Build Coastguard Worker }
2271*d57664e9SAndroid Build Coastguard Worker 
TEST_F(IncrementalServiceTest,testMetricsWithLastReadError)2272*d57664e9SAndroid Build Coastguard Worker TEST_F(IncrementalServiceTest, testMetricsWithLastReadError) {
2273*d57664e9SAndroid Build Coastguard Worker     mVold->setIncFsMountOptionsSuccess();
2274*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mIncFs, getMetrics(_)).WillByDefault(Return(Metrics{}));
2275*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(5);
2276*d57664e9SAndroid Build Coastguard Worker     const auto now = mClock->getClock();
2277*d57664e9SAndroid Build Coastguard Worker     ON_CALL(*mIncFs, getLastReadError(_))
2278*d57664e9SAndroid Build Coastguard Worker             .WillByDefault(Return(LastReadError{.timestampUs = static_cast<uint64_t>(
2279*d57664e9SAndroid Build Coastguard Worker                                                         duration_cast<std::chrono::microseconds>(
2280*d57664e9SAndroid Build Coastguard Worker                                                                 now.time_since_epoch())
2281*d57664e9SAndroid Build Coastguard Worker                                                                 .count()),
2282*d57664e9SAndroid Build Coastguard Worker                                                 .errorNo = static_cast<uint32_t>(-ETIME),
2283*d57664e9SAndroid Build Coastguard Worker                                                 .uid = 20000}));
2284*d57664e9SAndroid Build Coastguard Worker     TemporaryDir tempDir;
2285*d57664e9SAndroid Build Coastguard Worker     int storageId =
2286*d57664e9SAndroid Build Coastguard Worker             mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
2287*d57664e9SAndroid Build Coastguard Worker                                                IncrementalService::CreateOptions::CreateNew);
2288*d57664e9SAndroid Build Coastguard Worker     ASSERT_GE(storageId, 0);
2289*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
2290*d57664e9SAndroid Build Coastguard Worker                                                   {}, {}));
2291*d57664e9SAndroid Build Coastguard Worker     mClock->advanceMs(10);
2292*d57664e9SAndroid Build Coastguard Worker     android::os::PersistableBundle result{};
2293*d57664e9SAndroid Build Coastguard Worker     mIncrementalService->getMetrics(storageId, &result);
2294*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(12, (int)result.size());
2295*d57664e9SAndroid Build Coastguard Worker     int64_t expectedMillisSinceLastReadError = 10, millisSinceLastReadError = -1;
2296*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.getLong(String16(BnIncrementalService::METRICS_MILLIS_SINCE_LAST_READ_ERROR()
2297*d57664e9SAndroid Build Coastguard Worker                                                 .c_str()),
2298*d57664e9SAndroid Build Coastguard Worker                                &millisSinceLastReadError));
2299*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedMillisSinceLastReadError, millisSinceLastReadError);
2300*d57664e9SAndroid Build Coastguard Worker     int expectedLastReadErrorNumber = -ETIME, lastReadErrorNumber = -1;
2301*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(
2302*d57664e9SAndroid Build Coastguard Worker             result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_NUMBER().c_str()),
2303*d57664e9SAndroid Build Coastguard Worker                           &lastReadErrorNumber));
2304*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedLastReadErrorNumber, lastReadErrorNumber);
2305*d57664e9SAndroid Build Coastguard Worker     int expectedLastReadUid = 20000, lastReadErrorUid = -1;
2306*d57664e9SAndroid Build Coastguard Worker     ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_LAST_READ_ERROR_UID().c_str()),
2307*d57664e9SAndroid Build Coastguard Worker                               &lastReadErrorUid));
2308*d57664e9SAndroid Build Coastguard Worker     ASSERT_EQ(expectedLastReadUid, lastReadErrorUid);
2309*d57664e9SAndroid Build Coastguard Worker }
2310*d57664e9SAndroid Build Coastguard Worker 
2311*d57664e9SAndroid Build Coastguard Worker } // namespace android::os::incremental
2312