Merge "DO NOT MERGE: Add fuzzer for computepipe SemanticManager" into rvc-qpr-dev
diff --git a/computepipe/tests/fuzz/Android.bp b/computepipe/tests/fuzz/Android.bp
new file mode 100644
index 0000000..dff74b8
--- /dev/null
+++ b/computepipe/tests/fuzz/Android.bp
@@ -0,0 +1,41 @@
+// Copyright 2020 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.
+
+cc_fuzz {
+    name: "computepipe_semantic_manager_fuzzer",
+    srcs: [
+        "SemanticManagerFuzzer.cpp",
+    ],
+    static_libs: [
+        "computepipe_runner_component",
+        "computepipe_stream_manager",
+        "libcomputepipeprotos",
+        "libgtest",
+        "libgmock",
+        "mock_stream_engine_interface",
+    ],
+    shared_libs: [
+        "libbase",
+        "liblog",
+        "libnativewindow",
+        "libprotobuf-cpp-lite",
+    ],
+    header_libs: [
+        "computepipe_runner_includes",
+    ],
+    include_dirs: [
+        "packages/services/Car/computepipe",
+        "packages/services/Car/computepipe/runner/stream_manager",
+    ],
+}
diff --git a/computepipe/tests/fuzz/SemanticManagerFuzzer.cpp b/computepipe/tests/fuzz/SemanticManagerFuzzer.cpp
new file mode 100644
index 0000000..9b2edb7
--- /dev/null
+++ b/computepipe/tests/fuzz/SemanticManagerFuzzer.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2020 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 <fuzzer/FuzzedDataProvider.h>
+#include <gmock/gmock.h>
+#include "EventGenerator.h"
+#include "MockEngine.h"
+#include "StreamManager.h"
+
+namespace android {
+namespace automotive {
+namespace computepipe {
+namespace runner {
+namespace stream_manager {
+
+using android::automotive::computepipe::runner::generator::DefaultEvent;
+using ::testing::Return;
+
+namespace {
+
+std::unique_ptr<StreamManager> SetupStreamManager(const std::shared_ptr<MockEngine>& engine) {
+    StreamManagerFactory factory;
+    proto::OutputConfig config;
+    config.set_type(proto::PacketType::SEMANTIC_DATA);
+    config.set_stream_name("semantic_stream");
+    return factory.getStreamManager(config, engine, 0);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+    // Set up process
+    char* fakeData = reinterpret_cast<char*>(malloc(sizeof(char) * size));
+    memcpy(fakeData, data, size * sizeof(char));
+
+    std::shared_ptr<MemHandle> currentPacket;
+    DefaultEvent e = DefaultEvent::generateEntryEvent(DefaultEvent::Phase::RUN);
+    std::shared_ptr<testing::NiceMock<MockEngine>> mockEngine =
+            std::make_shared<testing::NiceMock<MockEngine>>();
+    std::unique_ptr<StreamManager> manager = SetupStreamManager(mockEngine);
+    manager->handleExecutionPhase(e);
+
+    // Probably not called
+    ON_CALL((*mockEngine), dispatchPacket)
+            .WillByDefault(
+                    testing::DoAll(testing::SaveArg<0>(&currentPacket), (Return(Status::SUCCESS))));
+
+    manager->queuePacket(fakeData, size, 0);
+
+    if (currentPacket) {
+        EXPECT_EQ(std::memcmp(currentPacket->getData(), fakeData, size), 0);
+        currentPacket = nullptr;
+    }
+
+    free(fakeData);
+    return 0;
+}
+
+}  // namespace
+}  // namespace stream_manager
+}  // namespace runner
+}  // namespace computepipe
+}  // namespace automotive
+}  // namespace android