1 /*
2 * Copyright (C) 2023 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 #define private public
17 #define protected public
18
19 #include "cdma_sms_message.h"
20 #include "cdma_sms_transport_message.h"
21 #include "core_service_client.h"
22 #include "gtest/gtest.h"
23 #include "i_sms_service_interface.h"
24 #include "if_system_ability_manager.h"
25 #include "iservice_registry.h"
26 #include "radio_event.h"
27 #include "sms_mms_gtest.h"
28 #include "sms_mms_test_helper.h"
29 #include "sms_service.h"
30 #include "sms_service_manager_client.h"
31 #include "string_utils.h"
32 #include "telephony_log_wrapper.h"
33
34 namespace OHOS {
35 namespace Telephony {
36 namespace {
37 sptr<ISmsServiceInterface> g_telephonyService = nullptr;
38 } // namespace
39 using namespace testing::ext;
40
41 class CdmaSmsGtest : public testing::Test {
42 public:
43 static void SetUpTestCase();
44 static void TearDownTestCase();
45 void SetUp();
46 void TearDown();
47 static sptr<ISmsServiceInterface> GetProxy();
HasSimCard(int32_t slotId)48 static bool HasSimCard(int32_t slotId)
49 {
50 bool hasSimCard = false;
51 if (CoreServiceClient::GetInstance().GetProxy() == nullptr) {
52 return hasSimCard;
53 }
54 CoreServiceClient::GetInstance().HasSimCard(slotId, hasSimCard);
55 return hasSimCard;
56 }
57 };
58
TearDownTestCase()59 void CdmaSmsGtest::TearDownTestCase() {}
60
SetUp()61 void CdmaSmsGtest::SetUp() {}
62
TearDown()63 void CdmaSmsGtest::TearDown() {}
64
65 const int32_t DEFAULT_SIM_SLOT_ID_1 = 1;
66 const uint8_t HEX_CHAR_LEN = 2;
67 const uint8_t UNICODE_CHAR_LEN = 2;
68 const uint8_t VALUE_INDEX = 2;
69
SetUpTestCase()70 void CdmaSmsGtest::SetUpTestCase()
71 {
72 TELEPHONY_LOGI("SetUpTestCase slotId%{public}d", DEFAULT_SIM_SLOT_ID_1);
73 g_telephonyService = GetProxy();
74 if (g_telephonyService == nullptr) {
75 return;
76 }
77 DelayedSingleton<SmsServiceManagerClient>::GetInstance()->ResetSmsServiceProxy();
78 DelayedSingleton<SmsServiceManagerClient>::GetInstance()->InitSmsServiceProxy();
79 }
80
GetProxy()81 sptr<ISmsServiceInterface> CdmaSmsGtest::GetProxy()
82 {
83 auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
84 if (systemAbilityMgr == nullptr) {
85 return nullptr;
86 }
87 sptr<IRemoteObject> remote = systemAbilityMgr->CheckSystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID);
88 if (remote) {
89 sptr<ISmsServiceInterface> smsService = iface_cast<ISmsServiceInterface>(remote);
90 return smsService;
91 }
92 return nullptr;
93 }
94
95 #ifndef TEL_TEST_UNSUPPORT
96 /**
97 * @tc.number Telephony_SmsMmsGtest_CdmaSmsMessage_0001
98 * @tc.name Test CdmaSmsMessage
99 * @tc.desc Function test
100 */
101 HWTEST_F(CdmaSmsGtest, CdmaSmsMessage_0001, Function | MediumTest | Level1)
102 {
103 TELEPHONY_LOGI("TelSMSMMSTest::CdmaSmsMessage_0001 -->");
104 CdmaSmsMessage cdmaSmsMessage;
105 std::string dest = "dest";
106 std::string sc = "sc";
107 std::string text = "text";
108 int32_t port = 10;
109 uint8_t *data;
110 uint32_t dataLen = 10;
111 std::string pdu = "01000B818176251308F4000007E8B0BCFD76E701";
112 bool bStatusReport = false;
113 DataCodingScheme codingScheme = DATA_CODING_7BIT;
114 cdmaSmsMessage.CreateSubmitTransMsg(dest, sc, text, bStatusReport, codingScheme);
115 cdmaSmsMessage.CreateSubmitTransMsg(dest, sc, port, data, dataLen, bStatusReport);
116 cdmaSmsMessage.GreateTransMsg();
117 cdmaSmsMessage.CovertEncodingType(codingScheme);
118 cdmaSmsMessage.CreateMessage(pdu);
119 cdmaSmsMessage.PduAnalysis(pdu);
120 CdmaP2PMsg p2pMsg;
121 cdmaSmsMessage.AnalysisP2pMsg(p2pMsg);
122 cdmaSmsMessage.AnalsisDeliverMwi(p2pMsg);
123 bool ret = cdmaSmsMessage.PduAnalysis("");
124 EXPECT_EQ(false, ret);
125 }
126
127 /**
128 * @tc.number Telephony_SmsMmsGtest_CdmaSmsReceiveHandler_0001
129 * @tc.name Test CdmaSmsReceiveHandler
130 * @tc.desc Function test
131 */
132 HWTEST_F(CdmaSmsGtest, CdmaSmsReceiveHandler_0001, Function | MediumTest | Level1)
133 {
134 TELEPHONY_LOGI("TelSMSMMSTest::CdmaSmsReceiveHandler_0001 -->");
135 int32_t retInt;
136 std::shared_ptr<SmsBaseMessage> retPtr;
137 std::string pdu = "01000B818176251308F4000007E8B0BCFD76E701";
138 std::shared_ptr<AppExecFwk::EventRunner> cdmaSmsReceiveRunner;
139 cdmaSmsReceiveRunner = AppExecFwk::EventRunner::Create("cdmaSmsReceiveHandler");
140 ASSERT_TRUE(cdmaSmsReceiveRunner != nullptr);
141 CdmaSmsReceiveHandler cdmaSmsReceiveHandler(cdmaSmsReceiveRunner, DEFAULT_SIM_SLOT_ID);
142 const std::shared_ptr<CdmaSmsMessage> smsCdmaMessage = CdmaSmsMessage::CreateMessage(pdu);
143 retInt = cdmaSmsReceiveHandler.HandleSmsByType(nullptr);
144 EXPECT_EQ(AckIncomeCause::SMS_ACK_UNKNOWN_ERROR, retInt);
145 }
146
147 /**
148 * @tc.number Telephony_CdmaSmsGtest_SmsPduBuffer_0001
149 * @tc.name Test SmsPduBuffer
150 * @tc.desc Function test
151 */
152 HWTEST_F(CdmaSmsGtest, SmsPduBuffer_0001, Function | MediumTest | Level1)
153 {
154 auto buffer = std::make_shared<SmsPduBuffer>();
155 EXPECT_TRUE(buffer->IsEmpty());
156 EXPECT_EQ(buffer->GetIndex(), 0);
157 EXPECT_FALSE(buffer->SetIndex(1));
158 EXPECT_EQ(buffer->MoveForward(), 0);
159 EXPECT_EQ(buffer->SkipBits(), 0);
160
161 std::string pduHex = "00000210020000021002";
162 std::string pdu = StringUtils::HexToString(pduHex);
163 auto rBuffer = std::make_shared<SmsReadBuffer>(pdu);
164 EXPECT_FALSE(rBuffer->IsEmpty());
165 rBuffer->SetIndex(0);
166 uint8_t v = 0;
167 uint16_t v2 = 0;
168 EXPECT_TRUE(rBuffer->ReadByte(v));
169 EXPECT_TRUE(rBuffer->ReadWord(v2));
170 EXPECT_TRUE(rBuffer->ReadBits(v));
171
172 auto wBuffer = std::make_shared<SmsWriteBuffer>();
173 EXPECT_FALSE(wBuffer->IsEmpty());
174 wBuffer->SetIndex(0);
175 v = 1;
176 v2 = 0x1234;
177 EXPECT_TRUE(wBuffer->WriteByte(v));
178 EXPECT_TRUE(wBuffer->WriteWord(v2));
179 EXPECT_TRUE(wBuffer->InsertByte(v, 1));
180 EXPECT_TRUE(wBuffer->WriteBits(v));
181 }
182
183 /**
184 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsTransportMessage_0001
185 * @tc.name Test CdmaSmsTransportMessage
186 * @tc.desc Function test
187 */
188 HWTEST_F(CdmaSmsGtest, CdmaSmsTransportMessage_0001, Function | MediumTest | Level1)
189 {
190 TELEPHONY_LOGI("TelSMSMMSTest::CdmaSmsTransportMessage_0001 -->");
191 CdmaSmsMessage cdmaSmsMessage;
192 std::string dest = "dest";
193 std::string sc = "sc";
194 std::string text = "text";
195 bool bStatusReport = false;
196 DataCodingScheme codingScheme = DATA_CODING_7BIT;
197 std::unique_ptr<CdmaTransportMsg> transMsg =
198 cdmaSmsMessage.CreateSubmitTransMsg(dest, sc, text, bStatusReport, codingScheme);
199
200 std::unique_ptr<CdmaSmsTransportMessage> transportMessage =
201 CdmaSmsTransportMessage::CreateTransportMessage(*transMsg.get());
202 SmsWriteBuffer pduBuffer;
203 EXPECT_NE(transportMessage, nullptr);
204 EXPECT_NE(transportMessage->IsEmpty(), true);
205 EXPECT_EQ(transportMessage->Encode(pduBuffer), true);
206 std::unique_ptr<std::vector<uint8_t>> pdu = pduBuffer.GetPduBuffer();
207 EXPECT_NE(pdu, nullptr);
208 EXPECT_GT(pdu->size(), static_cast<uint32_t>(0));
209 }
210
211 /**
212 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsTransportMessage_0002
213 * @tc.name Test CdmaSmsTransportMessage
214 * @tc.desc Function test
215 */
216 HWTEST_F(CdmaSmsGtest, CdmaSmsTransportMessage_0002, Function | MediumTest | Level1)
217 {
218 TELEPHONY_LOGI("TelSMSMMSTest::CdmaSmsTransportMessage_0002 -->");
219 std::string pduHex = "0000021002040702C48D159E268406010408260003200640011910D61C58F265CD9F469D5AF66DDDBF871E5CFA75E"
220 "DDFC79F400801000A0140";
221 std::string pdu = StringUtils::HexToString(pduHex);
222 SmsReadBuffer pduBuffer(pdu);
223 CdmaTransportMsg msg;
224 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
225 std::unique_ptr<CdmaSmsTransportMessage> transportMessage =
226 CdmaSmsTransportMessage::CreateTransportMessage(msg, pduBuffer);
227 EXPECT_NE(transportMessage, nullptr);
228 EXPECT_NE(transportMessage->IsEmpty(), true);
229 EXPECT_EQ(transportMessage->Decode(pduBuffer), true);
230 }
231
232 /**
233 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsTransportMessage_0003
234 * @tc.name Test CdmaSmsTransportMessage
235 * @tc.desc Function test
236 */
237 HWTEST_F(CdmaSmsGtest, CdmaSmsTransportMessage_0003, Function | MediumTest | Level1)
238 {
239 // BROADCAST DELIVER CMASDATA
240 uint8_t CMAS_TEST_BEARER_DATA[] = { 0x00, 0x03, 0x1C, 0x78, 0x00, 0x01, 0x59, 0x02, 0xB8, 0x00, 0x02, 0x10, 0xAA,
241 0x68, 0xD3, 0xCD, 0x06, 0x9E, 0x68, 0x30, 0xA0, 0xE9, 0x97, 0x9F, 0x44, 0x1B, 0xF3, 0x20, 0xE9, 0xA3, 0x2A,
242 0x08, 0x7B, 0xF6, 0xED, 0xCB, 0xCB, 0x1E, 0x9C, 0x3B, 0x10, 0x4D, 0xDF, 0x8B, 0x4E, 0xCC, 0xA8, 0x20, 0xEC,
243 0xCB, 0xCB, 0xA2, 0x0A, 0x7E, 0x79, 0xF4, 0xCB, 0xB5, 0x72, 0x0A, 0x9A, 0x34, 0xF3, 0x41, 0xA7, 0x9A, 0x0D,
244 0xFB, 0xB6, 0x79, 0x41, 0x85, 0x07, 0x4C, 0xBC, 0xFA, 0x2E, 0x00, 0x08, 0x20, 0x58, 0x38, 0x88, 0x80, 0x10,
245 0x54, 0x06, 0x38, 0x20, 0x60, 0x30, 0xA8, 0x81, 0x90, 0x20, 0x08 };
246
247 std::stringstream ss;
248 ss.clear();
249 ss << static_cast<uint8_t>(CdmaTransportMsgType::BROADCAST);
250 ss << static_cast<uint8_t>(CdmaSmsParameterRecord::SERVICE_CATEGORY);
251 ss << static_cast<uint8_t>(0x02);
252 ss << static_cast<uint8_t>(static_cast<uint16_t>(SmsServiceCtg::CMAS_TEST) >> 8);
253 ss << static_cast<uint8_t>(static_cast<uint16_t>(SmsServiceCtg::CMAS_TEST) & 0xff);
254 ss << static_cast<uint8_t>(CdmaSmsParameterRecord::BEARER_DATA);
255 ss << static_cast<uint8_t>(sizeof(CMAS_TEST_BEARER_DATA));
256 for (uint8_t i = 0; i < sizeof(CMAS_TEST_BEARER_DATA); i++) {
257 ss << CMAS_TEST_BEARER_DATA[i];
258 }
259 SmsReadBuffer rBuffer(ss.str());
260 CdmaTransportMsg msg;
261 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
262 std::unique_ptr<CdmaSmsTransportMessage> message = CdmaSmsTransportMessage::CreateTransportMessage(msg, rBuffer);
263 EXPECT_TRUE(message->Decode(rBuffer));
264 EXPECT_EQ(msg.data.broadcast.telesvcMsg.data.deliver.msgId.msgId, 0xc780);
265 EXPECT_EQ(msg.data.broadcast.serviceCtg, static_cast<uint16_t>(SmsServiceCtg::CMAS_TEST));
266 EXPECT_EQ(msg.data.broadcast.telesvcMsg.data.deliver.cmasData.dataLen, 74);
267 EXPECT_EQ(msg.data.broadcast.telesvcMsg.data.deliver.cmasData.urgency, SmsCmaeUrgency::EXPECTED);
268 }
269
270 /**
271 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsTransportMessage_0004
272 * @tc.name Test CdmaSmsTransportMessage
273 * @tc.desc Function test
274 */
275 HWTEST_F(CdmaSmsGtest, CdmaSmsTransportMessage_0004, Function | MediumTest | Level1)
276 {
277 // BROADCAST DELIVER USERDATA(BCCBB)
278 std::string pduHex = "0101020004081300031008d00106102c2870e1420801c00c01c0";
279 std::string pdu = StringUtils::HexToString(pduHex);
280 SmsReadBuffer pduBuffer(pdu);
281 CdmaTransportMsg msg;
282 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
283 std::unique_ptr<CdmaSmsTransportMessage> transportMessage =
284 CdmaSmsTransportMessage::CreateTransportMessage(msg, pduBuffer);
285 EXPECT_NE(transportMessage, nullptr);
286 EXPECT_FALSE(transportMessage->IsEmpty());
287 EXPECT_TRUE(transportMessage->Decode(pduBuffer));
288 }
289
GetUserDataString(SmsTeleSvcUserData userData)290 string GetUserDataString(SmsTeleSvcUserData userData)
291 {
292 std::stringstream ssUserData;
293 if (userData.encodeType == SmsEncodingType::UNICODE) {
294 char unicodeChar[UNICODE_CHAR_LEN + 1];
295 unicodeChar[UNICODE_CHAR_LEN] = '\0';
296 for (uint8_t i = 0; i < userData.userData.length; i += UNICODE_CHAR_LEN) {
297 ssUserData << "\\u";
298 snprintf_s(unicodeChar, sizeof(unicodeChar), sizeof(unicodeChar) - 1, "%02x",
299 static_cast<uint8_t>(userData.userData.data[i]));
300 ssUserData << unicodeChar;
301 snprintf_s(unicodeChar, sizeof(unicodeChar), sizeof(unicodeChar) - 1, "%02x",
302 static_cast<uint8_t>(userData.userData.data[i + 1]));
303 ssUserData << unicodeChar;
304 }
305 } else {
306 for (uint8_t i = 0; i < userData.userData.length; i++) {
307 ssUserData << static_cast<uint8_t>(userData.userData.data[i]);
308 }
309 }
310 return ssUserData.str();
311 }
312
CheckDeliverUserData(string pdu,string userData)313 void CheckDeliverUserData(string pdu, string userData)
314 {
315 std::stringstream ss;
316 ss << static_cast<uint8_t>(CdmaSmsParameterRecord::BEARER_DATA);
317 ss << static_cast<uint8_t>(pdu.size() / HEX_CHAR_LEN);
318 ss << StringUtils::HexToString(pdu);
319
320 CdmaTeleserviceMsg v;
321 memset_s(&v, sizeof(CdmaTeleserviceMsg), 0x00, sizeof(CdmaTeleserviceMsg));
322 SmsReadBuffer rBuffer(ss.str());
323 rBuffer.SetIndex(VALUE_INDEX);
324 auto message = std::make_shared<CdmaSmsBearerData>(v, rBuffer);
325 rBuffer.SetIndex(0);
326 EXPECT_TRUE(message->Decode(rBuffer));
327 EXPECT_STREQ(GetUserDataString(v.data.deliver.userData).c_str(), userData.c_str());
328 }
329
CheckSubmitUserData(string pdu,string userData)330 void CheckSubmitUserData(string pdu, string userData)
331 {
332 std::stringstream ss;
333 ss << static_cast<uint8_t>(CdmaSmsParameterRecord::BEARER_DATA);
334 ss << static_cast<uint8_t>(pdu.size() / HEX_CHAR_LEN);
335 ss << StringUtils::HexToString(pdu);
336
337 CdmaTeleserviceMsg v;
338 memset_s(&v, sizeof(CdmaTeleserviceMsg), 0x00, sizeof(CdmaTeleserviceMsg));
339 SmsReadBuffer rBuffer(ss.str());
340 rBuffer.SetIndex(VALUE_INDEX);
341 auto message = std::make_shared<CdmaSmsBearerData>(v, rBuffer);
342 rBuffer.SetIndex(0);
343 EXPECT_TRUE(message->Decode(rBuffer));
344 EXPECT_STREQ(GetUserDataString(v.data.submit.userData).c_str(), userData.c_str());
345
346 auto message1 = std::make_shared<CdmaSmsBearerData>(v);
347 SmsWriteBuffer wBuffer;
348 EXPECT_TRUE(message1->Encode(wBuffer));
349 auto buffer = wBuffer.GetPduBuffer();
350 EXPECT_GT(buffer->size(), 0);
351 std::stringstream ssEncode;
352 for (uint16_t i = 0; i < buffer->size(); i++) {
353 ssEncode << (*buffer)[i];
354 }
355
356 CdmaTeleserviceMsg v2;
357 memset_s(&v2, sizeof(CdmaTeleserviceMsg), 0x00, sizeof(CdmaTeleserviceMsg));
358 SmsReadBuffer rBuffer2(ssEncode.str());
359 rBuffer2.SetIndex(VALUE_INDEX);
360 auto message2 = std::make_shared<CdmaSmsBearerData>(v2, rBuffer2);
361 rBuffer2.SetIndex(0);
362 EXPECT_TRUE(message2->Decode(rBuffer2));
363 EXPECT_STREQ(GetUserDataString(v2.data.submit.userData).c_str(), userData.c_str());
364 }
365
366 /**
367 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsBearerData_0001
368 * @tc.name Test CdmaSmsBearerData
369 * @tc.desc Function test
370 */
371 HWTEST_F(CdmaSmsGtest, CdmaSmsBearerData_0001, Function | MediumTest | Level1)
372 {
373 // gsm 7bit
374 CheckDeliverUserData("00031040900112488ea794e074d69e1b7392c270326cde9e98", "Test standard SMS");
375 // ascii 7bit
376 CheckDeliverUserData("0003100160010610262d5ab500", "bjjj");
377 // ia5
378 CheckDeliverUserData("00031002100109184539b4d052ebb3d0", "SMS Rulz");
379 // unicode
380 CheckDeliverUserData("000310021001062012716B2C380801000A0140", "\\u4e2d\\u6587");
381
382 // gsm 7bit
383 CheckSubmitUserData("00032006400112488ea794e074d69e1b7392c270326cde9e98", "Test standard SMS");
384 // ascii 7bit
385 CheckSubmitUserData("0003200640010610262d5ab500", "bjjj");
386 // ia5
387 CheckSubmitUserData("00032006400109184539b4d052ebb3d0", "SMS Rulz");
388 // unicode
389 CheckSubmitUserData("000320064001062012716B2C380801000A0140", "\\u4e2d\\u6587");
390 }
391
392 /**
393 * @tc.number Telephony_CdmaSmsGtest_CdmaSmsBearerData_0002
394 * @tc.name Test CdmaSmsBearerData
395 * @tc.desc Function test
396 */
397 HWTEST_F(CdmaSmsGtest, CdmaSmsBearerData_0002, Function | MediumTest | Level1)
398 {
399 std::string dataStr = "0003200010010410168d20020105030608120111015905019206069706180000000801c00901800a01e00b"
400 "01030c01c00d01070e05039acc13880f018011020566";
401 std::stringstream ss;
402 ss.clear();
403 ss << static_cast<uint8_t>(CdmaSmsParameterRecord::BEARER_DATA);
404 ss << static_cast<uint8_t>(dataStr.size() / HEX_CHAR_LEN);
405 ss << StringUtils::HexToString(dataStr);
406
407 CdmaTeleserviceMsg v;
408 memset_s(&v, sizeof(CdmaTeleserviceMsg), 0x00, sizeof(CdmaTeleserviceMsg));
409 SmsReadBuffer rBuffer(ss.str());
410 rBuffer.SetIndex(VALUE_INDEX);
411 auto message = std::make_shared<CdmaSmsBearerData>(v, rBuffer);
412 rBuffer.SetIndex(0);
413 EXPECT_TRUE(message->Decode(rBuffer));
414 EXPECT_EQ(v.type, TeleserviceMsgType::SUBMIT);
415 EXPECT_EQ(v.data.submit.msgId.msgId, 1);
416 EXPECT_EQ(v.data.submit.priority, SmsPriorityIndicator::EMERGENCY);
417 EXPECT_EQ(v.data.submit.privacy, SmsPrivacyIndicator::CONFIDENTIAL);
418 EXPECT_EQ(v.data.submit.callbackNumber.addrLen, 7);
419 char number[] = "3598271";
420 for (uint8_t i = 0; i < sizeof(number); i++) {
421 EXPECT_EQ(v.data.submit.callbackNumber.szData[i], number[i]);
422 }
423 EXPECT_EQ(v.data.submit.depositId, 1382);
424 EXPECT_EQ(v.data.submit.language, SmsLanguageType::HEBREW);
425 EXPECT_EQ(v.data.submit.alertPriority, SmsAlertPriority::HIGH);
426 EXPECT_EQ(v.data.submit.deferValPeriod.time.absTime.year, 97);
427 EXPECT_EQ(v.data.submit.deferValPeriod.time.absTime.month, 6);
428 EXPECT_EQ(v.data.submit.deferValPeriod.time.absTime.day, 18);
429 }
430 #endif // TEL_TEST_UNSUPPORT
431 } // namespace Telephony
432 } // namespace OHOS