12d43be4eSopenharmony_ci/*
22d43be4eSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License.
52d43be4eSopenharmony_ci * You may obtain a copy of the License at
62d43be4eSopenharmony_ci *
72d43be4eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82d43be4eSopenharmony_ci *
92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and
132d43be4eSopenharmony_ci * limitations under the License.
142d43be4eSopenharmony_ci */
152d43be4eSopenharmony_ci
162d43be4eSopenharmony_ci#include "updateincalldatamachine_fuzzer.h"
172d43be4eSopenharmony_ci
182d43be4eSopenharmony_ci#define private public
192d43be4eSopenharmony_ci#define protected public
202d43be4eSopenharmony_ci
212d43be4eSopenharmony_ci#include "adddatatoken_fuzzer.h"
222d43be4eSopenharmony_ci#include "incalldatastatemachine_fuzzer.h"
232d43be4eSopenharmony_ci
242d43be4eSopenharmony_cinamespace OHOS {
252d43be4eSopenharmony_ciusing namespace OHOS::Telephony;
262d43be4eSopenharmony_ciusing namespace AppExecFwk;
272d43be4eSopenharmony_ciusing namespace OHOS::EventFwk;
282d43be4eSopenharmony_cistatic int32_t SIM_COUNT = 2;
292d43be4eSopenharmony_cibool g_flag = false;
302d43be4eSopenharmony_ci
312d43be4eSopenharmony_civoid IdleStateMachineFuzz(const uint8_t *data, size_t size)
322d43be4eSopenharmony_ci{
332d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachineFuzzer> fuzzer = std::make_shared<IncallDataStateMachineFuzzer>();
342d43be4eSopenharmony_ci    if (fuzzer == nullptr) {
352d43be4eSopenharmony_ci        return;
362d43be4eSopenharmony_ci    }
372d43be4eSopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SIM_COUNT);
382d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachine> machine = fuzzer->CreateIncallDataStateMachine(slotId);
392d43be4eSopenharmony_ci    if (machine == nullptr) {
402d43be4eSopenharmony_ci        return;
412d43be4eSopenharmony_ci    }
422d43be4eSopenharmony_ci    std::int32_t intValue = static_cast<int32_t>(size);
432d43be4eSopenharmony_ci    machine->Init(intValue);
442d43be4eSopenharmony_ci    if (machine->idleState_ == nullptr) {
452d43be4eSopenharmony_ci        return;
462d43be4eSopenharmony_ci    }
472d43be4eSopenharmony_ci    auto idleState = static_cast<IdleState *>(machine->idleState_.GetRefPtr());
482d43be4eSopenharmony_ci    machine->GetCurrentState();
492d43be4eSopenharmony_ci    machine->CanActiveDataByRadioTech();
502d43be4eSopenharmony_ci    machine->IsSecondaryCanActiveData();
512d43be4eSopenharmony_ci    machine->IsIncallDataSwitchOn();
522d43be4eSopenharmony_ci    machine->GetSlotId();
532d43be4eSopenharmony_ci    machine->HasAnyConnectedState();
542d43be4eSopenharmony_ci    machine->GetCallState();
552d43be4eSopenharmony_ci    machine->UpdateCallState(intValue);
562d43be4eSopenharmony_ci    std::shared_ptr<uint8_t> object = std::make_shared<uint8_t>(*data);
572d43be4eSopenharmony_ci    if (object == nullptr) {
582d43be4eSopenharmony_ci        return;
592d43be4eSopenharmony_ci    }
602d43be4eSopenharmony_ci    InnerEvent::Pointer event = InnerEvent::Get(intValue, object);
612d43be4eSopenharmony_ci    idleState->StateProcess(event);
622d43be4eSopenharmony_ci    idleState->ProcessCallStarted(event);
632d43be4eSopenharmony_ci    idleState->ProcessCallEnded(event);
642d43be4eSopenharmony_ci    idleState->ProcessSettingsOn(event);
652d43be4eSopenharmony_ci    idleState->ProcessDsdsChanged(event);
662d43be4eSopenharmony_ci}
672d43be4eSopenharmony_ci
682d43be4eSopenharmony_civoid ActivatingSecondaryStateMachineFuzz(const uint8_t *data, size_t size)
692d43be4eSopenharmony_ci{
702d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachineFuzzer> fuzzer = std::make_shared<IncallDataStateMachineFuzzer>();
712d43be4eSopenharmony_ci    if (fuzzer == nullptr) {
722d43be4eSopenharmony_ci        return;
732d43be4eSopenharmony_ci    }
742d43be4eSopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SIM_COUNT);
752d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachine> machine = fuzzer->CreateIncallDataStateMachine(slotId);
762d43be4eSopenharmony_ci    if (machine == nullptr) {
772d43be4eSopenharmony_ci        return;
782d43be4eSopenharmony_ci    }
792d43be4eSopenharmony_ci    std::int32_t intValue = static_cast<int32_t>(size);
802d43be4eSopenharmony_ci    machine->Init(intValue);
812d43be4eSopenharmony_ci    if (machine->activatingSecondaryState_ == nullptr || machine->secondaryActiveState_ == nullptr) {
822d43be4eSopenharmony_ci        return;
832d43be4eSopenharmony_ci    }
842d43be4eSopenharmony_ci    auto activatingSecondaryState =
852d43be4eSopenharmony_ci        static_cast<ActivatingSecondaryState *>(machine->activatingSecondaryState_.GetRefPtr());
862d43be4eSopenharmony_ci    auto secondaryActiveState = static_cast<SecondaryActiveState *>(machine->secondaryActiveState_.GetRefPtr());
872d43be4eSopenharmony_ci    machine->TransitionTo(machine->activatingSecondaryState_);
882d43be4eSopenharmony_ci    machine->GetCurrentState();
892d43be4eSopenharmony_ci    machine->CanActiveDataByRadioTech();
902d43be4eSopenharmony_ci    machine->IsSecondaryCanActiveData();
912d43be4eSopenharmony_ci    machine->IsIncallDataSwitchOn();
922d43be4eSopenharmony_ci    machine->GetSlotId();
932d43be4eSopenharmony_ci    machine->HasAnyConnectedState();
942d43be4eSopenharmony_ci    machine->GetCallState();
952d43be4eSopenharmony_ci    machine->UpdateCallState(intValue);
962d43be4eSopenharmony_ci    std::shared_ptr<uint8_t> object = std::make_shared<uint8_t>(*data);
972d43be4eSopenharmony_ci    if (object == nullptr) {
982d43be4eSopenharmony_ci        return;
992d43be4eSopenharmony_ci    }
1002d43be4eSopenharmony_ci    InnerEvent::Pointer event = InnerEvent::Get(intValue, object);
1012d43be4eSopenharmony_ci    activatingSecondaryState->StateProcess(event);
1022d43be4eSopenharmony_ci    secondaryActiveState->StateProcess(event);
1032d43be4eSopenharmony_ci    secondaryActiveState->ProcessSettingsOn(event);
1042d43be4eSopenharmony_ci    secondaryActiveState->ProcessCallEnded(event);
1052d43be4eSopenharmony_ci    secondaryActiveState->ProcessSettingsOff(event);
1062d43be4eSopenharmony_ci    secondaryActiveState->ProcessDsdsChanged(event);
1072d43be4eSopenharmony_ci}
1082d43be4eSopenharmony_ci
1092d43be4eSopenharmony_civoid ActivatedSecondaryStateMachineFuzz(const uint8_t *data, size_t size)
1102d43be4eSopenharmony_ci{
1112d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachineFuzzer> fuzzer = std::make_shared<IncallDataStateMachineFuzzer>();
1122d43be4eSopenharmony_ci    if (fuzzer == nullptr) {
1132d43be4eSopenharmony_ci        return;
1142d43be4eSopenharmony_ci    }
1152d43be4eSopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SIM_COUNT);
1162d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachine> machine = fuzzer->CreateIncallDataStateMachine(slotId);
1172d43be4eSopenharmony_ci    if (machine == nullptr) {
1182d43be4eSopenharmony_ci        return;
1192d43be4eSopenharmony_ci    }
1202d43be4eSopenharmony_ci    std::int32_t intValue = static_cast<int32_t>(size);
1212d43be4eSopenharmony_ci    machine->Init(intValue);
1222d43be4eSopenharmony_ci    if (machine->activatedSecondaryState_ == nullptr || machine->secondaryActiveState_ == nullptr) {
1232d43be4eSopenharmony_ci        return;
1242d43be4eSopenharmony_ci    }
1252d43be4eSopenharmony_ci    auto activatedSecondaryState =
1262d43be4eSopenharmony_ci        static_cast<ActivatedSecondaryState *>(machine->activatedSecondaryState_.GetRefPtr());
1272d43be4eSopenharmony_ci    auto secondaryActiveState = static_cast<SecondaryActiveState *>(machine->secondaryActiveState_.GetRefPtr());
1282d43be4eSopenharmony_ci    machine->TransitionTo(machine->activatingSecondaryState_);
1292d43be4eSopenharmony_ci    machine->TransitionTo(machine->activatedSecondaryState_);
1302d43be4eSopenharmony_ci    machine->GetCurrentState();
1312d43be4eSopenharmony_ci    machine->CanActiveDataByRadioTech();
1322d43be4eSopenharmony_ci    machine->IsSecondaryCanActiveData();
1332d43be4eSopenharmony_ci    machine->IsIncallDataSwitchOn();
1342d43be4eSopenharmony_ci    machine->GetSlotId();
1352d43be4eSopenharmony_ci    machine->HasAnyConnectedState();
1362d43be4eSopenharmony_ci    machine->GetCallState();
1372d43be4eSopenharmony_ci    machine->UpdateCallState(intValue);
1382d43be4eSopenharmony_ci    std::shared_ptr<uint8_t> object = std::make_shared<uint8_t>(*data);
1392d43be4eSopenharmony_ci    if (object == nullptr) {
1402d43be4eSopenharmony_ci        return;
1412d43be4eSopenharmony_ci    }
1422d43be4eSopenharmony_ci    InnerEvent::Pointer event = InnerEvent::Get(intValue, object);
1432d43be4eSopenharmony_ci    activatedSecondaryState->StateProcess(event);
1442d43be4eSopenharmony_ci    secondaryActiveState->StateProcess(event);
1452d43be4eSopenharmony_ci    secondaryActiveState->ProcessSettingsOn(event);
1462d43be4eSopenharmony_ci    secondaryActiveState->ProcessCallEnded(event);
1472d43be4eSopenharmony_ci    secondaryActiveState->ProcessSettingsOff(event);
1482d43be4eSopenharmony_ci    secondaryActiveState->ProcessDsdsChanged(event);
1492d43be4eSopenharmony_ci}
1502d43be4eSopenharmony_ci
1512d43be4eSopenharmony_civoid DeactivatingSecondaryStateMachineFuzz(const uint8_t *data, size_t size)
1522d43be4eSopenharmony_ci{
1532d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachineFuzzer> fuzzer = std::make_shared<IncallDataStateMachineFuzzer>();
1542d43be4eSopenharmony_ci    if (fuzzer == nullptr) {
1552d43be4eSopenharmony_ci        return;
1562d43be4eSopenharmony_ci    }
1572d43be4eSopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SIM_COUNT);
1582d43be4eSopenharmony_ci    std::shared_ptr<IncallDataStateMachine> machine = fuzzer->CreateIncallDataStateMachine(slotId);
1592d43be4eSopenharmony_ci    if (machine == nullptr) {
1602d43be4eSopenharmony_ci        return;
1612d43be4eSopenharmony_ci    }
1622d43be4eSopenharmony_ci    std::int32_t intValue = static_cast<int32_t>(size);
1632d43be4eSopenharmony_ci    machine->Init(intValue);
1642d43be4eSopenharmony_ci    if (machine->deactivatingSecondaryState_ == nullptr || machine->idleState_ == nullptr) {
1652d43be4eSopenharmony_ci        return;
1662d43be4eSopenharmony_ci    }
1672d43be4eSopenharmony_ci    auto deactivatingSecondaryState =
1682d43be4eSopenharmony_ci        static_cast<DeactivatingSecondaryState *>(machine->deactivatingSecondaryState_.GetRefPtr());
1692d43be4eSopenharmony_ci    auto idleState = static_cast<IdleState *>(machine->idleState_.GetRefPtr());
1702d43be4eSopenharmony_ci    machine->TransitionTo(machine->activatingSecondaryState_);
1712d43be4eSopenharmony_ci    machine->TransitionTo(machine->activatedSecondaryState_);
1722d43be4eSopenharmony_ci    machine->TransitionTo(machine->deactivatingSecondaryState_);
1732d43be4eSopenharmony_ci    machine->GetCurrentState();
1742d43be4eSopenharmony_ci    machine->CanActiveDataByRadioTech();
1752d43be4eSopenharmony_ci    machine->IsSecondaryCanActiveData();
1762d43be4eSopenharmony_ci    machine->IsIncallDataSwitchOn();
1772d43be4eSopenharmony_ci    machine->GetSlotId();
1782d43be4eSopenharmony_ci    machine->HasAnyConnectedState();
1792d43be4eSopenharmony_ci    machine->GetCallState();
1802d43be4eSopenharmony_ci    machine->UpdateCallState(intValue);
1812d43be4eSopenharmony_ci    std::shared_ptr<uint8_t> object = std::make_shared<uint8_t>(*data);
1822d43be4eSopenharmony_ci    if (object == nullptr) {
1832d43be4eSopenharmony_ci        return;
1842d43be4eSopenharmony_ci    }
1852d43be4eSopenharmony_ci    InnerEvent::Pointer event = InnerEvent::Get(intValue, object);
1862d43be4eSopenharmony_ci    deactivatingSecondaryState->StateProcess(event);
1872d43be4eSopenharmony_ci    idleState->StateProcess(event);
1882d43be4eSopenharmony_ci    idleState->ProcessCallStarted(event);
1892d43be4eSopenharmony_ci    idleState->ProcessCallEnded(event);
1902d43be4eSopenharmony_ci    idleState->ProcessSettingsOn(event);
1912d43be4eSopenharmony_ci    idleState->ProcessDsdsChanged(event);
1922d43be4eSopenharmony_ci}
1932d43be4eSopenharmony_ci
1942d43be4eSopenharmony_civoid UpdateIncallDataMachineWithMyAPI(const uint8_t *data, size_t size)
1952d43be4eSopenharmony_ci{
1962d43be4eSopenharmony_ci    if (data == nullptr || size == 0) {
1972d43be4eSopenharmony_ci        return;
1982d43be4eSopenharmony_ci    }
1992d43be4eSopenharmony_ci
2002d43be4eSopenharmony_ci    if (!g_flag) {
2012d43be4eSopenharmony_ci        IdleStateMachineFuzz(data, size);
2022d43be4eSopenharmony_ci        ActivatingSecondaryStateMachineFuzz(data, size);
2032d43be4eSopenharmony_ci        ActivatedSecondaryStateMachineFuzz(data, size);
2042d43be4eSopenharmony_ci        DeactivatingSecondaryStateMachineFuzz(data, size);
2052d43be4eSopenharmony_ci        g_flag = true;
2062d43be4eSopenharmony_ci    }
2072d43be4eSopenharmony_ci}
2082d43be4eSopenharmony_ci} // namespace OHOS
2092d43be4eSopenharmony_ci
2102d43be4eSopenharmony_ci/* Fuzzer entry point */
2112d43be4eSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
2122d43be4eSopenharmony_ci{
2132d43be4eSopenharmony_ci    OHOS::AddDataTokenFuzzer token;
2142d43be4eSopenharmony_ci    /* Run your code on data */
2152d43be4eSopenharmony_ci    OHOS::UpdateIncallDataMachineWithMyAPI(data, size);
2162d43be4eSopenharmony_ci    return 0;
2172d43be4eSopenharmony_ci}