146debc2cSopenharmony_ci/*
246debc2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
346debc2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
446debc2cSopenharmony_ci * you may not use this file except in compliance with the License.
546debc2cSopenharmony_ci * You may obtain a copy of the License at
646debc2cSopenharmony_ci *
746debc2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
846debc2cSopenharmony_ci *
946debc2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1046debc2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1146debc2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1246debc2cSopenharmony_ci * See the License for the specific language governing permissions and
1346debc2cSopenharmony_ci * limitations under the License.
1446debc2cSopenharmony_ci */
1546debc2cSopenharmony_ci
1646debc2cSopenharmony_ci#include "fuzzer/FuzzedDataProvider.h"
1746debc2cSopenharmony_ci#include "scanmdnsservice_fuzzer.h"
1846debc2cSopenharmony_ci#include "scan_mdns_service.h"
1946debc2cSopenharmony_ci
2046debc2cSopenharmony_cinamespace OHOS {
2146debc2cSopenharmony_cinamespace Scan {
2246debc2cSopenharmony_ci    constexpr uint8_t MAX_STRING_LENGTH = 255;
2346debc2cSopenharmony_ci    constexpr int MAX_SET_NUMBER = 100;
2446debc2cSopenharmony_ci    constexpr size_t FOO_MAX_LEN = 1024;
2546debc2cSopenharmony_ci    constexpr size_t U32_AT_SIZE = 4;
2646debc2cSopenharmony_ci
2746debc2cSopenharmony_ci    void TestOnStartDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
2846debc2cSopenharmony_ci    {
2946debc2cSopenharmony_ci        std::string serviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
3046debc2cSopenharmony_ci        ScanMdnsService::GetInstance().SetServiceType(serviceName.c_str());
3146debc2cSopenharmony_ci        ScanMdnsService::GetInstance().onStartDiscoverService();
3246debc2cSopenharmony_ci        ScanMdnsService::GetInstance().onStopDiscoverService();
3346debc2cSopenharmony_ci    }
3446debc2cSopenharmony_ci
3546debc2cSopenharmony_ci    void TestSetService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
3646debc2cSopenharmony_ci    {
3746debc2cSopenharmony_ci        MDnsServiceInfo info;
3846debc2cSopenharmony_ci        ScanMdnsService::GetInstance().SetServiceInfo(info);
3946debc2cSopenharmony_ci        sptr<ScanMDnsResolveObserver> resolveObserve;
4046debc2cSopenharmony_ci        ScanMdnsService::GetInstance().SetMDnsResolveCallBack(resolveObserve);
4146debc2cSopenharmony_ci        sptr<ScanMDnsDiscoveryObserver> discoveryObserve;
4246debc2cSopenharmony_ci        ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(discoveryObserve);
4346debc2cSopenharmony_ci        ScanMdnsService::GetInstance().onStartDiscoverService();
4446debc2cSopenharmony_ci        std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
4546debc2cSopenharmony_ci        ScanMdnsService::GetInstance().SetServiceType(stype);
4646debc2cSopenharmony_ci        ScanMdnsService::GetInstance().GetMDnsResolveCallBack();
4746debc2cSopenharmony_ci        ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack();
4846debc2cSopenharmony_ci        ScanMdnsService::GetInstance().GetServiceInfo();
4946debc2cSopenharmony_ci    }
5046debc2cSopenharmony_ci
5146debc2cSopenharmony_ci    void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
5246debc2cSopenharmony_ci    {
5346debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
5446debc2cSopenharmony_ci        serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
5546debc2cSopenharmony_ci        std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
5646debc2cSopenharmony_ci        ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr);
5746debc2cSopenharmony_ci    }
5846debc2cSopenharmony_ci
5946debc2cSopenharmony_ci    void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6046debc2cSopenharmony_ci    {
6146debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
6246debc2cSopenharmony_ci        serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
6346debc2cSopenharmony_ci        ScanMdnsService::GetInstance().onResolveService(serviceInfo);
6446debc2cSopenharmony_ci    }
6546debc2cSopenharmony_ci
6646debc2cSopenharmony_ci    void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6746debc2cSopenharmony_ci    {
6846debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
6946debc2cSopenharmony_ci        serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
7046debc2cSopenharmony_ci        ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo);
7146debc2cSopenharmony_ci    }
7246debc2cSopenharmony_ci
7346debc2cSopenharmony_ci    void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
7446debc2cSopenharmony_ci    {
7546debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
7646debc2cSopenharmony_ci        ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
7746debc2cSopenharmony_ci        int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7846debc2cSopenharmony_ci        scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode);
7946debc2cSopenharmony_ci    }
8046debc2cSopenharmony_ci
8146debc2cSopenharmony_ci    void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
8246debc2cSopenharmony_ci    {
8346debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
8446debc2cSopenharmony_ci        ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo);
8546debc2cSopenharmony_ci        int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
8646debc2cSopenharmony_ci        scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode);
8746debc2cSopenharmony_ci    }
8846debc2cSopenharmony_ci
8946debc2cSopenharmony_ci    void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
9046debc2cSopenharmony_ci    {
9146debc2cSopenharmony_ci        MDnsServiceInfo serviceInfo;
9246debc2cSopenharmony_ci        ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
9346debc2cSopenharmony_ci        int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
9446debc2cSopenharmony_ci        scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode);
9546debc2cSopenharmony_ci    }
9646debc2cSopenharmony_ci
9746debc2cSopenharmony_ci}
9846debc2cSopenharmony_ci}
9946debc2cSopenharmony_ci
10046debc2cSopenharmony_ci/* Fuzzer entry point */
10146debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
10246debc2cSopenharmony_ci{
10346debc2cSopenharmony_ci    if (data == nullptr) {
10446debc2cSopenharmony_ci        return 0;
10546debc2cSopenharmony_ci    }
10646debc2cSopenharmony_ci
10746debc2cSopenharmony_ci    if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
10846debc2cSopenharmony_ci        return 0;
10946debc2cSopenharmony_ci    }
11046debc2cSopenharmony_ci    FuzzedDataProvider dataProvider(data, size);
11146debc2cSopenharmony_ci    OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider);
11246debc2cSopenharmony_ci    OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider);
11346debc2cSopenharmony_ci    OHOS::Scan::TestonResolveService(data, size, &dataProvider);
11446debc2cSopenharmony_ci    OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider);
11546debc2cSopenharmony_ci    OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider);
11646debc2cSopenharmony_ci    OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider);
11746debc2cSopenharmony_ci    OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider);
11846debc2cSopenharmony_ci    return 0;
11946debc2cSopenharmony_ci}
12046debc2cSopenharmony_ci
121