1 /*
2  * Copyright (C) 2019 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_V1_3_GENERATED_TEST_HARNESS_H
18 #define ANDROID_HARDWARE_NEURALNETWORKS_V1_3_GENERATED_TEST_HARNESS_H
19 
20 #include <android/hardware/neuralnetworks/1.3/IDevice.h>
21 #include <android/hardware/neuralnetworks/1.3/IPreparedModel.h>
22 #include <android/hardware/neuralnetworks/1.3/types.h>
23 #include <functional>
24 #include <vector>
25 #include "1.0/Utils.h"
26 #include "TestHarness.h"
27 #include "VtsHalNeuralnetworks.h"
28 
29 namespace android::hardware::neuralnetworks::V1_3::vts::functional {
30 
31 using NamedModel = Named<const test_helper::TestModel*>;
32 using GeneratedTestParam = std::tuple<NamedDevice, NamedModel>;
33 
34 class GeneratedTestBase : public testing::TestWithParam<GeneratedTestParam> {
35   protected:
36     void SetUp() override;
37     const sp<IDevice> kDevice = getData(std::get<NamedDevice>(GetParam()));
38     const test_helper::TestModel& kTestModel = *getData(std::get<NamedModel>(GetParam()));
39 };
40 
41 using FilterFn = std::function<bool(const test_helper::TestModel&)>;
42 std::vector<NamedModel> getNamedModels(const FilterFn& filter);
43 
44 using FilterNameFn = std::function<bool(const std::string&)>;
45 std::vector<NamedModel> getNamedModels(const FilterNameFn& filter);
46 
47 std::string printGeneratedTest(const testing::TestParamInfo<GeneratedTestParam>& info);
48 
49 #define INSTANTIATE_GENERATED_TEST(TestSuite, filter)                                     \
50     INSTANTIATE_TEST_SUITE_P(TestGenerated, TestSuite,                                    \
51                              testing::Combine(testing::ValuesIn(getNamedDevices()),       \
52                                               testing::ValuesIn(getNamedModels(filter))), \
53                              printGeneratedTest)
54 
55 // Tag for the validation tests, instantiated in VtsHalNeuralnetworks.cpp.
56 // TODO: Clean up the hierarchy for ValidationTest.
57 class ValidationTest : public GeneratedTestBase {};
58 
59 Model createModel(const test_helper::TestModel& testModel);
60 
61 void PrepareModel(const sp<IDevice>& device, const Model& model, sp<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 sp<IDevice>& device, const sp<IPreparedModel>& preparedModel,
81                            const test_helper::TestModel& testModel, TestKind testKind);
82 
83 void waitForSyncFence(int syncFd);
84 
85 }  // namespace android::hardware::neuralnetworks::V1_3::vts::functional
86 
87 #endif  // ANDROID_HARDWARE_NEURALNETWORKS_V1_3_GENERATED_TEST_HARNESS_H
88