1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gmock/gmock.h"
17 #include "rdb_helper.h"
18 #include "security_guard_define.h"
19 #define private public
20 #define protected public
21 #include "app_info_rdb_helper.h"
22 #undef private
23 #undef protected
24 
25 using namespace testing;
26 using namespace testing::ext;
27 using namespace OHOS::Security::SecurityGuard;
28 namespace OHOS {
29     std::shared_ptr<NativeRdb::MockRdbHelperInterface> NativeRdb::RdbHelper::instance_ = nullptr;
30     std::mutex NativeRdb::RdbHelper::mutex_ {};
31 }
32 namespace OHOS::Security::SecurityGuardTest {
33 namespace {
34     constexpr int SUCCESS = 0;
35 }
36 class AppInfoDataBaseTest : public testing::Test {
37 public:
38     static void SetUpTestCase();
39 
40     static void TearDownTestCase();
41 
42     void SetUp() override;
43 
44     void TearDown() override;
45 };
46 
SetUpTestCase()47 void AppInfoDataBaseTest::SetUpTestCase()
48 {
49 }
50 
TearDownTestCase()51 void AppInfoDataBaseTest::TearDownTestCase()
52 {
53     NativeRdb::RdbHelper::DelInterface();
54 }
55 
SetUp()56 void AppInfoDataBaseTest::SetUp()
57 {
58 }
59 
TearDown()60 void AppInfoDataBaseTest::TearDown()
61 {
62 }
63 
64 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper001, TestSize.Level1)
65 {
66     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
67     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
68     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
69         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0202( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 70         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
71             errCode = SUCCESS;
72             return rdbStoreMock;
73         });
74     EXPECT_CALL(*rdbStoreMock, Query(_, _)).WillOnce(Return(nullptr))
75         .WillRepeatedly(
__anon852fef0f0302(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 76         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
77             return resultSetMock;
78         });
79     EXPECT_CALL(*resultSetMock, GoToNextRow).WillOnce(Return(SUCCESS)).WillRepeatedly(Return(FAILED));
80     EXPECT_CALL(*resultSetMock, GetString).WillRepeatedly(Return(0));
81     EXPECT_CALL(*resultSetMock, GetInt).WillRepeatedly(Return(0));
82     EXPECT_CALL(*resultSetMock, GetRowCount).WillOnce(Return(-1)).WillRepeatedly(Return(0));
83     EXPECT_CALL(*resultSetMock, GetColumnCount).WillRepeatedly(Return(0));
84     EXPECT_CALL(*resultSetMock, GetAllColumnNames).WillRepeatedly(Return(0));
85     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
86     AppInfoRdbHelper helper;
87     int32_t ret = helper.Init();
88     EXPECT_EQ(ret, SUCCESS);
89     std::vector<AppInfo> events;
90     ret = helper.QueryAllAppInfo(events);
91     EXPECT_EQ(ret, DB_OPT_ERR);
92     ret = helper.QueryAllAppInfo(events);
93     EXPECT_EQ(ret, DB_LOAD_ERR);
94     ret = helper.QueryAllAppInfo(events);
95     EXPECT_EQ(ret, SUCCESS);
96 }
97 
98 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper002, TestSize.Level1)
99 {
100     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
101     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
102     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
103         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0402( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 104         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
105             errCode = SUCCESS;
106             return rdbStoreMock;
107         });
108     EXPECT_CALL(*rdbStoreMock, Query(_, _))
109         .WillRepeatedly(
__anon852fef0f0502(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 110         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
111             return resultSetMock;
112         });
113     EXPECT_CALL(*rdbStoreMock, BatchInsert).WillOnce(Return(FAILED)).WillOnce(Return(SUCCESS));
114     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
115     EXPECT_CALL(*rdbStoreMock, Insert).WillOnce(Return(FAILED)).WillOnce(Return(SUCCESS));
116     AppInfoRdbHelper helper;
117     int32_t ret = helper.Init();
118     EXPECT_EQ(ret, SUCCESS);
119     AppInfo event;
120     event.attrs.emplace_back("att");
121     event.attrs.emplace_back("att1");
122     ret = helper.InsertAppInfo(event);
123     EXPECT_EQ(ret, DB_OPT_ERR);
124     ret = helper.InsertAppInfo(event);
125     EXPECT_EQ(ret, SUCCESS);
126     std::vector<AppInfo> events;
127     events.emplace_back(event);
128     ret = helper.InsertAllAppInfo(events);
129     EXPECT_EQ(ret, DB_OPT_ERR);
130     ret = helper.InsertAllAppInfo(events);
131     EXPECT_EQ(ret, SUCCESS);
132 }
133 
134 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper003, TestSize.Level1)
135 {
136     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
137     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
138     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
139         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0602( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 140         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
141             errCode = SUCCESS;
142             return rdbStoreMock;
143         });
144     EXPECT_CALL(*rdbStoreMock, Query(_, _)).WillOnce(Return(nullptr))
145         .WillRepeatedly(
__anon852fef0f0702(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 146         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
147             return resultSetMock;
148         });
149     EXPECT_CALL(*rdbStoreMock, Delete).WillRepeatedly(Return(SUCCESS));
150     EXPECT_CALL(*rdbStoreMock, Attach).WillRepeatedly(Return(0));
151     EXPECT_CALL(*resultSetMock, GoToNextRow).WillOnce(Return(SUCCESS)).WillRepeatedly(Return(FAILED));
152     EXPECT_CALL(*resultSetMock, GetString).WillRepeatedly(Return(0));
153     EXPECT_CALL(*resultSetMock, GetLong).WillRepeatedly(Return(0));
154     EXPECT_CALL(*resultSetMock, GetInt).WillRepeatedly(Return(0));
155     EXPECT_CALL(*resultSetMock, GoToRow).WillRepeatedly(Return(0));
156     EXPECT_CALL(*resultSetMock, GetRowCount).WillOnce(Return(-1)).WillRepeatedly(Return(0));
157     EXPECT_CALL(*resultSetMock, GetColumnCount).WillRepeatedly(Return(0));
158     EXPECT_CALL(*resultSetMock, GetAllColumnNames).WillRepeatedly(Return(0));
159     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
160     AppInfoRdbHelper helper;
161     int32_t ret = helper.Init();
162     EXPECT_EQ(ret, SUCCESS);
163     std::vector<AppInfo> events;
164     std::string appName;
165     ret = helper.QueryAppInfosByName(appName, events);
166     EXPECT_EQ(ret, DB_OPT_ERR);
167     ret = helper.QueryAppInfosByName(appName, events);
168     EXPECT_EQ(ret, DB_LOAD_ERR);
169     ret = helper.QueryAppInfosByName(appName, events);
170     EXPECT_EQ(ret, SUCCESS);
171 }
172 
173 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper004, TestSize.Level1)
174 {
175     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
176     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
177     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
178         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0802( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 179         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
180             errCode = SUCCESS;
181             return rdbStoreMock;
182         });
183     EXPECT_CALL(*rdbStoreMock, Query(_, _)).WillOnce(Return(nullptr))
184         .WillRepeatedly(
__anon852fef0f0902(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 185         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
186             return resultSetMock;
187         });
188     EXPECT_CALL(*rdbStoreMock, Delete).WillOnce(Return(FAILED)).WillOnce(Return(SUCCESS));
189     EXPECT_CALL(*rdbStoreMock, Attach).WillRepeatedly(Return(0));
190     EXPECT_CALL(*resultSetMock, GoToNextRow).WillOnce(Return(SUCCESS)).WillRepeatedly(Return(FAILED));
191     EXPECT_CALL(*resultSetMock, GetString).WillRepeatedly(Return(0));
192     EXPECT_CALL(*resultSetMock, GetLong).WillRepeatedly(Return(0));
193     EXPECT_CALL(*resultSetMock, GetInt).WillRepeatedly(Return(0));
194     EXPECT_CALL(*resultSetMock, GoToRow).WillRepeatedly(Return(0));
195     EXPECT_CALL(*resultSetMock, GetRowCount).WillRepeatedly(Return(0));
196     EXPECT_CALL(*resultSetMock, GetColumnCount).WillRepeatedly(Return(0));
197     EXPECT_CALL(*resultSetMock, GetAllColumnNames).WillRepeatedly(Return(0));
198     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
199     AppInfoRdbHelper helper;
200     int32_t ret = helper.Init();
201     EXPECT_EQ(ret, SUCCESS);
202     std::vector<AppInfo> events;
203     std::string appName;
204     ret = helper.DeleteAppInfoByNameAndGlobbalFlag(appName, 0);
205     EXPECT_EQ(ret, DB_OPT_ERR);
206     ret = helper.DeleteAppInfoByNameAndGlobbalFlag(appName, 0);
207     EXPECT_EQ(ret, DB_OPT_ERR);
208     ret = helper.DeleteAppInfoByNameAndGlobbalFlag(appName, 0);
209     EXPECT_EQ(ret, SUCCESS);
210 }
211 
212 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper005, TestSize.Level1)
213 {
214     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
215     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
216     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
217         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0a02( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 218         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
219             errCode = SUCCESS;
220             return rdbStoreMock;
221         });
222     EXPECT_CALL(*rdbStoreMock, Query(_, _)).WillOnce(Return(nullptr))
223         .WillRepeatedly(
__anon852fef0f0b02(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 224         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
225             return resultSetMock;
226         });
227     EXPECT_CALL(*rdbStoreMock, Delete).WillRepeatedly(Return(SUCCESS));
228     EXPECT_CALL(*rdbStoreMock, Attach).WillRepeatedly(Return(0));
229     EXPECT_CALL(*resultSetMock, GoToNextRow).WillOnce(Return(SUCCESS)).WillRepeatedly(Return(FAILED));;
230     EXPECT_CALL(*resultSetMock, GetString).WillRepeatedly(Return(0));
231     EXPECT_CALL(*resultSetMock, GetLong).WillRepeatedly(Return(0));
232     EXPECT_CALL(*resultSetMock, GetInt).WillRepeatedly(Return(0));
233     EXPECT_CALL(*resultSetMock, GoToRow).WillRepeatedly(Return(0));
234     EXPECT_CALL(*resultSetMock, GetRowCount).WillOnce(Return(-1)).WillRepeatedly(Return(0));
235     EXPECT_CALL(*resultSetMock, GetColumnCount).WillRepeatedly(Return(0));
236     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
237     EXPECT_CALL(*resultSetMock, GetAllColumnNames).WillRepeatedly(
__anon852fef0f0c02(std::vector<std::string> &columnNames) 238         [] (std::vector<std::string> &columnNames) {
239             columnNames.emplace_back(ID);
240             columnNames.emplace_back(APP_NAME);
241             columnNames.emplace_back(APP_FINGERPRINT);
242             columnNames.emplace_back(APP_ATTRIBUTES);
243             columnNames.emplace_back(IS_GLOBAL_APP);
244             return SUCCESS;
245         });
246     std::vector<AppInfo> events;
247     std::string attr;
248     AppInfoRdbHelper helper;
249     helper.GetInstance();
250     int32_t ret = helper.Init();
251     EXPECT_EQ(ret, SUCCESS);
252     ret = helper.QueryAppInfoByAttribute(attr, events);
253     EXPECT_EQ(ret, DB_OPT_ERR);
254     ret = helper.QueryAppInfoByAttribute(attr, events);
255     EXPECT_EQ(ret, DB_LOAD_ERR);
256     ret = helper.QueryAppInfoByAttribute(attr, events);
257     EXPECT_EQ(ret, SUCCESS);
258 }
259 
260 HWTEST_F(AppInfoDataBaseTest, TestAppInfoRdbHelper006, TestSize.Level1)
261 {
262     auto rdbStoreMock = std::make_shared<NativeRdb::RdbStore>();
263     auto resultSetMock = std::make_shared<NativeRdb::ResultSet>();
264     EXPECT_CALL(*(NativeRdb::RdbHelper::GetInterface()), GetRdbStore)
265         .WillRepeatedly([&rdbStoreMock] (
__anon852fef0f0d02( const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) 266         const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback, int &errCode) {
267             errCode = SUCCESS;
268             return rdbStoreMock;
269         });
270     EXPECT_CALL(*rdbStoreMock, Query(_, _)).WillOnce(Return(nullptr))
271         .WillRepeatedly(
__anon852fef0f0e02(const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) 272         [&resultSetMock] (const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> columns) {
273             return resultSetMock;
274         });
275     EXPECT_CALL(*rdbStoreMock, Delete).WillOnce(Return(FAILED)).WillOnce(Return(SUCCESS));
276     EXPECT_CALL(*rdbStoreMock, Attach).WillRepeatedly(Return(0));
277     EXPECT_CALL(*resultSetMock, GoToNextRow).WillOnce(Return(SUCCESS)).WillRepeatedly(Return(FAILED));
278     EXPECT_CALL(*resultSetMock, GetString).WillRepeatedly(Return(0));
279     EXPECT_CALL(*resultSetMock, GetLong).WillRepeatedly(Return(0));
280     EXPECT_CALL(*resultSetMock, GetInt).WillRepeatedly(Return(0));
281     EXPECT_CALL(*resultSetMock, GoToRow).WillRepeatedly(Return(0));
282     EXPECT_CALL(*resultSetMock, GetRowCount).WillRepeatedly(Return(0));
283     EXPECT_CALL(*resultSetMock, GetColumnCount).WillRepeatedly(Return(0));
284     EXPECT_CALL(*resultSetMock, GetAllColumnNames).WillRepeatedly(Return(0));
285     EXPECT_CALL(*resultSetMock, Close).WillRepeatedly(Return(0));
286     AppInfoRdbHelper helper;
287     int32_t ret = helper.Init();
288     EXPECT_EQ(ret, SUCCESS);
289     std::vector<AppInfo> events;
290     int global = 0;
291     ret = helper.DeleteAppInfoByIsGlobalApp(global);
292     EXPECT_EQ(ret, DB_OPT_ERR);
293     ret = helper.DeleteAppInfoByIsGlobalApp(global);
294     EXPECT_EQ(ret, DB_OPT_ERR);
295     ret = helper.DeleteAppInfoByIsGlobalApp(global);
296     EXPECT_EQ(ret, SUCCESS);
297 }
298 }
299