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#include "promiserejectinfo_fuzzer.h"
17#include "ecmascript/base/string_helper.h"
18#include "ecmascript/base/utf_helper.h"
19#include "ecmascript/napi/include/jsnapi.h"
20
21using namespace panda;
22using namespace panda::ecmascript;
23using namespace panda::ecmascript::base::utf_helper;
24
25namespace OHOS {
26    void PromiseRejectInfoNewFuzzTest(const uint8_t* data, size_t size)
27    {
28        RuntimeOption option;
29        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
30        EcmaVM *vm = JSNApi::CreateJSVM(option);
31        if (data == nullptr || size <= 0) {
32            LOG_ECMA(ERROR) << "illegal input!";
33            return;
34        }
35        Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
36        Local<JSValueRef> promise(promiseStirng);
37        Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
38        Local<JSValueRef> reason(reasonString);
39        void *data2 = static_cast<void*>(new std::string("test"));
40        [[maybe_unused]]PromiseRejectInfo promiseReject(promise, reason,
41            PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2);
42        JSNApi::DestroyJSVM(vm);
43    }
44
45    void GetPromiseFuzzTest([[maybe_unused]]const uint8_t* data, size_t size)
46    {
47        RuntimeOption option;
48        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
49        EcmaVM *vm = JSNApi::CreateJSVM(option);
50        if (size <= 0) {
51            LOG_ECMA(ERROR) << "illegal input!";
52            return;
53        }
54        Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm);
55        [[maybe_unused]]Local<PromiseRef> promise = capability->GetPromise(vm);
56        JSNApi::DestroyJSVM(vm);
57    }
58
59    void GetDataFuzzTest(const uint8_t* data, size_t size)
60    {
61        RuntimeOption option;
62        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
63        EcmaVM *vm = JSNApi::CreateJSVM(option);
64        if (data == nullptr || size <= 0) {
65            LOG_ECMA(ERROR) << "illegal input!";
66            return;
67        }
68        Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
69        Local<JSValueRef> promise(promiseStirng);
70        Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
71        Local<JSValueRef> reason(reasonString);
72        PromiseRejectInfo promiseReject(promise, reason,
73            PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, (void*)data);
74        promiseReject.GetData();
75        JSNApi::DestroyJSVM(vm);
76    }
77
78    void PromiseRejectInfoGetPromiseFuzzTest(const uint8_t* data, size_t size)
79    {
80        RuntimeOption option;
81        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
82        EcmaVM *vm = JSNApi::CreateJSVM(option);
83        if (data == nullptr || size <= 0) {
84            LOG_ECMA(ERROR) << "illegal input!";
85            return;
86        }
87        Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
88        Local<JSValueRef> promise(promiseStirng);
89        Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
90        Local<JSValueRef> reason(reasonString);
91        void *newdata = static_cast<void*>(new std::string("test"));
92        PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, newdata);
93        promiseReject.GetPromise();
94        JSNApi::DestroyJSVM(vm);
95    }
96
97    void PromiseRejectInfoGetReasonFuzzTest(const uint8_t* data, size_t size)
98    {
99        RuntimeOption option;
100        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
101        EcmaVM *vm = JSNApi::CreateJSVM(option);
102        if (data == nullptr || size <= 0) {
103            LOG_ECMA(ERROR) << "illegal input!";
104            return;
105        }
106        Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
107        Local<JSValueRef> promise(promiseStirng);
108        Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
109        Local<JSValueRef> reason(reasonString);
110        void *data2 = static_cast<void*>(new std::string("test"));
111        PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2);
112        [[maybe_unused]]Local<JSValueRef> reason_res = promiseReject.GetReason();
113        JSNApi::DestroyJSVM(vm);
114    }
115
116    void PromiseRejectInfoGetOperationFuzzTest(const uint8_t* data, size_t size)
117    {
118        RuntimeOption option;
119        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
120        EcmaVM *vm = JSNApi::CreateJSVM(option);
121        if (data == nullptr || size <= 0) {
122            LOG_ECMA(ERROR) << "illegal input!";
123            return;
124        }
125        Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
126        Local<JSValueRef> promise(promiseStirng);
127        Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size);
128        Local<JSValueRef> reason(reasonString);
129        void *data2 = static_cast<void*>(new std::string("test"));
130        PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2);
131        promiseReject.GetOperation();
132        JSNApi::DestroyJSVM(vm);
133    }
134}
135
136// Fuzzer entry point.
137extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
138{
139    // Run your code on data.
140    OHOS::PromiseRejectInfoNewFuzzTest(data, size);
141    OHOS::GetPromiseFuzzTest(data, size);
142    OHOS::GetDataFuzzTest(data, size);
143    OHOS::PromiseRejectInfoGetPromiseFuzzTest(data, size);
144    OHOS::PromiseRejectInfoGetReasonFuzzTest(data, size);
145    OHOS::PromiseRejectInfoGetOperationFuzzTest(data, size);
146    return 0;
147}