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 <vector>
20
21#include "gsm_pdu_hex_value.h"
22#include "gsm_sms_common_utils.h"
23#include "gtest/gtest.h"
24#include "ims_sms_client.h"
25#include "sms_common_utils.h"
26#include "text_coder.h"
27
28namespace OHOS {
29namespace Telephony {
30using namespace testing::ext;
31
32namespace {
33const std::string TEXT_SMS_CONTENT = "hello world";
34const int BUF_SIZE = 2401;
35const int TEXT_LENGTH = 2;
36const int FILL_BITS = 2;
37const int DIGIT_LEN = 3;
38const int DIGIT_LEN2 = 6;
39const unsigned char SRC_TEXT = 2;
40} // namespace
41
42class BranchUtilsTest : public testing::Test {
43public:
44    static void SetUpTestCase();
45    static void TearDownTestCase();
46    void SetUp();
47    void TearDown();
48};
49void BranchUtilsTest::SetUpTestCase() {}
50
51void BranchUtilsTest::TearDownTestCase()
52{
53    DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
54}
55
56void BranchUtilsTest::SetUp() {}
57
58void BranchUtilsTest::TearDown() {}
59
60/**
61 * @tc.number   Telephony_SmsMmsGtest_TextCoder_0001
62 * @tc.name     Test TextCoder
63 * @tc.desc     Function test
64 */
65HWTEST_F(BranchUtilsTest, TextCoder_0001, Function | MediumTest | Level1)
66{
67    DataCodingScheme DataCodingScheme;
68    MsgLangInfo msgLangInfo;
69    unsigned char encodeData[BUF_SIZE];
70    MSG_LANGUAGE_ID_T langId = 0;
71    bool unknown = false;
72    unsigned short inText = 1;
73    const uint8_t *pMsgText = (const uint8_t *)TEXT_SMS_CONTENT.c_str();
74    uint8_t *pDestText = encodeData;
75    SmsCodingNationalType codingNational = SMS_CODING_NATIONAL_TYPE_DEFAULT;
76    EXPECT_GE(TextCoder::Instance().Utf8ToGsm7bit(pDestText, BUF_SIZE, const_cast<uint8_t *>(pMsgText), 0, langId), 0);
77    EXPECT_GE(TextCoder::Instance().CdmaUtf8ToAuto(pDestText, 1, pMsgText, 1, DataCodingScheme), -1);
78    EXPECT_GE(TextCoder::Instance().GsmUtf8ToAuto(pDestText, 1, pMsgText, 1,
79        DataCodingScheme, codingNational, langId), -1);
80    EXPECT_EQ(TextCoder::Instance().Utf8ToUcs2(pDestText, 1, pMsgText, -1), -1);
81    EXPECT_EQ(TextCoder::Instance().Utf8ToUcs2(pDestText, 0, pMsgText, -1), 0);
82    EXPECT_EQ(TextCoder::Instance().CdmaUtf8ToAuto(pDestText, 1, pMsgText, 0, DataCodingScheme), 0);
83    EXPECT_EQ(TextCoder::Instance().GsmUtf8ToAuto(pDestText, 1, pMsgText, 0,
84        DataCodingScheme, codingNational, langId), 0);
85    EXPECT_EQ(TextCoder::Instance().Gsm7bitToUtf8(pDestText, 0, pMsgText, 0, msgLangInfo), 0);
86    EXPECT_GE(TextCoder::Instance().ShiftjisToUtf8(pDestText, 1, pMsgText, -1), 0);
87    EXPECT_GE(TextCoder::Instance().Ucs2ToUtf8(pDestText, 1, pMsgText, -1), 0);
88    EXPECT_GE(TextCoder::Instance().EuckrToUtf8(pDestText, 1, pMsgText, -1), 0);
89    EXPECT_FALSE(TextCoder::Instance().Ucs2ToUtf8(pDestText, 0, pMsgText, 0));
90    EXPECT_FALSE(TextCoder::Instance().EuckrToUtf8(pDestText, 0, pMsgText, 1));
91    EXPECT_FALSE(TextCoder::Instance().ShiftjisToUtf8(pDestText, 0, pMsgText, 1));
92    EXPECT_EQ(TextCoder::Instance().Ucs2ToGsm7bit(pDestText, 0, pMsgText, 0, langId), -1);
93    EXPECT_GT(TextCoder::Instance().Ucs2ToGsm7bit(pDestText, 1, pMsgText, TEXT_LENGTH, langId), 0);
94    EXPECT_EQ(TextCoder::Instance().Ucs2ToGsm7bitAuto(pDestText, 0, pMsgText, 0, unknown, codingNational), -1);
95    EXPECT_GE(TextCoder::Instance().Ucs2ToGsm7bitAuto(pDestText, 1, pMsgText, 1, unknown, codingNational), 0);
96    EXPECT_EQ(TextCoder::Instance().Ucs2ToAscii(pDestText, 0, pMsgText, 0, unknown), -1);
97    EXPECT_GE(TextCoder::Instance().Ucs2ToAscii(pDestText, 1, pMsgText, 1, unknown), 0);
98    EXPECT_EQ(TextCoder::Instance().GetLangType(pMsgText, 0), MSG_DEFAULT_CHAR);
99    EXPECT_GE(TextCoder::Instance().GetLangType(pMsgText, 0), MSG_DEFAULT_CHAR);
100    EXPECT_EQ(TextCoder::Instance().FindGsm7bitExt(pDestText, 0, inText), 0);
101    EXPECT_GE(TextCoder::Instance().FindGsm7bitExt(pDestText, 1, inText), 0);
102    EXPECT_EQ(TextCoder::Instance().FindTurkish(pDestText, 0, inText), 0);
103    EXPECT_GE(TextCoder::Instance().FindTurkish(pDestText, 1, inText), 0);
104    EXPECT_EQ(TextCoder::Instance().FindSpanish(pDestText, 0, inText), 0);
105    EXPECT_GE(TextCoder::Instance().FindSpanish(pDestText, 1, inText), 0);
106    EXPECT_EQ(TextCoder::Instance().FindPortu(pDestText, 0, inText), 0);
107    EXPECT_GE(TextCoder::Instance().FindPortu(pDestText, 1, inText), 0);
108    EXPECT_GE(TextCoder::Instance().FindReplaceChar(inText), MSG_DEFAULT_CHAR);
109    auto extMap = TextCoder::Instance().Get7BitCodingExtMap(codingNational);
110    EXPECT_GE(extMap.size(), 0);
111}
112
113/**
114 * @tc.number   Telephony_SmsMmsGtest_TextCoder_0002
115 * @tc.name     Test TextCoder
116 * @tc.desc     Function test
117 */
118HWTEST_F(BranchUtilsTest, TextCoder_0002, Function | MediumTest | Level1)
119{
120    MsgLangInfo pLangInfo;
121    pLangInfo.bLockingShift = true;
122    pLangInfo.bSingleShift = true;
123    unsigned char encodeData[BUF_SIZE];
124    unsigned short result = 1;
125    const uint8_t *pMsgText = (const uint8_t *)TEXT_SMS_CONTENT.c_str();
126    uint8_t *pDestText = encodeData;
127    EXPECT_EQ(TextCoder::Instance().Gsm7bitToUcs2(pDestText, 0, pMsgText, 0, pLangInfo), -1);
128    pLangInfo.lockingLang = MSG_ID_TURKISH_LANG;
129    EXPECT_GE(TextCoder::Instance().Gsm7bitToUcs2(pDestText, 1, pMsgText, 1, pLangInfo), 0);
130    EXPECT_GT(TextCoder::Instance().EscapeToUcs2(SRC_TEXT, pLangInfo), 0);
131    pLangInfo.lockingLang = MSG_ID_PORTUGUESE_LANG;
132    EXPECT_GE(TextCoder::Instance().Gsm7bitToUcs2(pDestText, 1, pMsgText, 1, pLangInfo), 0);
133    EXPECT_GT(TextCoder::Instance().EscapeToUcs2(SRC_TEXT, pLangInfo), 0);
134    pLangInfo.bLockingShift = false;
135    EXPECT_GE(TextCoder::Instance().Gsm7bitToUcs2(pDestText, 1, pMsgText, 1, pLangInfo), 0);
136    EXPECT_EQ(TextCoder::Instance().EscapeTurkishLockingToUcs2(pMsgText, 0, pLangInfo, result), 0);
137    EXPECT_EQ(TextCoder::Instance().EscapeTurkishLockingToUcs2(pMsgText, 1, pLangInfo, result), 0);
138    EXPECT_EQ(TextCoder::Instance().EscapePortuLockingToUcs2(pMsgText, 0, pLangInfo, result), 0);
139    EXPECT_EQ(TextCoder::Instance().EscapePortuLockingToUcs2(pMsgText, 1, pLangInfo, result), 0);
140    EXPECT_EQ(TextCoder::Instance().EscapeGsm7bitToUcs2(pMsgText, 0, pLangInfo, result), 0);
141    EXPECT_EQ(TextCoder::Instance().EscapeGsm7bitToUcs2(pMsgText, 1, pLangInfo, result), 0);
142    pLangInfo.singleLang = MSG_ID_SPANISH_LANG;
143    EXPECT_GT(TextCoder::Instance().EscapeToUcs2(SRC_TEXT, pLangInfo), 0);
144    pLangInfo.singleLang = MSG_ID_RESERVED_LANG;
145    EXPECT_GT(TextCoder::Instance().EscapeToUcs2(SRC_TEXT, pLangInfo), 0);
146    pLangInfo.bSingleShift = false;
147    EXPECT_GT(TextCoder::Instance().EscapeToUcs2(SRC_TEXT, pLangInfo), 0);
148}
149
150/**
151 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0001
152 * @tc.name     Test SmsCommonUtils
153 * @tc.desc     Function test
154 */
155HWTEST_F(BranchUtilsTest, SmsCommonUtils_0001, Function | MediumTest | Level1)
156{
157    auto smsCommonUtils = std::make_shared<SmsCommonUtils>();
158    const unsigned char *userData = (const unsigned char *)TEXT_SMS_CONTENT.c_str();
159    const std::string str = "*#PPQQ";
160    const char *digit = (const char *)str.c_str();
161    unsigned char *packData = (unsigned char *)TEXT_SMS_CONTENT.c_str();
162    EXPECT_EQ(smsCommonUtils->Pack7bitChar(nullptr, 0, 0, nullptr, 0), 0);
163    EXPECT_EQ(smsCommonUtils->Unpack7bitChar(nullptr, 1, 1, nullptr, 1), 0);
164    EXPECT_EQ(smsCommonUtils->Pack7bitChar(userData, 1, 0, packData, 1), 1);
165    EXPECT_EQ(smsCommonUtils->Pack7bitChar(userData, 1, 1, packData, 1), 1);
166    EXPECT_EQ(smsCommonUtils->Pack7bitChar(userData, 1, FILL_BITS, packData, 1), 1);
167    EXPECT_EQ(smsCommonUtils->Unpack7bitChar(userData, 1, 0, packData, 1), 0);
168    EXPECT_EQ(smsCommonUtils->Unpack7bitChar(userData, 1, FILL_BITS, packData, 1), 0);
169    EXPECT_EQ(smsCommonUtils->DigitToDtmfChar('*'), static_cast<char>(0x0B));
170    EXPECT_EQ(smsCommonUtils->DtmfCharToDigit(static_cast<char>(0x0B)), '*');
171
172    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
173    uint8_t len;
174    EXPECT_EQ(gsmUtils->DigitToBcd(digit, 1, nullptr, 0, len), 0);
175    EXPECT_EQ(gsmUtils->DigitToBcd(nullptr, 1, packData, 1, len), 0);
176    EXPECT_FALSE(gsmUtils->DigitToBcd(digit, DIGIT_LEN, packData, 1, len));
177    std::string digits;
178    EXPECT_EQ(gsmUtils->BcdToDigit(userData, 1, digits, 1), 0);
179    EXPECT_EQ(gsmUtils->BcdToDigit(nullptr, 1, digits, 1), 0);
180}
181
182/**
183 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0002
184 * @tc.name     Test SmsCommonUtils DigitToBcd support for +*#
185 * @tc.desc     Function test
186 */
187HWTEST_F(BranchUtilsTest, SmsCommonUtils_0002, Function | MediumTest | Level1)
188{
189    // input data with pure number
190    const std::string packDataStr = "hello world";
191    const std::string digitTestStr = "17288424569";
192    const char *digit = (const char *)digitTestStr.c_str();
193    unsigned char *packData = (unsigned char *)packDataStr.c_str();
194    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
195    EXPECT_NE(gsmUtils, nullptr);
196    uint8_t len = static_cast<uint8_t>(DIGIT_LEN);
197    EXPECT_FALSE(gsmUtils->DigitToBcd(digit, DIGIT_LEN, packData, DIGIT_LEN, len));
198    EXPECT_FALSE(gsmUtils->DigitToBcd(digit, DIGIT_LEN, packData, DIGIT_LEN - 1, len));
199    len = 0;
200    EXPECT_TRUE(gsmUtils->DigitToBcd(digit, DIGIT_LEN2, packData, DIGIT_LEN2, len));
201    std::vector<uint8_t> userDataVec(packData, packData + DIGIT_LEN2);
202    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), 0x71) != userDataVec.end());
203    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), 0x82) != userDataVec.end());
204}
205
206/**
207 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0003
208 * @tc.name     Test SmsCommonUtils DigitToBcd
209 * @tc.desc     Function test
210 */
211HWTEST_F(BranchUtilsTest, SmsCommonUtils_0003, Function | MediumTest | Level1)
212{
213    // input data with number and +
214    const std::string packDataStr = "hello world";
215    const std::string digitTestStr = "+17288424569";
216    const char *digit = (const char *)digitTestStr.c_str();
217    unsigned char *packData = (unsigned char *)packDataStr.c_str();
218    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
219    EXPECT_NE(gsmUtils, nullptr);
220    uint8_t len;
221    EXPECT_TRUE(gsmUtils->DigitToBcd(digit, DIGIT_LEN2, packData, DIGIT_LEN2, len));
222    std::vector<uint8_t> userDataVec(packData, packData + DIGIT_LEN2);
223    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), 0x78) != userDataVec.end());
224    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), 0x27) != userDataVec.end());
225}
226
227/**
228 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0004
229 * @tc.name     Test SmsCommonUtils DigitToBcd
230 * @tc.desc     Function test
231 */
232HWTEST_F(BranchUtilsTest, SmsCommonUtils_0004, Function | MediumTest | Level1)
233{
234    // input data with number and #
235    const std::string packDataStr = "hello world";
236    const std::string digitTestStr = "#17288424569";
237    const char *digit = (const char *)digitTestStr.c_str();
238    unsigned char *packData = (unsigned char *)packDataStr.c_str();
239    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
240    EXPECT_NE(gsmUtils, nullptr);
241    uint8_t len;
242    EXPECT_TRUE(gsmUtils->DigitToBcd(digit, DIGIT_LEN2, packData, DIGIT_LEN2, len));
243    std::vector<uint8_t> userDataVec(packData, packData + DIGIT_LEN2);
244    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), 0x1b) != userDataVec.end());
245}
246
247/**
248 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0005
249 * @tc.name     Test SmsCommonUtils DigitToBcd
250 * @tc.desc     Function test
251 */
252HWTEST_F(BranchUtilsTest, SmsCommonUtils_0005, Function | MediumTest | Level1)
253{
254    // input data with # and *
255    const std::string packDataStr = "hello world";
256    const std::string digitTestStr = "*0#0765";
257    const char *digit = (const char *)digitTestStr.c_str();
258    unsigned char *packData = (unsigned char *)packDataStr.c_str();
259    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
260    EXPECT_NE(gsmUtils, nullptr);
261    uint8_t len;
262    EXPECT_TRUE(gsmUtils->DigitToBcd(digit, DIGIT_LEN2, packData, DIGIT_LEN2, len));
263    std::vector<uint8_t> userDataVec(packData, packData + DIGIT_LEN2);
264    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), HEX_VALUE_0B) != userDataVec.end());
265    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(), HEX_VALUE_0A) != userDataVec.end());
266}
267
268/**
269 * @tc.number   Telephony_SmsMmsGtest_SmsCommonUtils_0006
270 * @tc.name     Test SmsCommonUtils DigitToBcd
271 * @tc.desc     Function test
272 */
273HWTEST_F(BranchUtilsTest, SmsCommonUtils_0006, Function | MediumTest | Level1)
274{
275    // input data with # and *
276    const std::string packDataStr = "hello world";
277    const std::string digitTestStr = "*21#13105550020#";
278    const char *digit = (const char *)digitTestStr.c_str();
279    unsigned char *packData = (unsigned char *)packDataStr.c_str();
280    auto gsmUtils = std::make_shared<GsmSmsCommonUtils>();
281    EXPECT_NE(gsmUtils, nullptr);
282    uint8_t len;
283    EXPECT_TRUE(gsmUtils->DigitToBcd(digit, DIGIT_LEN2, packData, DIGIT_LEN2, len));
284    std::vector<uint8_t> userDataVec(packData, packData + DIGIT_LEN2);
285    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(),  0x2a) != userDataVec.end());
286    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(),  0xb1) != userDataVec.end());
287    EXPECT_TRUE(std::find(userDataVec.begin(), userDataVec.end(),  0x6f) != userDataVec.end());
288}
289} // namespace Telephony
290} // namespace OHOS
291