1 /*
2  * Copyright (C) 2021 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 #ifndef ANDROID_HARDWARE_NEURALNETWORKS_AIDL_GENERATED_TEST_HARNESS_H
18 #define ANDROID_HARDWARE_NEURALNETWORKS_AIDL_GENERATED_TEST_HARNESS_H
19 
20 #include <functional>
21 #include <vector>
22 
23 #include <TestHarness.h>
24 #include "Utils.h"
25 #include "VtsHalNeuralnetworks.h"
26 
27 namespace aidl::android::hardware::neuralnetworks::vts::functional {
28 
29 using NamedModel = Named<const test_helper::TestModel*>;
30 using GeneratedTestParam = std::tuple<NamedDevice, NamedModel>;
31 
32 class GeneratedTestBase : public testing::TestWithParam<GeneratedTestParam> {
33   protected:
34     void SetUp() override;
35     const std::shared_ptr<IDevice> kDevice = getData(std::get<NamedDevice>(GetParam()));
36     const test_helper::TestModel& kTestModel = *getData(std::get<NamedModel>(GetParam()));
37 };
38 
39 using FilterFn = std::function<bool(const test_helper::TestModel&)>;
40 std::vector<NamedModel> getNamedModels(const FilterFn& filter);
41 
42 using FilterNameFn = std::function<bool(const std::string&)>;
43 std::vector<NamedModel> getNamedModels(const FilterNameFn& filter);
44 
45 std::string printGeneratedTest(const testing::TestParamInfo<GeneratedTestParam>& info);
46 
47 #define INSTANTIATE_GENERATED_TEST(TestSuite, filter)                                     \
48     GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TestSuite);                             \
49     INSTANTIATE_TEST_SUITE_P(TestGenerated, TestSuite,                                    \
50                              testing::Combine(testing::ValuesIn(getNamedDevices()),       \
51                                               testing::ValuesIn(getNamedModels(filter))), \
52                              printGeneratedTest)
53 
54 // Tag for the validation tests, instantiated in VtsHalNeuralnetworks.cpp.
55 // TODO: Clean up the hierarchy for ValidationTest.
56 class ValidationTest : public GeneratedTestBase {};
57 
58 Model createModel(const test_helper::TestModel& testModel);
59 
60 void PrepareModel(const std::shared_ptr<IDevice>& device, const Model& model,
61                   std::shared_ptr<IPreparedModel>* preparedModel);
62 
63 enum class TestKind {
64     // Runs a test model and compares the results to a golden data
65     GENERAL,
66     // Same as GENERAL but sets dimensions for the output tensors to zeros
67     DYNAMIC_SHAPE,
68     // Same as GENERAL but use device memories for inputs and outputs
69     MEMORY_DOMAIN,
70     // Same as GENERAL but use executeFenced for exeuction
71     FENCED_COMPUTE,
72     // Tests if quantized model with TENSOR_QUANT8_ASYMM produces the same result
73     // (OK/SKIPPED/FAILED) as the model with all such tensors converted to
74     // TENSOR_QUANT8_ASYMM_SIGNED.
75     QUANTIZATION_COUPLING,
76     // Runs a test model and verifies that MISSED_DEADLINE_* is returned.
77     INTINITE_LOOP_TIMEOUT
78 };
79 
80 void EvaluatePreparedModel(const std::shared_ptr<IDevice>& device,
81                            const std::shared_ptr<IPreparedModel>& preparedModel,
82                            const test_helper::TestModel& testModel, TestKind testKind);
83 
84 void waitForSyncFence(int syncFd);
85 
86 }  // namespace aidl::android::hardware::neuralnetworks::vts::functional
87 
88 #endif  // ANDROID_HARDWARE_NEURALNETWORKS_AIDL_GENERATED_TEST_HARNESS_H
89