1 /*
2  * Copyright (c) 2022-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 "inputmethodability_fuzzer.h"
17 
18 #include <utility>
19 
20 #include "input_method_ability.h"
21 #include "input_method_engine_listener_impl.h"
22 
23 using namespace OHOS::MiscServices;
24 namespace OHOS {
25 class KeyboardListenerImpl : public KeyboardListener {
OnKeyEvent(int32_t keyCode,int32_t keyStatus,sptr<KeyEventConsumerProxy> & consumer)26     bool OnKeyEvent(int32_t keyCode, int32_t keyStatus, sptr<KeyEventConsumerProxy> &consumer)
27     {
28         return true;
29     }
OnKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,sptr<KeyEventConsumerProxy> & consumer)30     bool OnKeyEvent(const std::shared_ptr<MMI::KeyEvent> &keyEvent, sptr<KeyEventConsumerProxy> &consumer)
31     {
32         return true;
33     }
OnDealKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,sptr<KeyEventConsumerProxy> & consumer)34     bool OnDealKeyEvent(const std::shared_ptr<MMI::KeyEvent> &keyEvent, sptr<KeyEventConsumerProxy> &consumer)
35     {
36         return true;
37     }
OnCursorUpdate(int32_t positionX,int32_t positionY,int32_t height)38     void OnCursorUpdate(int32_t positionX, int32_t positionY, int32_t height)
39     {
40     }
OnSelectionChange(int32_t oldBegin,int32_t oldEnd,int32_t newBegin,int32_t newEnd)41     void OnSelectionChange(int32_t oldBegin, int32_t oldEnd, int32_t newBegin, int32_t newEnd)
42     {
43     }
OnTextChange(const std::string & text)44     void OnTextChange(const std::string &text)
45     {
46     }
OnEditorAttributeChange(const InputAttribute & inputAttribute)47     void OnEditorAttributeChange(const InputAttribute &inputAttribute)
48     {
49     }
50 };
51 
TestInsertText(const std::string & fuzzedString)52 void TestInsertText(const std::string &fuzzedString)
53 {
54     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
55     ability->InsertText(std::move(fuzzedString));
56 }
57 
TestSetImeListener()58 void TestSetImeListener()
59 {
60     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
61     auto engineListener = std::make_shared<InputMethodEngineListenerImpl>();
62     ability->SetImeListener(engineListener);
63 }
64 
TestSetKdListener()65 void TestSetKdListener()
66 {
67     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
68     ability->SetKdListener(nullptr);
69 }
70 
TestDeleteForward(int32_t fuzzedInt32)71 void TestDeleteForward(int32_t fuzzedInt32)
72 {
73     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
74     ability->DeleteForward(fuzzedInt32);
75 }
76 
TestDeleteBackward(int32_t fuzzedInt32)77 void TestDeleteBackward(int32_t fuzzedInt32)
78 {
79     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
80     ability->DeleteBackward(fuzzedInt32);
81 }
82 
TestSendExtendAction(int32_t fuzzedInt32)83 void TestSendExtendAction(int32_t fuzzedInt32)
84 {
85     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
86     ability->SendExtendAction(fuzzedInt32);
87 }
88 
TestHideKeyboardSelf()89 void TestHideKeyboardSelf()
90 {
91     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
92     ability->HideKeyboardSelf();
93 }
94 
TestGetTextBeforeCursor(int32_t fuzzedInt32)95 void TestGetTextBeforeCursor(int32_t fuzzedInt32)
96 {
97     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
98     std::u16string text;
99     ability->GetTextBeforeCursor(fuzzedInt32, text);
100 }
101 
TestGetTextAfterCursor(int32_t fuzzedInt32)102 void TestGetTextAfterCursor(int32_t fuzzedInt32)
103 {
104     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
105     std::u16string text;
106     ability->GetTextAfterCursor(fuzzedInt32, text);
107 }
108 
TestSendFunctionKey(int32_t fuzzedInt32)109 void TestSendFunctionKey(int32_t fuzzedInt32)
110 {
111     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
112     ability->SendFunctionKey(fuzzedInt32);
113 }
114 
TestMoveCursor(int32_t fuzzedInt32)115 void TestMoveCursor(int32_t fuzzedInt32)
116 {
117     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
118     ability->MoveCursor(fuzzedInt32);
119 }
120 
TestDispatchKeyEvent(int32_t fuzzedInt32)121 void TestDispatchKeyEvent(int32_t fuzzedInt32)
122 {
123     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
124     std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
125     keyEvent->SetKeyCode(fuzzedInt32);
126     keyEvent->SetKeyAction(fuzzedInt32);
127     sptr<KeyEventConsumerProxy> consumer = new (std::nothrow) KeyEventConsumerProxy(nullptr);
128     ability->DispatchKeyEvent(keyEvent, consumer);
129 }
130 
TestSetCallingWindow(int32_t fuzzedInt32)131 void TestSetCallingWindow(int32_t fuzzedInt32)
132 {
133     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
134     ability->SetCallingWindow(fuzzedInt32);
135 }
136 
TestGetEnterKeyType()137 void TestGetEnterKeyType()
138 {
139     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
140     int32_t keyType;
141     ability->GetEnterKeyType(keyType);
142 }
143 
TestGetInputPattern()144 void TestGetInputPattern()
145 {
146     sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
147     int32_t inputPattern;
148     ability->GetInputPattern(inputPattern);
149 }
150 } // namespace OHOS
151 
152 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)153 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
154 {
155     /* Run your code on data */
156     std::string fuzzedString(reinterpret_cast<const char *>(data), size);
157     auto fuzzedInt32 = static_cast<int32_t>(size);
158 
159     OHOS::TestInsertText(fuzzedString);
160 
161     OHOS::TestSetImeListener();
162 
163     OHOS::TestSetKdListener();
164 
165     OHOS::TestDeleteForward(fuzzedInt32);
166     OHOS::TestDeleteBackward(fuzzedInt32);
167     OHOS::TestSendExtendAction(fuzzedInt32);
168 
169     OHOS::TestHideKeyboardSelf();
170 
171     OHOS::TestGetTextBeforeCursor(fuzzedInt32);
172     OHOS::TestGetTextAfterCursor(fuzzedInt32);
173 
174     OHOS::TestSendFunctionKey(fuzzedInt32);
175     OHOS::TestMoveCursor(fuzzedInt32);
176 
177     OHOS::TestDispatchKeyEvent(fuzzedInt32);
178 
179     OHOS::TestSetCallingWindow(fuzzedInt32);
180 
181     OHOS::TestGetEnterKeyType();
182     OHOS::TestGetInputPattern();
183     return 0;
184 }