blob: 9224ebcf09294aae5e855247ca13c26ed8ec6387 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <RemoteAccessService.h>
#include <fuzzbinder/libbinder_ndk_driver.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <gmock/gmock.h>
#include <grpcpp/test/mock_stream.h>
#include <wakeup_client.grpc.pb.h>
namespace android {
namespace hardware {
namespace automotive {
namespace remoteaccess {
using ::grpc::ClientAsyncReaderInterface;
using ::grpc::ClientAsyncResponseReaderInterface;
using ::grpc::ClientContext;
using ::grpc::ClientReader;
using ::grpc::ClientReaderInterface;
using ::grpc::CompletionQueue;
using ::grpc::Status;
using ::grpc::testing::MockClientReader;
using ::testing::_;
using ::testing::Return;
class MockGrpcClientStub : public WakeupClient::StubInterface {
public:
ClientReaderInterface<GetRemoteTasksResponse>* GetRemoteTasksRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const GetRemoteTasksRequest& request) override {
MockClientReader<GetRemoteTasksResponse>* mockClientReader =
new MockClientReader<GetRemoteTasksResponse>();
ON_CALL(*mockClientReader, Finish()).WillByDefault(Return(Status::OK));
ON_CALL(*mockClientReader, Read(_)).WillByDefault(Return(false));
return mockClientReader;
}
Status NotifyWakeupRequired([[maybe_unused]] ClientContext* context,
[[maybe_unused]] const NotifyWakeupRequiredRequest& request,
[[maybe_unused]] NotifyWakeupRequiredResponse* response) {
return Status::OK;
}
Status ScheduleTask(ClientContext* context, const ScheduleTaskRequest& request,
ScheduleTaskResponse* response) {
return Status::OK;
}
Status UnscheduleTask(ClientContext* context, const UnscheduleTaskRequest& request,
UnscheduleTaskResponse* response) {
return Status::OK;
}
Status UnscheduleAllTasks(ClientContext* context, const UnscheduleAllTasksRequest& request,
UnscheduleAllTasksResponse* response) {
return Status::OK;
}
Status IsTaskScheduled(ClientContext* context, const IsTaskScheduledRequest& request,
IsTaskScheduledResponse* response) {
return Status::OK;
}
Status GetAllScheduledTasks(ClientContext* context, const GetAllScheduledTasksRequest& request,
GetAllScheduledTasksResponse* response) {
return Status::OK;
}
// Async methods which we do not care.
ClientAsyncReaderInterface<GetRemoteTasksResponse>* AsyncGetRemoteTasksRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const GetRemoteTasksRequest& request,
[[maybe_unused]] CompletionQueue* cq, [[maybe_unused]] void* tag) {
return nullptr;
}
ClientAsyncReaderInterface<GetRemoteTasksResponse>* PrepareAsyncGetRemoteTasksRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const GetRemoteTasksRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<NotifyWakeupRequiredResponse>* AsyncNotifyWakeupRequiredRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const NotifyWakeupRequiredRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<NotifyWakeupRequiredResponse>*
PrepareAsyncNotifyWakeupRequiredRaw([[maybe_unused]] ClientContext* context,
[[maybe_unused]] const NotifyWakeupRequiredRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
ClientAsyncResponseReaderInterface<ScheduleTaskResponse>* AsyncScheduleTaskRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const ScheduleTaskRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<ScheduleTaskResponse>* PrepareAsyncScheduleTaskRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const ScheduleTaskRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
ClientAsyncResponseReaderInterface<UnscheduleTaskResponse>* AsyncUnscheduleTaskRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const UnscheduleTaskRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<UnscheduleTaskResponse>* PrepareAsyncUnscheduleTaskRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const UnscheduleTaskRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
ClientAsyncResponseReaderInterface<UnscheduleAllTasksResponse>* AsyncUnscheduleAllTasksRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const UnscheduleAllTasksRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<UnscheduleAllTasksResponse>*
PrepareAsyncUnscheduleAllTasksRaw([[maybe_unused]] ClientContext* context,
[[maybe_unused]] const UnscheduleAllTasksRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
ClientAsyncResponseReaderInterface<IsTaskScheduledResponse>* AsyncIsTaskScheduledRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const IsTaskScheduledRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<IsTaskScheduledResponse>* PrepareAsyncIsTaskScheduledRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const IsTaskScheduledRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>* AsyncGetAllScheduledTasksRaw(
[[maybe_unused]] ClientContext* context,
[[maybe_unused]] const GetAllScheduledTasksRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>*
PrepareAsyncGetAllScheduledTasksRaw([[maybe_unused]] ClientContext* context,
[[maybe_unused]] const GetAllScheduledTasksRequest& request,
[[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
};
} // namespace remoteaccess
} // namespace automotive
} // namespace hardware
} // namespace android
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
android::hardware::automotive::remoteaccess::MockGrpcClientStub stub;
std::shared_ptr<android::hardware::automotive::remoteaccess::RemoteAccessService> service =
ndk::SharedRefBase::make<
android::hardware::automotive::remoteaccess::RemoteAccessService>(&stub);
android::fuzzService(service->asBinder().get(), FuzzedDataProvider(data, size));
return 0;
}