1 /*
2  * Copyright (c) 2024 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 #define LOG_TAG "RdbCloudTest"
16 
17 #include "rdb_cloud.h"
18 
19 #include "gtest/gtest.h"
20 #include "log_print.h"
21 #include "rdb_cloud_data_translate.h"
22 
23 using namespace testing::ext;
24 using namespace OHOS::DistributedData;
25 using namespace OHOS::DistributedRdb;
26 using DBVBucket = DistributedDB::VBucket;
27 using DBStatus = DistributedDB::DBStatus;
28 std::vector<DBVBucket> g_DBVBucket = { { { "#gid", { "0000000" } }, { "#flag", { true } },
29     { "#value", { int64_t(100) } }, { "#float", { double(100) } }, { "#_type", { int64_t(1) } },
30     { "#_query", { Bytes({ 1, 2, 3, 4 }) } } } };
31 namespace OHOS::Test {
32 namespace DistributedRDBTest {
33 class RdbCloudTest : public testing::Test {
34 public:
SetUpTestCase(void)35     static void SetUpTestCase(void){};
TearDownTestCase(void)36     static void TearDownTestCase(void){};
SetUp()37     void SetUp(){};
TearDown()38     void TearDown(){};
39 };
40 
41 /**
42 * @tc.name: RdbCloudTest001
43 * @tc.desc: RdbCloud BatchInsert BatchUpdate BatchDelete test.
44 * @tc.type: FUNC
45 * @tc.require:
46 * @tc.author: SQL
47 */
HWTEST_F(RdbCloudTest, RdbCloudTest001, TestSize.Level1)48 HWTEST_F(RdbCloudTest, RdbCloudTest001, TestSize.Level1)
49 {
50     BindAssets bindAssets;
51     Bytes bytes;
52     std::shared_ptr<CloudDB> cloudDB = std::make_shared<CloudDB>();
53     RdbCloud rdbCloud(cloudDB, &bindAssets);
54     std::string tableName = "testTable";
55     auto result = rdbCloud.BatchInsert(tableName, std::move(g_DBVBucket), g_DBVBucket);
56     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
57     result = rdbCloud.BatchUpdate(tableName, std::move(g_DBVBucket), g_DBVBucket);
58     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
59     result = rdbCloud.BatchDelete(tableName, g_DBVBucket);
60     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
61 }
62 
63 /**
64 * @tc.name: RdbCloudTest002
65 * @tc.desc: RdbCloud Query PreSharing HeartBeat Close test.
66 * @tc.type: FUNC
67 * @tc.require:
68 * @tc.author: SQL
69 */
HWTEST_F(RdbCloudTest, RdbCloudTest002, TestSize.Level1)70 HWTEST_F(RdbCloudTest, RdbCloudTest002, TestSize.Level1)
71 {
72     BindAssets bindAssets;
73     std::shared_ptr<CloudDB> cloudDB = std::make_shared<CloudDB>();
74     RdbCloud rdbCloud(cloudDB, &bindAssets);
75     std::string tableName = "testTable";
76     rdbCloud.Lock();
77     std::string traceId = "id";
78     rdbCloud.SetPrepareTraceId(traceId);
79     auto result = rdbCloud.BatchInsert(tableName, std::move(g_DBVBucket), g_DBVBucket);
80     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
81     DBVBucket extends = {
82         {"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}},
83         {"#_type", {int64_t(1)}}, {"#_query", {Bytes({ 1, 2, 3, 4 })}}
84     };
85     result = rdbCloud.Query(tableName, extends, g_DBVBucket);
86     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
87     std::vector<VBucket> vBuckets = {
88         {{"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}},
89         {"#_type", {int64_t(1)}}, {"#_query", {Bytes({ 1, 2, 3, 4 })}}}
90     };
91     rdbCloud.PreSharing(tableName, vBuckets);
92     result = rdbCloud.HeartBeat();
93     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
94     rdbCloud.UnLock();
95     rdbCloud.GetEmptyCursor(tableName);
96     result = rdbCloud.Close();
97     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
98 }
99 
100 /**
101 * @tc.name: RdbCloudTest003
102 * @tc.desc: RdbCloud Query error test.
103 * @tc.type: FUNC
104 * @tc.require:
105 * @tc.author: SQL
106 */
HWTEST_F(RdbCloudTest, RdbCloudTest003, TestSize.Level1)107 HWTEST_F(RdbCloudTest, RdbCloudTest003, TestSize.Level1)
108 {
109     BindAssets bindAssets;
110     bindAssets.bindAssets = nullptr;
111     std::shared_ptr<CloudDB> cloudDB = std::make_shared<CloudDB>();
112     RdbCloud rdbCloud(cloudDB, &bindAssets);
113     std::string tableName = "testTable";
114     DBVBucket extends = {
115         {"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}},
116         {"#_type", {int64_t(1)}}
117     };
118     std::vector<DBVBucket> data = {
119         {{"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}}}
120     };
121     auto result = rdbCloud.Query(tableName, extends, data);
122     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
123 
124     extends = {
125         {"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}},
126         {"#_query", {Bytes({ 1, 2, 3, 4 })}}
127     };
128     result = rdbCloud.Query(tableName, extends, data);
129     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
130 
131     extends = {
132         {"#gid", {"0000000"}}, {"#flag", {true}}, {"#value", {int64_t(100)}}, {"#float", {double(100)}},
133         {"#_type", {int64_t(0)}}
134     };
135     result = rdbCloud.Query(tableName, extends, data);
136     EXPECT_EQ(result, DBStatus::CLOUD_ERROR);
137 }
138 
139 /**
140 * @tc.name: ConvertStatus
141 * @tc.desc: RdbCloud ConvertStatus function test.
142 * @tc.type: FUNC
143 * @tc.require:
144 * @tc.author: SQL
145 */
HWTEST_F(RdbCloudTest, ConvertStatus, TestSize.Level1)146 HWTEST_F(RdbCloudTest, ConvertStatus, TestSize.Level1)
147 {
148     BindAssets bindAssets;
149     std::shared_ptr<CloudDB> cloudDB = std::make_shared<CloudDB>();
150     RdbCloud rdbCloud(cloudDB, &bindAssets);
151     auto result = rdbCloud.ConvertStatus(GeneralError::E_OK);
152     EXPECT_EQ(result, DBStatus::OK);
153     result = rdbCloud.ConvertStatus(GeneralError::E_NETWORK_ERROR);
154     EXPECT_EQ(result, DBStatus::CLOUD_NETWORK_ERROR);
155     result = rdbCloud.ConvertStatus(GeneralError::E_LOCKED_BY_OTHERS);
156     EXPECT_EQ(result, DBStatus::CLOUD_LOCK_ERROR);
157     result = rdbCloud.ConvertStatus(GeneralError::E_RECODE_LIMIT_EXCEEDED);
158     EXPECT_EQ(result, DBStatus::CLOUD_FULL_RECORDS);
159     result = rdbCloud.ConvertStatus(GeneralError::E_NO_SPACE_FOR_ASSET);
160     EXPECT_EQ(result, DBStatus::CLOUD_ASSET_SPACE_INSUFFICIENT);
161     result = rdbCloud.ConvertStatus(GeneralError::E_RECORD_EXIST_CONFLICT);
162     EXPECT_EQ(result, DBStatus::CLOUD_RECORD_EXIST_CONFLICT);
163 }
164 
165 /**
166 * @tc.name: BlobToAssets
167 * @tc.desc: rdb_cloud_data_translate BlobToAsset error test.
168 * @tc.type: FUNC
169 * @tc.require:
170 * @tc.author: SQL
171 */
HWTEST_F(RdbCloudTest, BlobToAssets, TestSize.Level1)172 HWTEST_F(RdbCloudTest, BlobToAssets, TestSize.Level1)
173 {
174     RdbCloudDataTranslate rdbTranslate;
175     DistributedDB::Asset asset = {
176         .name = "",
177         .assetId = "",
178         .subpath = "",
179         .uri = "",
180         .modifyTime = "",
181         .createTime = "",
182         .size = "",
183         .hash = ""
184     };
185     std::vector<uint8_t> blob;
186     auto result = rdbTranslate.BlobToAsset(blob);
187     EXPECT_EQ(result, asset);
188 
189     DistributedDB::Assets assets;
190     blob = rdbTranslate.AssetsToBlob(assets);
191     auto results = rdbTranslate.BlobToAssets(blob);
192     EXPECT_EQ(results, assets);
193 }
194 } // namespace DistributedRDBTest
195 } // namespace OHOS::Test