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