• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }