From ca46f9768c056dc52aa4ef3988cfaea155ed0dc5 Mon Sep 17 00:00:00 2001 From: Ian Hua Date: Fri, 15 Oct 2021 11:06:31 +0100 Subject: [PATCH] Add FL6 spec tests to AIDL VTS. Also skip FL6 (AIDL_V2) tests for older AIDL drivers. Bug: 203038813 Test: VtsHalNeuralnetworksTargetTest Specifically, for old driver such as AIDL_V1 sample driver, it can pass HIDL tests and skip AIDL_V2 tests. For new driver such as AIDL_V2 sample driver, it can pass all tests. Change-Id: I689fef0945428f6548977628e3c43628dd1e5bf7 --- .../aidl/utils/include/nnapi/hal/aidl/Utils.h | 2 +- neuralnetworks/aidl/vts/functional/Android.bp | 1 + .../aidl/vts/functional/GeneratedTestHarness.cpp | 14 ++++++++++++++ .../aidl/vts/functional/GeneratedTestHarness.h | 3 +++ .../aidl/vts/functional/ValidateModel.cpp | 6 ++++++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h index 3a45f8d3ea..f2ab479e43 100644 --- a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h +++ b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h @@ -28,7 +28,7 @@ namespace aidl::android::hardware::neuralnetworks::utils { constexpr auto kDefaultPriority = Priority::MEDIUM; -constexpr auto kVersion = nn::Version::ANDROID_S; +constexpr auto kVersion = nn::Version::FEATURE_LEVEL_6; template nn::Result validate(const Type& halObject) { diff --git a/neuralnetworks/aidl/vts/functional/Android.bp b/neuralnetworks/aidl/vts/functional/Android.bp index 4dc2ed0f8c..3558d12aa1 100644 --- a/neuralnetworks/aidl/vts/functional/Android.bp +++ b/neuralnetworks/aidl/vts/functional/Android.bp @@ -63,6 +63,7 @@ cc_test { "neuralnetworks_utils_hal_aidl", ], whole_static_libs: [ + "neuralnetworks_generated_AIDL_V2_example", "neuralnetworks_generated_V1_0_example", "neuralnetworks_generated_V1_1_example", "neuralnetworks_generated_V1_2_example", diff --git a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp index ac5b96a8a4..f67fd34383 100644 --- a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp @@ -907,6 +907,20 @@ void GeneratedTestBase::SetUp() { const bool deviceIsResponsive = ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); ASSERT_TRUE(deviceIsResponsive); + // TODO(b/201260787): We should require old drivers to report the model as + // unsupported instead of simply skipping the test. + SkipIfDriverOlderThanTestModel(); +} + +void GeneratedTestBase::SkipIfDriverOlderThanTestModel() { + int32_t deviceVersion; + ASSERT_TRUE(kDevice->getInterfaceVersion(&deviceVersion).isOk()); + const int32_t modelVersion = kTestModel.getAidlVersionInt(); + if (deviceVersion < modelVersion) { + GTEST_SKIP() << "Device interface version " << deviceVersion + << " is older than test model's minimum supported HAL version " << modelVersion + << ". Skipping test."; + } } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.h b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.h index ad40f06874..da74db962e 100644 --- a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.h +++ b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.h @@ -34,6 +34,9 @@ class GeneratedTestBase : public testing::TestWithParam { void SetUp() override; const std::shared_ptr kDevice = getData(std::get(GetParam())); const test_helper::TestModel& kTestModel = *getData(std::get(GetParam())); + + private: + void SkipIfDriverOlderThanTestModel(); }; using FilterFn = std::function; diff --git a/neuralnetworks/aidl/vts/functional/ValidateModel.cpp b/neuralnetworks/aidl/vts/functional/ValidateModel.cpp index 3f3e2250c6..fdc7eff96f 100644 --- a/neuralnetworks/aidl/vts/functional/ValidateModel.cpp +++ b/neuralnetworks/aidl/vts/functional/ValidateModel.cpp @@ -1122,6 +1122,7 @@ static bool removeOperationInputSkip(const Operation& op, size_t input) { // align_corners and half_pixel_centers parameters. // - L2_NORMALIZATION, LOCAL_RESPONSE_NORMALIZATION, SOFTMAX can have an optional axis // parameter. + // - PACK has at least 2 inputs, with the first element being INT32. switch (op.type) { case OperationType::CONCATENATION: { if (op.inputs.size() > 2 && input != op.inputs.size() - 1) { @@ -1178,6 +1179,11 @@ static bool removeOperationInputSkip(const Operation& op, size_t input) { return true; } } break; + case OperationType::PACK: { + if (op.inputs.size() > 2 && input != 0) { + return true; + } + } break; default: break; }