1/*
2 * Copyright (c) 2022 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 "bluetoothdialcall_fuzzer.h"
17
18#include <cstddef>
19#include <cstdint>
20#define private public
21#include "addcalltoken_fuzzer.h"
22#include "bluetooth_call_service.h"
23#include "message_parcel.h"
24
25using namespace OHOS::Telephony;
26namespace OHOS {
27constexpr int32_t SLOT_NUM = 3;
28
29void AnswerCall(const uint8_t *data, size_t size)
30{
31    if (!IsServiceInited()) {
32        return;
33    }
34
35    MessageParcel dataParcel;
36    dataParcel.WriteBuffer(data, size);
37    dataParcel.RewindRead(0);
38    MessageParcel reply;
39    DelayedSingleton<BluetoothCallService>::GetInstance()->OnAnswerCall(dataParcel, reply);
40}
41
42void RejectCall(const uint8_t *data, size_t size)
43{
44    if (!IsServiceInited()) {
45        return;
46    }
47
48    MessageParcel dataParcel;
49    dataParcel.WriteBuffer(data, size);
50    dataParcel.RewindRead(0);
51    MessageParcel reply;
52    DelayedSingleton<BluetoothCallService>::GetInstance()->OnRejectCall(dataParcel, reply);
53}
54
55void HangUpCall(const uint8_t *data, size_t size)
56{
57    if (!IsServiceInited()) {
58        return;
59    }
60
61    MessageParcel dataParcel;
62    dataParcel.WriteBuffer(data, size);
63    dataParcel.RewindRead(0);
64    MessageParcel reply;
65    DelayedSingleton<BluetoothCallService>::GetInstance()->OnHangUpCall(dataParcel, reply);
66}
67
68void GetBtCallState(const uint8_t *data, size_t size)
69{
70    if (!IsServiceInited()) {
71        return;
72    }
73
74    MessageParcel dataParcel;
75    dataParcel.WriteBuffer(data, size);
76    dataParcel.RewindRead(0);
77    MessageParcel reply;
78    DelayedSingleton<BluetoothCallService>::GetInstance()->OnGetBtCallState(dataParcel, reply);
79}
80
81void HoldCall(const uint8_t *data, size_t size)
82{
83    if (!IsServiceInited()) {
84        return;
85    }
86
87    MessageParcel dataParcel;
88    dataParcel.WriteBuffer(data, size);
89    dataParcel.RewindRead(0);
90    MessageParcel reply;
91    DelayedSingleton<BluetoothCallService>::GetInstance()->OnHoldCall(dataParcel, reply);
92}
93
94void UnHoldCall(const uint8_t *data, size_t size)
95{
96    if (!IsServiceInited()) {
97        return;
98    }
99
100    MessageParcel dataParcel;
101    dataParcel.WriteBuffer(data, size);
102    dataParcel.RewindRead(0);
103    MessageParcel reply;
104    DelayedSingleton<BluetoothCallService>::GetInstance()->OnUnHoldCall(dataParcel, reply);
105}
106
107void SwitchCall(const uint8_t *data, size_t size)
108{
109    if (!IsServiceInited()) {
110        return;
111    }
112
113    MessageParcel dataParcel;
114    dataParcel.WriteBuffer(data, size);
115    dataParcel.RewindRead(0);
116    MessageParcel reply;
117    DelayedSingleton<BluetoothCallService>::GetInstance()->OnSwitchCall(dataParcel, reply);
118}
119
120void CombineConference(const uint8_t *data, size_t size)
121{
122    if (!IsServiceInited()) {
123        return;
124    }
125
126    MessageParcel dataParcel;
127    dataParcel.WriteBuffer(data, size);
128    dataParcel.RewindRead(0);
129    MessageParcel reply;
130    DelayedSingleton<BluetoothCallService>::GetInstance()->OnCombineConference(dataParcel, reply);
131}
132
133void SeparateConference(const uint8_t *data, size_t size)
134{
135    if (!IsServiceInited()) {
136        return;
137    }
138
139    MessageParcel dataParcel;
140    dataParcel.WriteBuffer(data, size);
141    dataParcel.RewindRead(0);
142    MessageParcel reply;
143    DelayedSingleton<BluetoothCallService>::GetInstance()->OnSeparateConference(dataParcel, reply);
144}
145
146void KickOutFromConference(const uint8_t *data, size_t size)
147{
148    if (!IsServiceInited()) {
149        return;
150    }
151
152    MessageParcel dataParcel;
153    dataParcel.WriteBuffer(data, size);
154    dataParcel.RewindRead(0);
155    MessageParcel reply;
156    DelayedSingleton<BluetoothCallService>::GetInstance()->OnKickOutFromConference(dataParcel, reply);
157}
158
159void StartDtmf(const uint8_t *data, size_t size)
160{
161    if (!IsServiceInited()) {
162        return;
163    }
164
165    MessageParcel dataParcel;
166    dataParcel.WriteInt8(*data);
167    dataParcel.WriteBuffer(data, size);
168    dataParcel.RewindRead(0);
169    MessageParcel reply;
170    DelayedSingleton<BluetoothCallService>::GetInstance()->OnStartDtmf(dataParcel, reply);
171}
172
173void StopDtmf(const uint8_t *data, size_t size)
174{
175    if (!IsServiceInited()) {
176        return;
177    }
178
179    MessageParcel dataParcel;
180    dataParcel.WriteBuffer(data, size);
181    dataParcel.RewindRead(0);
182    MessageParcel reply;
183    DelayedSingleton<BluetoothCallService>::GetInstance()->OnStopDtmf(dataParcel, reply);
184}
185
186void GetCurrentCallList(const uint8_t *data, size_t size)
187{
188    if (!IsServiceInited()) {
189        return;
190    }
191
192    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
193    MessageParcel dataParcel;
194    dataParcel.WriteInt32(slotId);
195    dataParcel.WriteBuffer(data, size);
196    dataParcel.RewindRead(0);
197    MessageParcel reply;
198    DelayedSingleton<BluetoothCallService>::GetInstance()->OnGetCurrentCallList(dataParcel, reply);
199}
200
201void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
202{
203    if (data == nullptr || size == 0) {
204        return;
205    }
206
207    AnswerCall(data, size);
208    RejectCall(data, size);
209    HangUpCall(data, size);
210    GetBtCallState(data, size);
211    HoldCall(data, size);
212    UnHoldCall(data, size);
213    SwitchCall(data, size);
214    CombineConference(data, size);
215    SeparateConference(data, size);
216    KickOutFromConference(data, size);
217    StartDtmf(data, size);
218    StopDtmf(data, size);
219    GetCurrentCallList(data, size);
220}
221} // namespace OHOS
222
223/* Fuzzer entry point */
224extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
225{
226    OHOS::AddCallTokenFuzzer token;
227    /* Run your code on data */
228    OHOS::DoSomethingInterestingWithMyAPI(data, size);
229    return 0;
230}
231