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);
139 MetaDataManager::GetInstance().SetSyncer([](const auto &, auto) {
140 DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK);
141 });
142
143 auto cloudServerMock = new CloudServerMock();
144 CloudServer::RegisterCloudInstance(cloudServerMock);
145 FeatureSystem::GetInstance().GetCreator("cloud")();
146 FeatureSystem::GetInstance().GetCreator("relational_store")();
147 }
148
TearDownTestCase()149 void CloudDataTest::TearDownTestCase() {}
150
SetUp()151 void CloudDataTest::SetUp()
152 {
153 InitMetaData();
154 InitSchemaMeta();
155
156 MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_);
157
158 StoreMetaData storeMetaData;
159 storeMetaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
160 storeMetaData.bundleName = TEST_CLOUD_BUNDLE;
161 storeMetaData.storeId = TEST_CLOUD_STORE;
162 storeMetaData.instanceId = 0;
163 storeMetaData.isAutoSync = true;
164 storeMetaData.storeType = DistributedRdb::RDB_DEVICE_COLLABORATION;
165 storeMetaData.area = OHOS::DistributedKv::EL1;
166 storeMetaData.tokenId = OHOS::IPCSkeleton::GetCallingTokenID();
167 auto user = DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(storeMetaData.tokenId);
168 storeMetaData.user = std::to_string(user);
169 MetaDataManager::GetInstance().SaveMeta(storeMetaData.GetKey(), storeMetaData);
170 }
171
TearDown()172 void CloudDataTest::TearDown() {}
173
174 /**
175 * @tc.name: GetSchema
176 * @tc.desc: GetSchema from cloud when no schema in meta.
177 * @tc.type: FUNC
178 * @tc.require:
179 * @tc.author: ht
180 */
181 HWTEST_F(CloudDataTest, GetSchema, TestSize.Level0)
182 {
183 ZLOGI("CloudDataTest start");
184 auto cloudServerMock = std::make_shared<CloudServerMock>();
185 auto user = DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(OHOS::IPCSkeleton::GetCallingTokenID());
186 auto cloudInfo = cloudServerMock->GetServerInfo(user);
187 ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), true));
188 SchemaMeta schemaMeta;
189 ASSERT_FALSE(
190 MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta, true));
191 CloudEvent::StoreInfo storeInfo { OHOS::IPCSkeleton::GetCallingTokenID(), TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE, 0 };
192 auto event = std::make_unique<CloudEvent>(CloudEvent::GET_SCHEMA, storeInfo);
193 EventCenter::GetInstance().PostEvent(std::move(event));
194 ASSERT_FALSE(
195 MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta, true));
196 }
197 } // namespace DistributedDataTest
198 } // namespace OHOS::Test
199