1/*
2 * Copyright (c) 2022-2024 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 "textbasedsmsdelivery_fuzzer.h"
17
18#ifdef GTEST_API_
19#define private public
20#endif
21
22#include "addsmstoken_fuzzer.h"
23#include "delivery_short_message_callback_stub.h"
24#include "send_short_message_callback_stub.h"
25#include "sms_interface_manager.h"
26
27using namespace OHOS::Telephony;
28namespace OHOS {
29constexpr int32_t SLOT_NUM = 2;
30bool g_flag = false;
31
32void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
33{
34    if (data == nullptr || size == 0) {
35        return;
36    }
37
38    if (g_flag) {
39        return;
40    }
41    g_flag = true;
42
43    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
44    auto smsInterfaceManager = std::make_shared<SmsInterfaceManager>(slotId);
45    if (smsInterfaceManager == nullptr) {
46        return;
47    }
48
49    smsInterfaceManager->InitInterfaceManager();
50    std::string desAddr(reinterpret_cast<const char *>(data), size);
51    std::string scAddr(reinterpret_cast<const char *>(data), size);
52    std::string text(reinterpret_cast<const char *>(data), size);
53    const sptr<ISendShortMessageCallback> sendCallback =
54        iface_cast<ISendShortMessageCallback>(new SendShortMessageCallbackStub());
55    if (sendCallback == nullptr) {
56        return;
57    }
58
59    const sptr<IDeliveryShortMessageCallback> deliveryCallback =
60        iface_cast<IDeliveryShortMessageCallback>(new DeliveryShortMessageCallbackStub());
61    if (deliveryCallback == nullptr) {
62        return;
63    }
64    uint16_t dataBaseId = 0;
65    smsInterfaceManager->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback, dataBaseId);
66
67    auto smsSendManager = std::make_shared<SmsSendManager>(slotId);
68    if (smsSendManager == nullptr) {
69        return;
70    }
71    smsSendManager->Init();
72    smsSendManager->InitNetworkHandle();
73    smsSendManager->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback, dataBaseId);
74
75    if (smsSendManager->gsmSmsSender_ != nullptr) {
76        smsSendManager->gsmSmsSender_->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback,
77            dataBaseId);
78    }
79    if (smsSendManager->cdmaSmsSender_ != nullptr) {
80        smsSendManager->cdmaSmsSender_->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback,
81            dataBaseId);
82    }
83    DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
84    smsInterfaceManager = nullptr;
85    return;
86}
87} // namespace OHOS
88
89/* Fuzzer entry point */
90extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
91{
92    /* Run your code on data */
93    OHOS::AddSmsTokenFuzzer token;
94    OHOS::DoSomethingInterestingWithMyAPI(data, size);
95    return 0;
96}
97