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 #define LOG_TAG "CloudDataTest"
16 #include <gtest/gtest.h>
17 #include "log_print.h"
18 #include "ipc_skeleton.h"
19 #include "account/account_delegate.h"
20 #include "cloud/cloud_event.h"
21 #include "cloud/cloud_server.h"
22 #include "cloud/schema_meta.h"
23 #include "communicator/device_manager_adapter.h"
24 #include "device_matrix.h"
25 #include "eventcenter/event_center.h"
26 #include "feature/feature_system.h"
27 #include "metadata/meta_data_manager.h"
28 #include "metadata/store_meta_data.h"
29 #include "metadata/store_meta_data_local.h"
30 #include "mock/db_store_mock.h"
31 #include "rdb_types.h"
32 using namespace testing::ext;
33 using namespace OHOS::DistributedData;
34 using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter;
35
36 namespace OHOS::Test {
37 namespace DistributedDataTest {
38 static constexpr const char *TEST_CLOUD_BUNDLE = "test_cloud_bundleName";
39 static constexpr const char *TEST_CLOUD_APPID = "test_cloud_appid";
40 static constexpr const char *TEST_CLOUD_STORE = "test_cloud_database_name";
41 class CloudDataTest : public testing::Test {
42 public:
43 static void SetUpTestCase(void);
44 static void TearDownTestCase(void);
45 void SetUp();
46 void TearDown();
47
48 static SchemaMeta schemaMeta_;
49 protected:
50 static constexpr const char *TEST_DISTRIBUTEDDATA_BUNDLE = "test_distributeddata";
51 static constexpr const char *TEST_DISTRIBUTEDDATA_STORE = "test_service_meta";
52
53 void InitMetaData();
54 void InitSchemaMeta();
55 static std::shared_ptr<DBStoreMock> dbStoreMock_;
56 StoreMetaData metaData_;
57 };
58
59 class CloudServerMock : public CloudServer {
60 public:
61 CloudInfo GetServerInfo(int32_t userId) override;
62 SchemaMeta GetAppSchema(int32_t userId, const std::string &bundleName) override;
63 virtual ~CloudServerMock() = default;
64 static constexpr uint64_t REMAINSPACE = 1000;
65 static constexpr uint64_t TATALSPACE = 2000;
66 };
67
GetServerInfo(int32_t userId)68 CloudInfo CloudServerMock::GetServerInfo(int32_t userId)
69 {
70 CloudInfo cloudInfo;
71 cloudInfo.user = userId;
72 cloudInfo.id = "test_cloud_id";
73 cloudInfo.remainSpace = REMAINSPACE;
74 cloudInfo.totalSpace = TATALSPACE;
75 cloudInfo.enableCloud = true;
76
77 CloudInfo::AppInfo appInfo;
78 appInfo.bundleName = TEST_CLOUD_BUNDLE;
79 appInfo.appId = TEST_CLOUD_APPID;
80 appInfo.version = 1;
81 appInfo.cloudSwitch = true;
82
83 cloudInfo.apps[TEST_CLOUD_BUNDLE] = std::move(appInfo);
84 return cloudInfo;
85 }
86
GetAppSchema(int32_t userId,const std::string & bundleName)87 SchemaMeta CloudServerMock::GetAppSchema(int32_t userId, const std::string &bundleName)
88 {
89 return CloudDataTest::schemaMeta_;
90 }
91
92 std::shared_ptr<DBStoreMock> CloudDataTest::dbStoreMock_ = std::make_shared<DBStoreMock>();
93 SchemaMeta CloudDataTest::schemaMeta_;
94
InitMetaData()95 void CloudDataTest::InitMetaData()
96 {
97 metaData_.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
98 metaData_.appId = TEST_DISTRIBUTEDDATA_BUNDLE;
99 metaData_.bundleName = TEST_DISTRIBUTEDDATA_BUNDLE;
100 metaData_.tokenId = OHOS::IPCSkeleton::GetCallingTokenID();
101 metaData_.user = std::to_string(DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(metaData_.tokenId));
102 metaData_.area = OHOS::DistributedKv::EL1;
103 metaData_.instanceId = 0;
104 metaData_.isAutoSync = true;
105 metaData_.storeType = 1;
106 metaData_.storeId = TEST_DISTRIBUTEDDATA_STORE;
107 PolicyValue value;
108 value.type = OHOS::DistributedKv::PolicyType::IMMEDIATE_SYNC_ON_ONLINE;
109 }
110
InitSchemaMeta()111 void CloudDataTest::InitSchemaMeta()
112 {
113 SchemaMeta::Field field1;
114 field1.colName = "test_cloud_field_name1";
115 field1.alias = "test_cloud_field_alias1";
116 SchemaMeta::Field field2;
117 field2.colName = "test_cloud_field_name2";
118 field2.alias = "test_cloud_field_alias2";
119
120 SchemaMeta::Table table;
121 table.name = "test_cloud_table_name";
122 table.alias = "test_cloud_table_alias";
123 table.fields.emplace_back(field1);
124 table.fields.emplace_back(field2);
125
126 SchemaMeta::Database database;
127 database.name = TEST_CLOUD_STORE;
128 database.alias = "test_cloud_database_alias";
129 database.tables.emplace_back(table);
130
131 schemaMeta_.version = 1;
132 schemaMeta_.bundleName = TEST_DISTRIBUTEDDATA_BUNDLE;
133 schemaMeta_.databases.emplace_back(database);
134 }
135
SetUpTestCase(void)136 void CloudDataTest::SetUpTestCase(void)
137 {
138 MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, [](const auto &, auto) {
139 DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK);
140 });
141
142 auto cloudServerMock = new CloudServerMock();
143 CloudServer::RegisterCloudInstance(cloudServerMock);
144 FeatureSystem::GetInstance().GetCreator("cloud")();
145 FeatureSystem::GetInstance().GetCreator("relational_store")();
146 }
147
TearDownTestCase()148 void CloudDataTest::TearDownTestCase() {}
149
SetUp()150 void CloudDataTest::SetUp()
151 {
152 InitMetaData();
153 InitSchemaMeta();
154
155 MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_);
156
157 StoreMetaData storeMetaData;
158 storeMetaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
159 storeMetaData.bundleName = TEST_CLOUD_BUNDLE;
160 storeMetaData.storeId = TEST_CLOUD_STORE;
161 storeMetaData.instanceId = 0;
162 storeMetaData.isAutoSync = true;
163 storeMetaData.storeType = DistributedRdb::RDB_DEVICE_COLLABORATION;
164 storeMetaData.area = OHOS::DistributedKv::EL1;
165 storeMetaData.tokenId = OHOS::IPCSkeleton::GetCallingTokenID();
166 storeMetaData.user =
167 std::to_string(DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(storeMetaData.tokenId));
168 MetaDataManager::GetInstance().SaveMeta(storeMetaData.GetKey(), storeMetaData);
169 }
170
TearDown()171 void CloudDataTest::TearDown() {}
172
173 /**
174 * @tc.name: GetSchema
175 * @tc.desc: GetSchema from cloud when no schema in meta.
176 * @tc.type: FUNC
177 * @tc.require:
178 * @tc.author: ht
179 */
180 HWTEST_F(CloudDataTest, GetSchema, TestSize.Level0)
181 {
182 ZLOGI("CloudDataTest start");
183 auto cloudServerMock = std::make_shared<CloudServerMock>();
184 auto cloudInfo = cloudServerMock->GetServerInfo(
185 DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(OHOS::IPCSkeleton::GetCallingTokenID()));
186 ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), true));
187 SchemaMeta schemaMeta;
188 ASSERT_FALSE(
189 MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta, true));
190 CloudEvent::StoreInfo storeInfo { OHOS::IPCSkeleton::GetCallingTokenID(), TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE, 0 };
191 auto event = std::make_unique<CloudEvent>(CloudEvent::GET_SCHEMA, std::move(storeInfo));
192 EventCenter::GetInstance().PostEvent(move(event));
193 ASSERT_TRUE(
194 MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta, true));
195 ASSERT_EQ(to_string(schemaMeta.Marshall()), to_string(schemaMeta_.Marshall()));
196 }
197 } // namespace DistributedDataTest
198 } // namespace OHOS::Test
199