1 /*
2  * Copyright (c) 2021-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 "base_test.h"
17 
18 #include <cstdio>
19 #include <fcntl.h>
20 #include "rdb_utils.h"
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 
24 #include "contacts_path.h"
25 #include "test_common.h"
26 
27 namespace Contacts {
28 namespace Test {
BaseTest()29 BaseTest::BaseTest()
30 {
31     OHOS::Contacts::ContactsPath::RDB_PATH = DataPath::RDB_PATH;
32     OHOS::Contacts::ContactsPath::RDB_BACKUP_PATH = DataPath::RDB_BACKUP_PATH;
33 }
34 
~BaseTest()35 BaseTest::~BaseTest()
36 {
37 }
38 
ContactsRand()39 int BaseTest::ContactsRand()
40 {
41     int fd = 0;
42     int randNum = 0;
43     int result;
44     fd = open("/dev/urandom", O_RDONLY);
45     read(fd, &result, sizeof(randNum));
46     close(fd);
47     return result;
48 }
49 
InitAbility()50 void BaseTest::InitAbility()
51 {
52     std::shared_ptr<OHOS::AppExecFwk::AbilityInfo> abilityInfo = std::make_shared<OHOS::AppExecFwk::AbilityInfo>();
53     abilityInfo->name = "AbilityClassName";
54     abilityInfo->type = OHOS::AppExecFwk::AbilityType::DATA;
55     abilityInfo->isNativeAbility = true;
56     std::shared_ptr<OHOS::AppExecFwk::AbilityLocalRecord> abilityLocalRecord =
57         std::make_shared<OHOS::AppExecFwk::AbilityLocalRecord>(abilityInfo, nullptr);
58     std::shared_ptr<OHOS::AppExecFwk::OHOSApplication> application;
59     std::shared_ptr<OHOS::AppExecFwk::AbilityHandler> handler;
60     OHOS::sptr<IRemoteObject> remoteObject;
61     calllogAbility.Init(abilityLocalRecord, application, handler, remoteObject);
62     voicemailAbility.Init(abilityLocalRecord, application, handler, remoteObject);
63     contactsDataAbility.Init(abilityLocalRecord, application, handler, remoteObject);
64 }
65 
66 /**
67  * @brief check values and resultSet value
68  *
69  * @param rawContactValues of data source
70  * @param resultSet of database
71  * @param test name
72  */
CheckResultSet(OHOS::DataShare::DataShareValuesBucket &values, const std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string testName)73 void BaseTest::CheckResultSet(OHOS::DataShare::DataShareValuesBucket &values,
74     const std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string testName)
75 {
76     std::vector<std::string> columnNames;
77     resultSet->GetAllColumnNames(columnNames);
78     if (resultSet->GoToFirstRow() == OHOS::NativeRdb::E_OK) {
79         int size = columnNames.size();
80         for (int i = 0; i < size; i++) {
81             CheckData(values, resultSet, columnNames[i], testName);
82         }
83     }
84     resultSet->Close();
85 }
86 
CheckData(OHOS::DataShare::DataShareValuesBucket &values, const std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string &columnName, std::string testName)87 void BaseTest::CheckData(OHOS::DataShare::DataShareValuesBucket &values,
88     const std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string &columnName,
89     std::string testName)
90 {
91     std::string typeValue = columnName;
92     int columnIndex = 0;
93     resultSet->GetColumnIndex(typeValue, columnIndex);
94     OHOS::DataShare::DataType columnType;
95     resultSet->GetDataType(columnIndex, columnType);
96     OHOS::NativeRdb::ValuesBucket valuesBucket = OHOS::RdbDataShareAdapter::RdbUtils::ToValuesBucket(values);
97     // Compare values and resultSet column value  equality
98     if (columnType == OHOS::DataShare::DataType::TYPE_INTEGER) {
99         int resultSetIntValue = 0;
100         resultSet->GetInt(columnIndex, resultSetIntValue);
101         if (valuesBucket.HasColumn(typeValue)) {
102             int valuesIntValue = 0;
103             OHOS::NativeRdb::ValueObject valuesObject;
104             valuesBucket.GetObject(typeValue, valuesObject);
105             valuesObject.GetInt(valuesIntValue);
106             std::string tempName = testName;
107             tempName.append("CheckResultSet columnName : %{public}s insertValue = %{public}d  ");
108             tempName.append("databaseValue = %{public}d");
109             HILOG_INFO(tempName.c_str(), typeValue.c_str(), valuesIntValue, resultSetIntValue);
110             EXPECT_EQ(resultSetIntValue, valuesIntValue);
111         }
112     } else if (columnType == OHOS::DataShare::DataType::TYPE_STRING) {
113         std::string resultSetStringValue;
114         resultSet->GetString(columnIndex, resultSetStringValue);
115         if (valuesBucket.HasColumn(typeValue)) {
116             OHOS::NativeRdb::ValueObject valuesObject;
117             std::string valuesStringValue;
118             valuesBucket.GetObject(typeValue, valuesObject);
119             valuesObject.GetString(valuesStringValue);
120             std::string tempName = testName;
121             tempName.append("CheckResultSet columnName : %{public}s insertValue = %{public}s  ");
122             tempName.append("databaseValue = %{public}s");
123             HILOG_INFO(tempName.c_str(), typeValue.c_str(), valuesStringValue.c_str(), resultSetStringValue.c_str());
124             EXPECT_EQ(resultSetStringValue, valuesStringValue);
125         }
126     }
127 }
128 
129 /**
130  * @brief check values and resultSet value
131  *
132  * @param values of data source
133  * @param resultSet of database
134  */
CheckResultSetList(std::vector<OHOS::DataShare::DataShareValuesBucket> &valuesVector, std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string testName)135 void BaseTest::CheckResultSetList(std::vector<OHOS::DataShare::DataShareValuesBucket> &valuesVector,
136     std::shared_ptr<OHOS::DataShare::DataShareResultSet> &resultSet, std::string testName)
137 {
138     std::vector<std::string> columnNames;
139     resultSet->GetAllColumnNames(columnNames);
140     int resultSetNum = resultSet->GoToFirstRow();
141     int index = 0;
142     while (resultSetNum == OHOS::NativeRdb::E_OK) {
143         OHOS::DataShare::DataShareValuesBucket values = valuesVector[index];
144         int size = columnNames.size();
145         for (int i = 0; i < size; i++) {
146             CheckData(valuesVector[index], resultSet, columnNames[i], testName);
147         }
148         resultSetNum = resultSet->GoToNextRow();
149         index++;
150     }
151     resultSet->Close();
152 }
153 } // namespace Test
154 } // namespace Contacts