1 /*
2 * Copyright (C) 2025 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 "datashare_stub.h"
17
18 #include <gtest/gtest.h>
19
20 #include "accesstoken_kit.h"
21 #include "data_ability_observer_stub.h"
22 #include "datashare_business_error.h"
23 #include "datashare_errno.h"
24 #include "datashare_itypes_utils.h"
25 #include "datashare_log.h"
26 #include "datashare_operation_statement.h"
27 #include "datashare_stub_impl.h"
28 #include "extension_manager_proxy.h"
29 #include "idatashare.h"
30 #include "ipc_skeleton.h"
31 #include "ipc_types.h"
32 #include "ishared_result_set.h"
33
34
35 namespace OHOS {
36 namespace DataShare {
37 using namespace testing::ext;
38 using namespace DistributedShare::DataShare;
39 using namespace OHOS::AAFwk;
40 using ChangeInfo = AAFwk::ChangeInfo;
41 class DataShareStubTest : public testing::Test {
42 public:
43 static void SetUpTestCase(void);
44 static void TearDownTestCase(void);
45 void SetUp();
46 void TearDown();
47 };
48
49
50 class IDataAbilityObserverTest : public DataAbilityObserverStub {
51 public:
IDataAbilityObserverTest()52 IDataAbilityObserverTest() {}
~IDataAbilityObserverTest()53 ~IDataAbilityObserverTest()
54 {}
55
OnChange()56 void OnChange()
57 {
58 GTEST_LOG_(INFO) << "OnChange enter";
59 }
60 };
61
62 class TestDataShareStub : public DataShareStub {
63 public:
TestDataShareStub()64 TestDataShareStub() {}
~TestDataShareStub()65 ~TestDataShareStub() {}
OpenFile(const Uri & uri,const std::string & mode)66 int OpenFile(const Uri &uri, const std::string &mode)
67 {
68 return 0;
69 }
OpenRawFile(const Uri & uri,const std::string & mode)70 int OpenRawFile(const Uri &uri, const std::string &mode)
71 {
72 return 0;
73 }
Insert(const Uri & uri,const DataShareValuesBucket & value)74 int Insert(const Uri &uri, const DataShareValuesBucket &value)
75 {
76 return 0;
77 }
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)78 int Update(const Uri &uri, const DataSharePredicates &predicates, const DataShareValuesBucket &value)
79 {
80 return 0;
81 }
Delete(const Uri & uri,const DataSharePredicates & predicates)82 int Delete(const Uri &uri, const DataSharePredicates &predicates)
83 {
84 return 0;
85 }
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError & businessError)86 std::shared_ptr<DataShareResultSet> Query(const Uri &uri, const DataSharePredicates &predicates,
87 std::vector<std::string> &columns, DatashareBusinessError &businessError)
88 {
89 return nullptr;
90 }
GetType(const Uri & uri)91 std::string GetType(const Uri &uri)
92 {
93 return "";
94 }
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)95 int BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
96 {
97 return 0;
98 }
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)99 bool RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
100 {
101 return true;
102 }
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)103 bool UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
104 {
105 return true;
106 }
NotifyChange(const Uri & uri)107 bool NotifyChange(const Uri &uri)
108 {
109 return true;
110 }
NormalizeUri(const Uri & uri)111 Uri NormalizeUri(const Uri &uri)
112 {
113 return uri;
114 }
DenormalizeUri(const Uri & uri)115 Uri DenormalizeUri(const Uri &uri)
116 {
117 return uri;
118 }
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)119 std::vector<std::string> GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
120 {
121 return {};
122 }
123 };
124
125 std::string DATA_SHARE_URI = "datashare:///com.acts.datasharetest";
126 std::shared_ptr<DataShareStub> dataShareStub = std::make_shared<TestDataShareStub>();
127 std::u16string InterfaceToken = u"OHOS.DataShare.IDataShare";
128
SetUpTestCase(void)129 void DataShareStubTest::SetUpTestCase(void) {}
TearDownTestCase(void)130 void DataShareStubTest::TearDownTestCase(void) {}
SetUp(void)131 void DataShareStubTest::SetUp(void) {}
TearDown(void)132 void DataShareStubTest::TearDown(void) {}
133
134 /**
135 * @tc.name: DataShareStub_CmdRegisterObserverExtProvider_Test_001
136 * @tc.desc: Verify functionality of CMD_REGISTER_OBSERVEREXT_PROVIDER command handling
137 * @tc.type: FUNC
138 * @tc.precon: None
139 * @tc.step:
140 1. Create test URI and IDataAbilityObserverTest instance
141 2. Prepare message parcel with interface token and parameters
142 3. Call OnRemoteRequest with REGISTER_OBSERVEREXT_PROVIDER command
143 4. Check returned error code and unmarshal result
144 * @tc.expect:
145 1. All objects are successfully initialized
146 2. OnRemoteRequest returns 0 (success)
147 3. Unmarshaled result code is 0 (E_OK)
148 */
149 HWTEST_F(DataShareStubTest, DataShareStub_CmdRegisterObserverExtProvider_Test_001, TestSize.Level0)
150 {
151 LOG_INFO("DataShareStub_CmdRegisterObserverExtProvider_Test_001::Start");
152
153 Uri uri(DATA_SHARE_URI);
154 sptr<IDataAbilityObserverTest> dataObserver = new (std::nothrow) IDataAbilityObserverTest();
155 ASSERT_NE(dataObserver, nullptr);
156 uint32_t code = static_cast<uint32_t>(IDataShareInterfaceCode::CMD_REGISTER_OBSERVEREXT_PROVIDER);
157
158 MessageParcel data;
159 data.WriteInterfaceToken(InterfaceToken);
160 RegisterOption registerOption;
161 bool ret = ITypesUtil::Marshal(data, uri, dataObserver->AsObject(), true, registerOption);
162 EXPECT_TRUE(ret);
163
164 MessageParcel reply;
165 MessageOption option;
166 ASSERT_NE(dataShareStub, nullptr);
167 int errCode = dataShareStub->OnRemoteRequest(code, data, reply, option);
168 EXPECT_EQ(errCode, 0);
169 ret = ITypesUtil::Unmarshal(reply, errCode);
170 EXPECT_TRUE(ret);
171 // return default errCode 0(E_OK)
172 EXPECT_EQ(errCode, 0);
173
174 LOG_INFO("DataShareStub_CmdRegisterObserverExtProvider_Test_001::End");
175 }
176
177 /**
178 * @tc.name: DataShareStub_CmdUnregisterObserverExtProvider_Test_001
179 * @tc.desc: Verify functionality of CMD_UNREGISTER_OBSERVEREXT_PROVIDER command handling
180 * @tc.type: FUNC
181 * @tc.precon: None
182 * @tc.step:
183 1. Create test URI and IDataAbilityObserverTest instance
184 2. Prepare message parcel with interface token and parameters
185 3. Call OnRemoteRequest with UNREGISTER_OBSERVEREXT_PROVIDER command
186 4. Check returned error code and unmarshal result
187 * @tc.expect:
188 1. All objects are successfully initialized
189 2. OnRemoteRequest returns 0 (success)
190 3. Unmarshaled result code is 0 (E_OK)
191 */
192 HWTEST_F(DataShareStubTest, DataShareStub_CmdUnregisterObserverExtProvider_Test_001, TestSize.Level0)
193 {
194 LOG_INFO("DataShareStub_CmdUnregisterObserverExtProvider_Test_001::Start");
195
196 Uri uri(DATA_SHARE_URI);
197 sptr<IDataAbilityObserverTest> dataObserver = new (std::nothrow) IDataAbilityObserverTest();
198 ASSERT_NE(dataObserver, nullptr);
199 uint32_t code = static_cast<uint32_t>(IDataShareInterfaceCode::CMD_UNREGISTER_OBSERVEREXT_PROVIDER);
200
201 MessageParcel data;
202 data.WriteInterfaceToken(InterfaceToken);
203 bool ret = ITypesUtil::Marshal(data, uri, dataObserver->AsObject());
204 EXPECT_TRUE(ret);
205
206 MessageParcel reply;
207 MessageOption option;
208 int errCode = dataShareStub->OnRemoteRequest(code, data, reply, option);
209 EXPECT_EQ(errCode, 0);
210 ret = ITypesUtil::Unmarshal(reply, errCode);
211 EXPECT_TRUE(ret);
212 // return default errCode 0(E_OK)
213 EXPECT_EQ(errCode, 0);
214
215 LOG_INFO("DataShareStub_CmdUnregisterObserverExtProvider_Test_001::End");
216 }
217
218 /**
219 * @tc.name: DataShareStub_CmdNotifyChangeExtProvider_Test_001
220 * @tc.desc: Verify functionality of CMD_NOTIFY_CHANGEEXT_PROVIDER command handling
221 * @tc.type: FUNC
222 * @tc.precon: None
223 * @tc.step:
224 1. Create test URI and ChangeInfo object
225 2. Prepare message parcel with interface token and marshaled ChangeInfo
226 3. Call OnRemoteRequest with NOTIFY_CHANGEEXT_PROVIDER command
227 4. Check returned error code and unmarshal result
228 * @tc.expect:
229 1. All objects are successfully initialized
230 2. OnRemoteRequest returns 0 (success)
231 3. Unmarshaled result code is 0 (E_OK)
232 */
233 HWTEST_F(DataShareStubTest, DataShareStub_CmdNotifyChangeExtProvider_Test_001, TestSize.Level0)
234 {
235 LOG_INFO("DataShareStub_CmdNotifyChangeExtProvider_Test_001::Start");
236
237 Uri uri(DATA_SHARE_URI);
238 ChangeInfo changeInfo = { ChangeInfo::ChangeType::INSERT, { uri } };
239 uint32_t code = static_cast<uint32_t>(IDataShareInterfaceCode::CMD_NOTIFY_CHANGEEXT_PROVIDER);
240
241 MessageParcel data;
242 data.WriteInterfaceToken(InterfaceToken);
243 bool ret = ChangeInfo::Marshalling(changeInfo, data);
244 EXPECT_TRUE(ret);
245
246 MessageParcel reply;
247 MessageOption option;
248 int errCode = dataShareStub->OnRemoteRequest(code, data, reply, option);
249 EXPECT_EQ(errCode, 0);
250 ret = ITypesUtil::Unmarshal(reply, errCode);
251 EXPECT_TRUE(ret);
252 // return default errCode 0(E_OK)
253 EXPECT_EQ(errCode, 0);
254
255 LOG_INFO("DataShareStub_CmdNotifyChangeExtProvider_Test_001::End");
256 }
257 }
258 }