• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <RemoteAccessService.h>
18 #include <fuzzbinder/libbinder_ndk_driver.h>
19 #include <fuzzer/FuzzedDataProvider.h>
20 #include <gmock/gmock.h>
21 #include <grpcpp/test/mock_stream.h>
22 #include <wakeup_client.grpc.pb.h>
23 
24 namespace android {
25 namespace hardware {
26 namespace automotive {
27 namespace remoteaccess {
28 
29 using ::grpc::ClientAsyncReaderInterface;
30 using ::grpc::ClientAsyncResponseReaderInterface;
31 using ::grpc::ClientContext;
32 using ::grpc::ClientReader;
33 using ::grpc::ClientReaderInterface;
34 using ::grpc::CompletionQueue;
35 using ::grpc::Status;
36 using ::grpc::testing::MockClientReader;
37 using ::testing::_;
38 using ::testing::Return;
39 
40 class MockGrpcClientStub : public WakeupClient::StubInterface {
41   public:
GetRemoteTasksRaw(ClientContext * context,const GetRemoteTasksRequest & request)42     ClientReaderInterface<GetRemoteTasksResponse>* GetRemoteTasksRaw(
43             [[maybe_unused]] ClientContext* context,
44             [[maybe_unused]] const GetRemoteTasksRequest& request) override {
45         MockClientReader<GetRemoteTasksResponse>* mockClientReader =
46                 new MockClientReader<GetRemoteTasksResponse>();
47         ON_CALL(*mockClientReader, Finish()).WillByDefault(Return(Status::OK));
48         ON_CALL(*mockClientReader, Read(_)).WillByDefault(Return(false));
49         return mockClientReader;
50     }
51 
NotifyWakeupRequired(ClientContext * context,const NotifyWakeupRequiredRequest & request,NotifyWakeupRequiredResponse * response)52     Status NotifyWakeupRequired([[maybe_unused]] ClientContext* context,
53                                 [[maybe_unused]] const NotifyWakeupRequiredRequest& request,
54                                 [[maybe_unused]] NotifyWakeupRequiredResponse* response) {
55         return Status::OK;
56     }
57 
58     // Async methods which we do not care.
AsyncGetRemoteTasksRaw(ClientContext * context,const GetRemoteTasksRequest & request,CompletionQueue * cq,void * tag)59     ClientAsyncReaderInterface<GetRemoteTasksResponse>* AsyncGetRemoteTasksRaw(
60             [[maybe_unused]] ClientContext* context,
61             [[maybe_unused]] const GetRemoteTasksRequest& request,
62             [[maybe_unused]] CompletionQueue* cq, [[maybe_unused]] void* tag) {
63         return nullptr;
64     }
65 
PrepareAsyncGetRemoteTasksRaw(ClientContext * context,const GetRemoteTasksRequest & request,CompletionQueue * cq)66     ClientAsyncReaderInterface<GetRemoteTasksResponse>* PrepareAsyncGetRemoteTasksRaw(
67             [[maybe_unused]] ClientContext* context,
68             [[maybe_unused]] const GetRemoteTasksRequest& request,
69             [[maybe_unused]] CompletionQueue* cq) {
70         return nullptr;
71     }
72 
AsyncNotifyWakeupRequiredRaw(ClientContext * context,const NotifyWakeupRequiredRequest & request,CompletionQueue * cq)73     ClientAsyncResponseReaderInterface<NotifyWakeupRequiredResponse>* AsyncNotifyWakeupRequiredRaw(
74             [[maybe_unused]] ClientContext* context,
75             [[maybe_unused]] const NotifyWakeupRequiredRequest& request,
76             [[maybe_unused]] CompletionQueue* cq) {
77         return nullptr;
78     }
79 
80     ClientAsyncResponseReaderInterface<NotifyWakeupRequiredResponse>*
PrepareAsyncNotifyWakeupRequiredRaw(ClientContext * context,const NotifyWakeupRequiredRequest & request,CompletionQueue * c)81     PrepareAsyncNotifyWakeupRequiredRaw([[maybe_unused]] ClientContext* context,
82                                         [[maybe_unused]] const NotifyWakeupRequiredRequest& request,
83                                         [[maybe_unused]] CompletionQueue* c) {
84         return nullptr;
85     }
86 };
87 
88 }  // namespace remoteaccess
89 }  // namespace automotive
90 }  // namespace hardware
91 }  // namespace android
92 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)93 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
94     android::hardware::automotive::remoteaccess::MockGrpcClientStub stub;
95     std::shared_ptr<android::hardware::automotive::remoteaccess::RemoteAccessService> service =
96             ndk::SharedRefBase::make<
97                     android::hardware::automotive::remoteaccess::RemoteAccessService>(&stub);
98     android::fuzzService(service->asBinder().get(), FuzzedDataProvider(data, size));
99 
100     return 0;
101 }
102