From 068de276f060ad133869d8e063298146235b031a Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Sat, 3 Jul 2021 00:49:13 +0000 Subject: [PATCH 01/39] audio: Fix handling of relative XML include paths in VTS Pass "no fixup base dirs" flag to the XInclude processor to avoid modifications of the top-level elements from included XML files as a result of "fixup." Added tests to ensure that all relevant XInclude scenarios work. Bug: 192619060 Test: atest -host android.hardware.audio.common.test.utility_tests Change-Id: Id595c9fd30be378d76387ee55a8937e0bf28d1cd (cherry picked from commit 13c679652834db45e2df4137f088ecd06351f017) Merged-In: Id595c9fd30be378d76387ee55a8937e0bf28d1cd --- .../all-versions/test/utility/Android.bp | 31 ++- .../all-versions/test/utility/TEST_MAPPING | 7 + .../test/utility/src/ValidateXml.cpp | 3 +- .../test/utility/tests/utility_tests.cpp | 176 ++++++++++++++++++ 4 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 audio/common/all-versions/test/utility/TEST_MAPPING create mode 100644 audio/common/all-versions/test/utility/tests/utility_tests.cpp diff --git a/audio/common/all-versions/test/utility/Android.bp b/audio/common/all-versions/test/utility/Android.bp index 1602d25b2f..757f8a853d 100644 --- a/audio/common/all-versions/test/utility/Android.bp +++ b/audio/common/all-versions/test/utility/Android.bp @@ -25,7 +25,7 @@ package { cc_library_static { name: "android.hardware.audio.common.test.utility", - defaults : ["hidl_defaults"], + defaults: ["hidl_defaults"], srcs: ["src/ValidateXml.cpp"], cflags: [ "-O0", @@ -34,7 +34,34 @@ cc_library_static { ], local_include_dirs: ["include/utility"], export_include_dirs: ["include"], - shared_libs: ["libxml2", "liblog"], + shared_libs: [ + "libxml2", + "liblog", + ], static_libs: ["libgtest"], export_static_lib_headers: ["libgtest"], } + +// Note: this isn't a VTS test, but rather a unit test +// to verify correctness of test utilities. +cc_test { + name: "android.hardware.audio.common.test.utility_tests", + host_supported: true, + local_include_dirs: ["include/utility"], + srcs: [ + "src/ValidateXml.cpp", + "tests/utility_tests.cpp", + ], + cflags: [ + "-Werror", + "-Wall", + "-g", + ], + shared_libs: [ + "libbase", + "libxml2", + "liblog", + ], + static_libs: ["libgtest"], + test_suites: ["general-tests"], +} diff --git a/audio/common/all-versions/test/utility/TEST_MAPPING b/audio/common/all-versions/test/utility/TEST_MAPPING new file mode 100644 index 0000000000..0bc187157a --- /dev/null +++ b/audio/common/all-versions/test/utility/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "android.hardware.audio.common.test.utility_tests" + } + ] +} diff --git a/audio/common/all-versions/test/utility/src/ValidateXml.cpp b/audio/common/all-versions/test/utility/src/ValidateXml.cpp index a866104b38..f111c011d9 100644 --- a/audio/common/all-versions/test/utility/src/ValidateXml.cpp +++ b/audio/common/all-versions/test/utility/src/ValidateXml.cpp @@ -112,7 +112,8 @@ struct Libxml2Global { return ::testing::AssertionFailure() << "Failed to parse xml\n" << context(); } - if (xmlXIncludeProcess(doc.get()) == -1) { + // Process 'include' directives w/o modifying elements loaded from included files. + if (xmlXIncludeProcessFlags(doc.get(), XML_PARSE_NOBASEFIX) == -1) { return ::testing::AssertionFailure() << "Failed to resolve xincludes in xml\n" << context(); } diff --git a/audio/common/all-versions/test/utility/tests/utility_tests.cpp b/audio/common/all-versions/test/utility/tests/utility_tests.cpp new file mode 100644 index 0000000000..c52306638f --- /dev/null +++ b/audio/common/all-versions/test/utility/tests/utility_tests.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2021 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 +#include + +#include + +using ::android::hardware::audio::common::test::utility::validateXml; + +const char* XSD_SOURCE = + "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +const char* INVALID_XML_SOURCE = + "" + ""; + +const char* VALID_XML_SOURCE = + "" + "" + " " + " " + " %s" + " " + ""; + +const char* MODULE_SOURCE = ""; + +const char* XI_INCLUDE = ""; + +const char* XML_INCLUDED_SOURCE = "%s"; + +namespace { + +std::string substitute(const char* fmt, const char* param) { + std::string buffer(static_cast(strlen(fmt) + strlen(param)), '\0'); + snprintf(buffer.data(), buffer.size(), fmt, param); + return buffer; +} + +std::string substitute(const char* fmt, const std::string& s) { + return substitute(fmt, s.c_str()); +} + +} // namespace + +TEST(ValidateXml, InvalidXml) { + TemporaryFile xml; + ASSERT_TRUE(android::base::WriteStringToFile(INVALID_XML_SOURCE, xml.path)) << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_FALSE(validateXml("xml", "xsd", xml.path, xsd.path)); +} + +TEST(ValidateXml, ValidXml) { + TemporaryFile xml; + ASSERT_TRUE( + android::base::WriteStringToFile(substitute(VALID_XML_SOURCE, MODULE_SOURCE), xml.path)) + << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_TRUE(validateXml("xml", "xsd", xml.path, xsd.path)); +} + +TEST(ValidateXml, IncludeAbsolutePath) { + TemporaryFile xmlInclude; + ASSERT_TRUE(android::base::WriteStringToFile(substitute(XML_INCLUDED_SOURCE, MODULE_SOURCE), + xmlInclude.path)) + << strerror(errno); + TemporaryFile xml; + ASSERT_TRUE(android::base::WriteStringToFile( + substitute(VALID_XML_SOURCE, substitute(XI_INCLUDE, xmlInclude.path)), xml.path)) + << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_TRUE(validateXml("xml", "xsd", xml.path, xsd.path)); +} + +TEST(ValidateXml, IncludeSameDirRelativePath) { + TemporaryFile xmlInclude; + ASSERT_TRUE(android::base::WriteStringToFile(substitute(XML_INCLUDED_SOURCE, MODULE_SOURCE), + xmlInclude.path)) + << strerror(errno); + TemporaryFile xml; + ASSERT_EQ(android::base::Dirname(xml.path), android::base::Dirname(xmlInclude.path)); + ASSERT_TRUE(android::base::WriteStringToFile( + substitute(VALID_XML_SOURCE, + substitute(XI_INCLUDE, android::base::Basename(xmlInclude.path))), + xml.path)) + << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_TRUE(validateXml("xml", "xsd", xml.path, xsd.path)); +} + +TEST(ValidateXml, IncludeSubdirRelativePath) { + TemporaryDir xmlIncludeDir; + TemporaryFile xmlInclude(xmlIncludeDir.path); + ASSERT_TRUE(android::base::WriteStringToFile(substitute(XML_INCLUDED_SOURCE, MODULE_SOURCE), + xmlInclude.path)) + << strerror(errno); + TemporaryFile xml; + ASSERT_EQ(android::base::Dirname(xml.path), android::base::Dirname(xmlIncludeDir.path)); + ASSERT_TRUE(android::base::WriteStringToFile( + substitute(VALID_XML_SOURCE, + substitute(XI_INCLUDE, android::base::Basename(xmlIncludeDir.path) + "/" + + android::base::Basename(xmlInclude.path))), + xml.path)) + << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_TRUE(validateXml("xml", "xsd", xml.path, xsd.path)); +} + +TEST(ValidateXml, IncludeParentDirRelativePath) { + // An XML file from a subdirectory includes a file from the parent directory using '..' syntax. + TemporaryFile xmlInclude; + ASSERT_TRUE(android::base::WriteStringToFile(substitute(XML_INCLUDED_SOURCE, MODULE_SOURCE), + xmlInclude.path)) + << strerror(errno); + TemporaryDir xmlIncludeDir; + TemporaryFile xmlParentInclude(xmlIncludeDir.path); + ASSERT_TRUE(android::base::WriteStringToFile( + substitute(XML_INCLUDED_SOURCE, + substitute(XI_INCLUDE, "../" + android::base::Basename(xmlInclude.path))), + xmlParentInclude.path)) + << strerror(errno); + TemporaryFile xml; + ASSERT_EQ(android::base::Dirname(xml.path), android::base::Dirname(xmlInclude.path)); + ASSERT_EQ(android::base::Dirname(xml.path), android::base::Dirname(xmlIncludeDir.path)); + ASSERT_TRUE(android::base::WriteStringToFile( + substitute( + VALID_XML_SOURCE, + substitute(XI_INCLUDE, android::base::Basename(xmlIncludeDir.path) + "/" + + android::base::Basename(xmlParentInclude.path))), + xml.path)) + << strerror(errno); + TemporaryFile xsd; + ASSERT_TRUE(android::base::WriteStringToFile(XSD_SOURCE, xsd.path)) << strerror(errno); + EXPECT_TRUE(validateXml("xml", "xsd", xml.path, xsd.path)); +} From d11628ec782e89fda6dbba4c079a136ce1de6478 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Mon, 19 Jul 2021 22:58:02 +0000 Subject: [PATCH 02/39] Audio VTS: Make the active microphone query test more robust in V7 Prior to V7 the test which exercises IStreamIn.getActiveMicrophones was using a hardcoded configuration for the input stream. This configuration no longer works for some of new devices. To fix that, the part of the test which calls getActiveMicrophones has been moved into a separate test--a descendant of InputStreamTest which is parametrized using the actual configuration of the DUT. Tests for HAL versions prior to V7 are not affected because they don't use a full parser for the DUT config. Bug: 193849687 Test: atest VtsHalAudioV7_0TargetTest Change-Id: I00fe8fedb6bfc6e034387b35c88f954cb2638dfa (cherry picked from commit e4ce86bfb7bd81eea39da5d76dbf796e2c1dbe1d) Merged-In: I00fe8fedb6bfc6e034387b35c88f954cb2638dfa --- .../4.0/AudioPrimaryHidlHalTest.cpp | 23 ++----- .../7.0/AudioPrimaryHidlHalTest.cpp | 61 +++++++++++++++++++ 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp b/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp index b96cc83673..28bcd0b713 100644 --- a/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp @@ -53,6 +53,11 @@ TEST_P(AudioHidlDeviceTest, GetMicrophonesTest) { GTEST_SKIP() << "getMicrophones is not supported"; // returns } ASSERT_OK(res); + +#if MAJOR_VERSION <= 6 + // In V7, 'getActiveMicrophones' is tested by the 'MicrophoneInfoInputStream' + // test which uses the actual configuration of the device. + if (microphones.size() > 0) { // When there is microphone on the phone, try to open an input stream // and query for the active microphones. @@ -60,30 +65,13 @@ TEST_P(AudioHidlDeviceTest, GetMicrophonesTest) { "Make sure getMicrophones always succeeds" "and getActiveMicrophones always succeeds when recording from these microphones."); AudioConfig config{}; -#if MAJOR_VERSION <= 6 config.channelMask = mkEnumBitfield(AudioChannelMask::IN_MONO); config.sampleRateHz = 8000; config.format = AudioFormat::PCM_16_BIT; auto flags = hidl_bitfield(AudioInputFlag::NONE); const SinkMetadata initMetadata = {{{.source = AudioSource::MIC, .gain = 1}}}; -#elif MAJOR_VERSION >= 7 - config.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_IN_MONO); - config.base.sampleRateHz = 8000; - config.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); - hidl_vec flags; - const SinkMetadata initMetadata = { - {{.source = toString(xsd::AudioSource::AUDIO_SOURCE_MIC), - .gain = 1, - .tags = {}, - .channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_IN_MONO)}}}; -#endif for (auto microphone : microphones) { -#if MAJOR_VERSION <= 6 if (microphone.deviceAddress.device != AudioDevice::IN_BUILTIN_MIC) { -#elif MAJOR_VERSION >= 7 - if (xsd::stringToAudioDevice(microphone.deviceAddress.deviceType) != - xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC) { -#endif continue; } sp stream; @@ -106,6 +94,7 @@ TEST_P(AudioHidlDeviceTest, GetMicrophonesTest) { EXPECT_NE(0U, activeMicrophones.size()); } } +#endif // MAJOR_VERSION <= 6 } TEST_P(AudioHidlDeviceTest, SetConnectedState) { diff --git a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp index 0b3098b872..0cc6a5b964 100644 --- a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp @@ -839,3 +839,64 @@ INSTANTIATE_TEST_CASE_P(PcmOnlyConfigInputStream, PcmOnlyConfigInputStreamTest, ::testing::ValuesIn(getInputDevicePcmOnlyConfigParameters()), &DeviceConfigParameterToString); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PcmOnlyConfigInputStreamTest); + +static const std::vector& getBuiltinMicConfigParameters() { + static const std::vector parameters = [] { + auto allParams = getInputDeviceConfigParameters(); + std::vector builtinMicParams; + std::copy_if(allParams.begin(), allParams.end(), std::back_inserter(builtinMicParams), + [](auto cfg) { + // The built in mic may participate in various scenarios: + // FAST, HW_HOTWORD, MMAP NOIRQ, which are indicated by flags. + // We are only interested in testing the simplest scenario w/o any flags. + if (!std::get(cfg).empty()) return false; + auto maybeSourceDevice = getCachedPolicyConfig().getSourceDeviceForMixPort( + std::get(std::get(cfg)), + std::get(cfg)); + return maybeSourceDevice.has_value() && + xsd::stringToAudioDevice(maybeSourceDevice.value().deviceType) == + xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC; + }); + return builtinMicParams; + }(); + return parameters; +} + +class MicrophoneInfoInputStreamTest : public InputStreamTest {}; + +TEST_P(MicrophoneInfoInputStreamTest, GetActiveMicrophones) { + doc::test( + "Make sure getActiveMicrophones always succeeds when recording " + "from the built-in microphone."); + hidl_vec microphones; + ASSERT_OK(getDevice()->getMicrophones(returnIn(res, microphones))); + if (res == Result::NOT_SUPPORTED) { + GTEST_SKIP() << "getMicrophones is not supported"; // returns + } + ASSERT_OK(res); + + auto maybeSourceAddress = + getCachedPolicyConfig().getSourceDeviceForMixPort(getDeviceName(), getMixPortName()); + ASSERT_TRUE(maybeSourceAddress.has_value()) + << "No source device found for mix port " << getMixPortName() << " (module " + << getDeviceName() << ")"; + + for (auto microphone : microphones) { + if (microphone.deviceAddress == maybeSourceAddress.value()) { + StreamReader reader(stream.get(), stream->getBufferSize()); + ASSERT_TRUE(reader.start()); + reader.pause(); // This ensures that at least one read has happened. + EXPECT_FALSE(reader.hasError()); + + hidl_vec activeMicrophones; + ASSERT_OK(stream->getActiveMicrophones(returnIn(res, activeMicrophones))); + ASSERT_OK(res); + EXPECT_NE(0U, activeMicrophones.size()); + } + } +} + +INSTANTIATE_TEST_CASE_P(MicrophoneInfoInputStream, MicrophoneInfoInputStreamTest, + ::testing::ValuesIn(getBuiltinMicConfigParameters()), + &DeviceConfigParameterToString); +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MicrophoneInfoInputStreamTest); From 9faa583bf37d6e3fbf50890a86eab2b2185a32a9 Mon Sep 17 00:00:00 2001 From: Kuowei Li Date: Mon, 12 Jul 2021 14:32:48 +0800 Subject: [PATCH 03/39] audio: Allow SetAudioProperties to not be supported The parameter of sample rate, channel mask and format is not mandatory to support by Audio HAL. At meantime, there is no corresponding handle in framework. Hence, SetAudioProperties should allow reporting not supported. Bug: 194368657 Test: run vts -m VtsHalAudioV7_0Target Change-Id: Id0505bfb5d4812dd4c5d31a6e9d72c4c9c0cffa2 Merged-In: Id0505bfb5d4812dd4c5d31a6e9d72c4c9c0cffa2 --- .../core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h b/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h index aa7fd8e857..340903a4ea 100644 --- a/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h +++ b/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h @@ -1390,6 +1390,9 @@ static void testSetAudioProperties(IStream* stream) { config.channelMask.value(channelMask); auto ret = stream->setAudioProperties(config); EXPECT_TRUE(ret.isOk()); + if (ret == Result::NOT_SUPPORTED) { + GTEST_SKIP() << "setAudioProperties is not supported"; + } EXPECT_EQ(Result::OK, ret) << profile.format << "; " << sampleRate << "; " << channelMask; } From eb8b0577e87ac19fce7c307b542fa9406857d48a Mon Sep 17 00:00:00 2001 From: Max Bires Date: Fri, 23 Jul 2021 01:26:00 -0700 Subject: [PATCH 04/39] AesInvalidKeySize skip 192 on SB devices This change clarifies the language to specify that StrongBox devices must only support key sizes of 128 and 256. Additionally, it changes the new AesInvalidKeySize test to only enforce against StrongBox instances on devices that launch on S or later, not previously launched devices. Ignore-AOSP-First: CP to AOSP Bug: 191736606 Test: Test passes on a StrongBox enabled device Change-Id: I1a27a0d61e5247ad90c8f5b1423f2a1567016bac --- keymaster/4.0/vts/functional/KeymasterHidlTest.cpp | 4 ++++ .../android/hardware/security/keymint/IKeyMintDevice.aidl | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp b/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp index d0ad433464..d326334510 100644 --- a/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp +++ b/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -685,6 +686,9 @@ std::vector KeymasterHidlTest::InvalidKeySizes(Algorithm algorithm) { case Algorithm::EC: return {224, 384, 521}; case Algorithm::AES: + // The HAL language was clarified to exclude AES key sizes of 192 for StrongBox + // instances on devices launched on API Level 31 and above. + if (property_get_int32("ro.board.first_api_level", 0) < 31) return {}; return {192}; default: return {}; diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl index 2241735928..4e81e71826 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl @@ -96,7 +96,8 @@ import android.hardware.security.secureclock.TimeStampToken; * * o AES * - * - 128 and 256-bit keys + * - TRUSTED_ENVIRONMENT IKeyMintDevices must support 128, 192 and 256-bit keys. + * STRONGBOX IKeyMintDevices must only support 128 and 256-bit keys. * - CBC, CTR, ECB and GCM modes. The GCM mode must not allow the use of tags smaller than 96 * bits or nonce lengths other than 96 bits. * - CBC and ECB modes must support unpadded and PKCS7 padding modes. With no padding CBC and From 37f63ed771ca2f4d02ac0625b0129c80549704fc Mon Sep 17 00:00:00 2001 From: Shinru Han Date: Tue, 10 Aug 2021 16:53:17 +0800 Subject: [PATCH 05/39] Allow negative value for CorrelationVector#samplingStartM Bug: 195934893 Test: on cuttlefish Change-Id: Ief1514c8d8e48c9c3f13b93c3d2c355a508a84a7 --- gnss/aidl/vts/gnss_hal_test_cases.cpp | 1 - gnss/common/utils/default/Utils.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp index 5964f815a8..b484f9c383 100644 --- a/gnss/aidl/vts/gnss_hal_test_cases.cpp +++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp @@ -252,7 +252,6 @@ TEST_P(GnssHalTest, TestCorrelationVector) { for (const auto& correlationVector : measurement.correlationVectors) { ASSERT_GE(correlationVector.frequencyOffsetMps, 0); ASSERT_GT(correlationVector.samplingWidthM, 0); - ASSERT_GE(correlationVector.samplingStartM, 0); ASSERT_TRUE(correlationVector.magnitude.size() > 0); for (const auto& magnitude : correlationVector.magnitude) { ASSERT_TRUE(magnitude >= -32768 && magnitude <= 32767); diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp index d136448ed9..23e39b26ec 100644 --- a/gnss/common/utils/default/Utils.cpp +++ b/gnss/common/utils/default/Utils.cpp @@ -221,7 +221,7 @@ GnssData Utils::getMockMeasurement(const bool enableCorrVecOutputs) { aidl::android::hardware::gnss::CorrelationVector correlationVector2 = { .frequencyOffsetMps = 20, .samplingWidthM = 30, - .samplingStartM = 0, + .samplingStartM = -10, .magnitude = {0, 3000, 5000, 3000, 0, 0, 1000, 0}}; measurement.correlationVectors = {correlationVector1, correlationVector2}; measurement.flags |= GnssMeasurement::HAS_CORRELATION_VECTOR; From 1cc416882f2b200636c1e6bb87b09f00623f8762 Mon Sep 17 00:00:00 2001 From: David Drysdale Date: Thu, 5 Aug 2021 07:50:23 +0100 Subject: [PATCH 06/39] KeyMint VTS: catch empty cert chains Explicitly detect empty cert chains returned by GenerateKey rather than crashing when trying to dereference the first entry. Bug: 195605180 Test: VtsAidlKeyMintTargetTest Merged-In: Idad2703b458952ff599c6ccdd04a941aef7aedde Change-Id: Idad2703b458952ff599c6ccdd04a941aef7aedde Ignore-AOSP-First: already merged in aosp/master --- security/keymint/aidl/vts/functional/AttestKeyTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp index a3127237ac..26ed34427c 100644 --- a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp +++ b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp @@ -312,6 +312,7 @@ TEST_P(AttestKeyTest, RsaAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); @@ -383,6 +384,7 @@ TEST_P(AttestKeyTest, EcAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); @@ -471,6 +473,7 @@ TEST_P(AttestKeyTest, AlternateAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); From 7f8fb92524cee19cd8a0ce959ddfb7794846b4f0 Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Wed, 4 Nov 2020 11:50:41 -0800 Subject: [PATCH 07/39] omx: validate only standard OMX roles Test uses ::android::GetComponentRole to get OMX role for media type that only supports standard types (on GSI where VTS is run). Bug: 164550113 Bug: 171536493 Bug: 194827876 Test: atest VtsHalMediaOmxV1_0TargetStoreTest Change-Id: Ia9e64c8d887518f6c7d8c650a942bad7ce3457f0 --- .../store/VtsHalMediaOmxV1_0TargetStoreTest.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/media/omx/1.0/vts/functional/store/VtsHalMediaOmxV1_0TargetStoreTest.cpp b/media/omx/1.0/vts/functional/store/VtsHalMediaOmxV1_0TargetStoreTest.cpp index e73196cfb2..8699de3eb8 100644 --- a/media/omx/1.0/vts/functional/store/VtsHalMediaOmxV1_0TargetStoreTest.cpp +++ b/media/omx/1.0/vts/functional/store/VtsHalMediaOmxV1_0TargetStoreTest.cpp @@ -264,11 +264,13 @@ TEST_P(StoreHidlTest, ListRoles) { // Make sure role name follows expected format based on type and // isEncoder - const std::string role_name( - ::android::GetComponentRole(role.isEncoder, role.type.c_str())); - EXPECT_EQ(role_name, role.role) << "Role \"" << role.role << "\" does not match " - << (role.isEncoder ? "an encoder " : "a decoder ") - << "for mime type \"" << role.type << "."; + const char* role_name = ::android::GetComponentRole(role.isEncoder, role.type.c_str()); + if (role_name != nullptr) { + EXPECT_EQ(std::string(role_name), role.role) + << "Role \"" << role.role << "\" does not match " + << (role.isEncoder ? "an encoder " : "a decoder ") << "for media type \"" + << role.type << "."; + } // Check the nodes for this role std::set nodeKeys; From 0224cfe3e0ae9cfe4fce43aa1c787325db2b354a Mon Sep 17 00:00:00 2001 From: Max Bires Date: Tue, 17 Aug 2021 14:25:57 +0000 Subject: [PATCH 08/39] Revert "AesInvalidKeySize skip 192 on SB devices" This reverts commit eb8b0577e87ac19fce7c307b542fa9406857d48a. Reason for revert: Broke a different TEE implementation Bug: 196922051 Change-Id: I9f136d237bd06bfe2a1cc29d11bb1fbe0b8ace5e --- keymaster/4.0/vts/functional/KeymasterHidlTest.cpp | 4 ---- .../android/hardware/security/keymint/IKeyMintDevice.aidl | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp b/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp index d326334510..d0ad433464 100644 --- a/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp +++ b/keymaster/4.0/vts/functional/KeymasterHidlTest.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -686,9 +685,6 @@ std::vector KeymasterHidlTest::InvalidKeySizes(Algorithm algorithm) { case Algorithm::EC: return {224, 384, 521}; case Algorithm::AES: - // The HAL language was clarified to exclude AES key sizes of 192 for StrongBox - // instances on devices launched on API Level 31 and above. - if (property_get_int32("ro.board.first_api_level", 0) < 31) return {}; return {192}; default: return {}; diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl index 4e81e71826..2241735928 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl @@ -96,8 +96,7 @@ import android.hardware.security.secureclock.TimeStampToken; * * o AES * - * - TRUSTED_ENVIRONMENT IKeyMintDevices must support 128, 192 and 256-bit keys. - * STRONGBOX IKeyMintDevices must only support 128 and 256-bit keys. + * - 128 and 256-bit keys * - CBC, CTR, ECB and GCM modes. The GCM mode must not allow the use of tags smaller than 96 * bits or nonce lengths other than 96 bits. * - CBC and ECB modes must support unpadded and PKCS7 padding modes. With no padding CBC and From 5b7f78d43b7c27aad35278b1a172b7dae4327728 Mon Sep 17 00:00:00 2001 From: Max Bires Date: Fri, 23 Jul 2021 01:26:00 -0700 Subject: [PATCH 09/39] AesInvalidKeySize skip 192 on SB devices This change clarifies the language to specify that StrongBox devices must only support key sizes of 128 and 256. Additionally, it changes the new AesInvalidKeySize test to only enforce against StrongBox instances on devices that launch on S or later, not previously launched devices. Ignore-AOSP-First: CP to AOSP Bug: 191736606 Test: Test passes on a StrongBox enabled device Change-Id: Ic0ff19d2d19d6e18dfbc0fad4b8182264f36b2f6 --- keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp | 4 ++++ .../android/hardware/security/keymint/IKeyMintDevice.aidl | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp index 01c502c586..ae5f2fe7c9 100644 --- a/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp +++ b/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp @@ -940,7 +940,11 @@ TEST_P(NewKeyGenerationTest, HmacDigestNone) { * UNSUPPORTED_KEY_SIZE. */ TEST_P(NewKeyGenerationTest, AesInvalidKeySize) { + int32_t firstApiLevel = property_get_int32("ro.board.first_api_level", 0); for (auto key_size : InvalidKeySizes(Algorithm::AES)) { + if (key_size == 192 && SecLevel() == SecurityLevel::STRONGBOX && firstApiLevel < 31) { + continue; + } ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE, GenerateKey(AuthorizationSetBuilder() .Authorization(TAG_NO_AUTH_REQUIRED) diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl index 2241735928..4e81e71826 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl @@ -96,7 +96,8 @@ import android.hardware.security.secureclock.TimeStampToken; * * o AES * - * - 128 and 256-bit keys + * - TRUSTED_ENVIRONMENT IKeyMintDevices must support 128, 192 and 256-bit keys. + * STRONGBOX IKeyMintDevices must only support 128 and 256-bit keys. * - CBC, CTR, ECB and GCM modes. The GCM mode must not allow the use of tags smaller than 96 * bits or nonce lengths other than 96 bits. * - CBC and ECB modes must support unpadded and PKCS7 padding modes. With no padding CBC and From ca76a750968efb61f61718acdf5e0e9a84bc6962 Mon Sep 17 00:00:00 2001 From: David Drysdale Date: Wed, 18 Aug 2021 16:45:50 +0100 Subject: [PATCH 10/39] KeyMint VTS: add missing purpose/algo Test was producing an invalid set of parameters in a different way than intended. Bug: 197222749 Test: VtsAidlKeyMintTargetTest Merged-In: I07f706fec81d91e8eee9c0561428142559c54f12 Change-Id: I07f706fec81d91e8eee9c0561428142559c54f12 Ignore-AOSP-First: this is a manual cross-merge --- security/keymint/aidl/vts/functional/KeyMintTest.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp index 5a87b83854..22988c4999 100644 --- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp +++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp @@ -1837,12 +1837,13 @@ TEST_P(NewKeyGenerationTest, EcdsaMismatchKeySize) { if (SecLevel() == SecurityLevel::STRONGBOX) return; auto result = GenerateKey(AuthorizationSetBuilder() + .Authorization(TAG_ALGORITHM, Algorithm::EC) .Authorization(TAG_KEY_SIZE, 224) .Authorization(TAG_EC_CURVE, EcCurve::P_256) + .SigningKey() .Digest(Digest::NONE) .SetDefaultValidity()); - ASSERT_TRUE(result == ErrorCode::INVALID_ARGUMENT || - result == ErrorCode::UNSUPPORTED_ALGORITHM); + ASSERT_TRUE(result == ErrorCode::INVALID_ARGUMENT); } /* From 52799bd05d53e287449d725be81ccd81dc50d6c4 Mon Sep 17 00:00:00 2001 From: Ashutosh Agarwal Date: Wed, 4 Aug 2021 21:09:18 +0000 Subject: [PATCH 11/39] Update Documentation for EPOCH_TIME. This is a change in behaviour for EPOCH_TIME to align it with a future revisions. Bug: 157504928 Test: atest CarServicesTest Test: atest VehiclePropertyIdsTest Change-Id: I81881a03a1a562afc93cb1a2fe8a8fffa43f093d --- .../default/impl/vhal_v2_0/DefaultConfig.h | 2 +- automotive/vehicle/2.0/types.hal | 28 +++++++++++++------ current.txt | 1 + 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h index f09d75ba21..8ff492471d 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h @@ -1025,7 +1025,7 @@ const ConfigDeclaration kVehicleProperties[]{ .config = { .prop = toInt(VehicleProperty::EPOCH_TIME), - .access = VehiclePropertyAccess::READ_WRITE, + .access = VehiclePropertyAccess::WRITE, .changeMode = VehiclePropertyChangeMode::ON_CHANGE, }, }, diff --git a/automotive/vehicle/2.0/types.hal b/automotive/vehicle/2.0/types.hal index 6bfda32983..b964991b9c 100644 --- a/automotive/vehicle/2.0/types.hal +++ b/automotive/vehicle/2.0/types.hal @@ -1433,17 +1433,29 @@ enum VehicleProperty : int32_t { * This value denotes the number of milliseconds seconds that have * elapsed since 1/1/1970 UTC. * - * Reading this value will give you the system’s time. This can be - * useful to synchronize other vehicle systems (dash clock etc). + * AAOS will write to this value to give VHAL the Android system's time, + * if the VHAL supports this property. This can be useful to synchronize + * other vehicle systems (dash clock etc) with Android's time. * - * Writing this value will update the ‘ExternalTimeSuggestion’ - * value (if enabled). This value may be consumed by the “Time - * Detector Service”, if other sources do not have a higher - * priority. For information on how to adjust time source - * priorities see Time Detector Service documentation. + * AAOS writes to this property once during boot, and + * will thereafter write only when some time-source changes are propagated. + * AAOS will fill in VehiclePropValue.timestamp correctly. + * Note that AAOS will not send updates for natural elapse of time. + * int64Values[0] = provided Unix time (in milliseconds) + * + * Note that the property may take >0 ms to get propagated through the stack + * and, having a timestamped property helps reduce any time drift. So, + * for all writes to the property, the timestamp can be used to negate this + * drift: + * drift = currentTimeMillis - PropValue.timestamp + * effectiveTime = PropValue.value.int64Values[0] + diff + * + * Aside, this property could have been better named ANDROID_EPOCH_TIME, but it + * continues to be called EPOCH_TIME for legacy reasons. We will try to fix + * this naming discrepancy when we migrate to AIDL. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ_WRITE + * @access VehiclePropertyAccess:WRITE_ONLY * @unit VehicleUnit:MILLI_SECS */ EPOCH_TIME = ( diff --git a/current.txt b/current.txt index 8c631d9e70..e70aef0c57 100644 --- a/current.txt +++ b/current.txt @@ -898,5 +898,6 @@ ea465970e96d9605ee6f6706b3b512726c66d2644738added9128c739f8f8b0c android.hardwar c8a57364f6ad20842be14f4db284df5304f7521ca8eac6bcc1fa6c5b466fb8a6 android.hardware.wifi.supplicant@1.4::ISupplicantStaNetwork 2123482b69f3b531c88023aa2a007110e130efbf4ed68ac9ce0bc55d5e82bc8b android.hardware.wifi.supplicant@1.4::ISupplicantStaNetworkCallback 0821f516e4d428bc15251969f7e19411c94d8f2ccbd99e1fc8168d8e49e38b0f android.hardware.wifi.supplicant@1.4::types +4a087a308608d146b022ebc15633de989f5f4dfe1491a83fa41763290a82e40d android.hardware.automotive.vehicle@2.0::types # There should be no more HIDL HALs - please use AIDL instead. From 84a19f64f5fd2786a96b85fc5db88c1be82b6b0c Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Wed, 18 Aug 2021 08:49:49 -0700 Subject: [PATCH 12/39] Undefine NAN after including it in Looper.h Looper.h needs to include the header for unordered_map, which itself includes math.h, which defines the macro NAN. Some HALs use enums called NAN, which causes a build error if the NAN macro is defined. We need to undef NAN in these cases after including Looper.h. Bug: 195020232 Test: presubmit: checkbuild Merged-In: I63bba8ea809a12571ddc88cd1d20f2adeedf0b30 Change-Id: I63bba8ea809a12571ddc88cd1d20f2adeedf0b30 (cherry picked from commit dda604440bd546c041106624c37dda4569420b9d) --- wifi/1.5/default/wifi.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wifi/1.5/default/wifi.h b/wifi/1.5/default/wifi.h index 840bdfd927..c94ef3f4cf 100644 --- a/wifi/1.5/default/wifi.h +++ b/wifi/1.5/default/wifi.h @@ -17,11 +17,15 @@ #ifndef WIFI_H_ #define WIFI_H_ -#include +// HACK: NAN is a macro defined in math.h, which can be included in various +// headers. This wifi HAL uses an enum called NAN, which does not compile when +// the macro is defined. Undefine NAN to work around it. +#undef NAN +#include #include -#include #include +#include #include "hidl_callback_util.h" #include "wifi_chip.h" From 669dbab452f059d63a33bfe0b6b02c8b3ca9a7b8 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Mon, 23 Aug 2021 18:14:50 -0700 Subject: [PATCH 13/39] Quick-fail NNAPI VTS test case if driver is dead This CL adds a check during SetUp that an NNAPI driver service is still alive by pinging the driver service. If it is not alive, the test will fail during SetUp. Without this quick-fail, the test case would continue as if the driver were still active, which would result in multiple EXPECT_* and ASSERT_* statements failing instead of a single, clear failure message. Bug: 197035200 Test: mma Test: presubmit: VtsHalNeuralnetworks*TargetTest Change-Id: Ib1b75ed20f764055699590581d5ad4e5aff4baae Merged-In: Ib1b75ed20f764055699590581d5ad4e5aff4baae (cherry picked from commit 9c3c8642fba1a85f7cdcd1a30a6f82fdc0025b40) --- neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp | 2 ++ neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp | 2 ++ neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp | 2 ++ neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp | 3 +++ neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp | 3 +++ neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp | 3 +++ neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp | 3 +++ 15 files changed, 34 insertions(+) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index ae1e3a220d..2ef66c20e6 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -154,6 +154,8 @@ void Execute(const sp& device, const TestModel& testModel) { void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp index 2c17796f2e..e2c0511441 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp @@ -81,6 +81,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp index a2338350aa..faf7bb47ce 100644 --- a/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp @@ -162,6 +162,8 @@ void Execute(const sp& device, const TestModel& testModel) { void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp index 54e8802a54..613b828ef1 100644 --- a/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp @@ -84,6 +84,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp index ede1600090..3d783d9aa1 100644 --- a/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp @@ -225,6 +225,8 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache, even when caching is not supported. diff --git a/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp index 56f3c0b7e2..9fa139a2a8 100644 --- a/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp @@ -384,6 +384,8 @@ void Execute(const sp& device, const TestModel& testModel, bool testDyn void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp index a60ec4d1d2..729d584863 100644 --- a/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp @@ -87,6 +87,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp index edffa22cca..a2013ecd3a 100644 --- a/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp @@ -228,6 +228,8 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache_1_3, even when caching is not supported. diff --git a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp index 0a956958f9..6d30d85f1b 100644 --- a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp @@ -926,6 +926,8 @@ void Execute(const sp& device, const TestModel& testModel, TestKind tes void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp index 5facc5ee96..e2fa6e4d42 100644 --- a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp +++ b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp @@ -243,6 +243,8 @@ class MemoryDomainTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } sp createConvPreparedModel(const TestOperand& testOperand, diff --git a/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp index df1e4535be..eb8cb4bc6d 100644 --- a/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp @@ -92,6 +92,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp index 94ce5c1130..77208aaf87 100644 --- a/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp @@ -223,6 +223,9 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache, even when caching is not supported. diff --git a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp index 2356ff0520..ac5b96a8a4 100644 --- a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp @@ -904,6 +904,9 @@ void Execute(const std::shared_ptr& device, const TestModel& testModel, void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp b/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp index e8313f19eb..1819699ab2 100644 --- a/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp +++ b/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp @@ -233,6 +233,9 @@ class MemoryDomainTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::shared_ptr createConvPreparedModel(const TestOperand& testOperand, diff --git a/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp index ee7cf89d4f..c417356005 100644 --- a/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp @@ -91,6 +91,9 @@ void createPreparedModel(const std::shared_ptr& device, const Model& mo void NeuralNetworksAidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { From 77c1b62362d4f2d0a4d1e557b93ea8e36c7c0956 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Mon, 23 Aug 2021 18:14:50 -0700 Subject: [PATCH 14/39] Quick-fail NNAPI VTS test case if driver is dead This CL adds a check during SetUp that an NNAPI driver service is still alive by pinging the driver service. If it is not alive, the test will fail during SetUp. Without this quick-fail, the test case would continue as if the driver were still active, which would result in multiple EXPECT_* and ASSERT_* statements failing instead of a single, clear failure message. Bug: 197035200 Test: mma Test: presubmit: VtsHalNeuralnetworks*TargetTest Change-Id: Ib1b75ed20f764055699590581d5ad4e5aff4baae Merged-In: Ib1b75ed20f764055699590581d5ad4e5aff4baae (cherry picked from commit 9c3c8642fba1a85f7cdcd1a30a6f82fdc0025b40) --- neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp | 2 ++ neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp | 2 ++ neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp | 2 ++ neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp | 2 ++ neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp | 2 ++ neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp | 3 +++ neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp | 3 +++ neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp | 3 +++ neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp | 3 +++ 15 files changed, 34 insertions(+) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index ae1e3a220d..2ef66c20e6 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -154,6 +154,8 @@ void Execute(const sp& device, const TestModel& testModel) { void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp index 2c17796f2e..e2c0511441 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworks.cpp @@ -81,6 +81,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp index a2338350aa..faf7bb47ce 100644 --- a/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.1/vts/functional/GeneratedTestHarness.cpp @@ -162,6 +162,8 @@ void Execute(const sp& device, const TestModel& testModel) { void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp index 54e8802a54..613b828ef1 100644 --- a/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.1/vts/functional/VtsHalNeuralnetworks.cpp @@ -84,6 +84,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp index ede1600090..3d783d9aa1 100644 --- a/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/1.2/vts/functional/CompilationCachingTests.cpp @@ -225,6 +225,8 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache, even when caching is not supported. diff --git a/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp index 56f3c0b7e2..9fa139a2a8 100644 --- a/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.2/vts/functional/GeneratedTestHarness.cpp @@ -384,6 +384,8 @@ void Execute(const sp& device, const TestModel& testModel, bool testDyn void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp index a60ec4d1d2..729d584863 100644 --- a/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.2/vts/functional/VtsHalNeuralnetworks.cpp @@ -87,6 +87,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp index edffa22cca..a2013ecd3a 100644 --- a/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/1.3/vts/functional/CompilationCachingTests.cpp @@ -228,6 +228,8 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache_1_3, even when caching is not supported. diff --git a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp index 0a956958f9..6d30d85f1b 100644 --- a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp @@ -926,6 +926,8 @@ void Execute(const sp& device, const TestModel& testModel, TestKind tes void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp index 5facc5ee96..e2fa6e4d42 100644 --- a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp +++ b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp @@ -243,6 +243,8 @@ class MemoryDomainTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } sp createConvPreparedModel(const TestOperand& testOperand, diff --git a/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp index df1e4535be..eb8cb4bc6d 100644 --- a/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/1.3/vts/functional/VtsHalNeuralnetworks.cpp @@ -92,6 +92,8 @@ void createPreparedModel(const sp& device, const Model& model, void NeuralnetworksHidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = kDevice->ping().isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { diff --git a/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp b/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp index 94ce5c1130..77208aaf87 100644 --- a/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp +++ b/neuralnetworks/aidl/vts/functional/CompilationCachingTests.cpp @@ -223,6 +223,9 @@ class CompilationCachingTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice.get(), nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); // Create cache directory. The cache directory and a temporary cache file is always created // to test the behavior of prepareModelFromCache, even when caching is not supported. diff --git a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp index 2356ff0520..ac5b96a8a4 100644 --- a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp @@ -904,6 +904,9 @@ void Execute(const std::shared_ptr& device, const TestModel& testModel, void GeneratedTestBase::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::vector getNamedModels(const FilterFn& filter) { diff --git a/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp b/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp index e8313f19eb..1819699ab2 100644 --- a/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp +++ b/neuralnetworks/aidl/vts/functional/MemoryDomainTests.cpp @@ -233,6 +233,9 @@ class MemoryDomainTestBase : public testing::Test { void SetUp() override { testing::Test::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } std::shared_ptr createConvPreparedModel(const TestOperand& testOperand, diff --git a/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp b/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp index ee7cf89d4f..c417356005 100644 --- a/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp +++ b/neuralnetworks/aidl/vts/functional/VtsHalNeuralnetworks.cpp @@ -91,6 +91,9 @@ void createPreparedModel(const std::shared_ptr& device, const Model& mo void NeuralNetworksAidlTest::SetUp() { testing::TestWithParam::SetUp(); ASSERT_NE(kDevice, nullptr); + const bool deviceIsResponsive = + ndk::ScopedAStatus::fromStatus(AIBinder_ping(kDevice->asBinder().get())).isOk(); + ASSERT_TRUE(deviceIsResponsive); } static NamedDevice makeNamedDevice(const std::string& name) { From 8472d91b5790932c253b5be33baf4e5198aba6ef Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Tue, 24 Aug 2021 23:25:45 -0700 Subject: [PATCH 15/39] Quickly exit VtsHalNeuralnetworks*TargetTest on failure This change adds the AndroidTest.xml flag --gtest_break_on_failure to cause the gtest to terminate after an error has been reached. This early termination is important in the case where an NN HAL service crashes mid-test, and all remaining tests would otherwise continue to run. Bug: 197035200 Test: m vts -j Test: vts-tradefed Change-Id: I0b9a14345475e432b93f92c23010a8b39712443a Merged-In: I0b9a14345475e432b93f92c23010a8b39712443a (cherry picked from commit ac45a5d77ea1a466aa73a5e4ca0a07c1db4f8fc6) --- neuralnetworks/1.0/vts/functional/AndroidTest.xml | 1 + neuralnetworks/1.1/vts/functional/AndroidTest.xml | 1 + neuralnetworks/1.2/vts/functional/AndroidTest.xml | 1 + neuralnetworks/1.3/vts/functional/AndroidTest.xml | 1 + neuralnetworks/aidl/vts/functional/AndroidTest.xml | 1 + 5 files changed, 5 insertions(+) diff --git a/neuralnetworks/1.0/vts/functional/AndroidTest.xml b/neuralnetworks/1.0/vts/functional/AndroidTest.xml index 9dd85ae7f1..8f56ff9c1f 100644 --- a/neuralnetworks/1.0/vts/functional/AndroidTest.xml +++ b/neuralnetworks/1.0/vts/functional/AndroidTest.xml @@ -29,5 +29,6 @@