1 /*
2  * Copyright 2020 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 <fuzzer/FuzzedDataProvider.h>
18 #include <gmock/gmock.h>
19 #include "EventGenerator.h"
20 #include "MockEngine.h"
21 #include "StreamManager.h"
22 
23 namespace android {
24 namespace automotive {
25 namespace computepipe {
26 namespace runner {
27 namespace stream_manager {
28 
29 using android::automotive::computepipe::runner::generator::DefaultEvent;
30 using ::testing::Return;
31 
32 namespace {
33 
SetupStreamManager(const std::shared_ptr<MockEngine> & engine)34 std::unique_ptr<StreamManager> SetupStreamManager(const std::shared_ptr<MockEngine>& engine) {
35     StreamManagerFactory factory;
36     proto::OutputConfig config;
37     config.set_type(proto::PacketType::SEMANTIC_DATA);
38     config.set_stream_name("semantic_stream");
39     return factory.getStreamManager(config, engine, 0);
40 }
41 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)42 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
43     // Set up process
44     char* fakeData = reinterpret_cast<char*>(malloc(sizeof(char) * size));
45     memcpy(fakeData, data, size * sizeof(char));
46 
47     std::shared_ptr<MemHandle> currentPacket;
48     DefaultEvent e = DefaultEvent::generateEntryEvent(DefaultEvent::Phase::RUN);
49     std::shared_ptr<MockEngine> mockEngine = std::make_shared<MockEngine>();
50     std::unique_ptr<StreamManager> manager = SetupStreamManager(mockEngine);
51     manager->handleExecutionPhase(e);
52 
53     // Probably not called
54     ON_CALL((*mockEngine), dispatchPacket)
55             .WillByDefault(
56                     testing::DoAll(testing::SaveArg<0>(&currentPacket), (Return(Status::SUCCESS))));
57 
58     manager->queuePacket(fakeData, size, 0);
59 
60     if (currentPacket) {
61         EXPECT_EQ(std::memcmp(currentPacket->getData(), fakeData, size), 0);
62         currentPacket = nullptr;
63     }
64 
65     free(fakeData);
66     return 0;
67 }
68 
69 }  // namespace
70 }  // namespace stream_manager
71 }  // namespace runner
72 }  // namespace computepipe
73 }  // namespace automotive
74 }  // namespace android
75