diff options
Diffstat (limited to 'neuralnetworks/aidl/utils/test/DeviceTest.cpp')
-rw-r--r-- | neuralnetworks/aidl/utils/test/DeviceTest.cpp | 378 |
1 files changed, 279 insertions, 99 deletions
diff --git a/neuralnetworks/aidl/utils/test/DeviceTest.cpp b/neuralnetworks/aidl/utils/test/DeviceTest.cpp index f121acaf7b..73727b3974 100644 --- a/neuralnetworks/aidl/utils/test/DeviceTest.cpp +++ b/neuralnetworks/aidl/utils/test/DeviceTest.cpp @@ -17,6 +17,7 @@ #include "MockBuffer.h" #include "MockDevice.h" #include "MockPreparedModel.h" +#include "TestUtils.h" #include <aidl/android/hardware/neuralnetworks/BnDevice.h> #include <android/binder_auto_utils.h> @@ -60,7 +61,6 @@ constexpr PerformanceInfo kNoPerformanceInfo = {.execTime = std::numeric_limits< .powerUsage = std::numeric_limits<float>::max()}; constexpr NumberOfCacheFiles kNumberOfCacheFiles = {.numModelCache = nn::kMaxNumberOfCacheFiles - 1, .numDataCache = nn::kMaxNumberOfCacheFiles}; - constexpr auto makeStatusOk = [] { return ndk::ScopedAStatus::ok(); }; std::shared_ptr<MockDevice> createMockDevice() { @@ -123,6 +123,18 @@ auto makePreparedModelReturn(ErrorStatus launchStatus, ErrorStatus returnStatus, }; } +const std::vector<nn::TokenValuePair> kHints = {nn::TokenValuePair{.token = 0, .value = {1}}}; +const std::vector<nn::ExtensionNameAndPrefix> kExtensionNameToPrefix = { + nn::ExtensionNameAndPrefix{.name = "com.android.nn_test", .prefix = 1}}; +auto makePreparedModelWithConfigReturn(ErrorStatus launchStatus, ErrorStatus returnStatus, + const std::shared_ptr<MockPreparedModel>& preparedModel) { + return [launchStatus, returnStatus, preparedModel]( + const Model& /*model*/, const PrepareModelConfig& /*config*/, + const std::shared_ptr<IPreparedModelCallback>& cb) -> ndk::ScopedAStatus { + return makePreparedModelReturnImpl(launchStatus, returnStatus, preparedModel, cb); + }; +} + auto makePreparedModelFromCacheReturn(ErrorStatus launchStatus, ErrorStatus returnStatus, const std::shared_ptr<MockPreparedModel>& preparedModel) { return [launchStatus, returnStatus, preparedModel]( @@ -146,28 +158,30 @@ constexpr auto makeDeadObjectFailure = [] { return ndk::ScopedAStatus::fromStatus(STATUS_DEAD_OBJECT); }; +class DeviceTest : public VersionedAidlUtilsTestBase {}; + } // namespace -TEST(DeviceTest, invalidName) { +TEST_P(DeviceTest, invalidName) { // run test const auto device = MockDevice::create(); - const auto result = Device::create(kInvalidName, device); + const auto result = Device::create(kInvalidName, device, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::INVALID_ARGUMENT); } -TEST(DeviceTest, invalidDevice) { +TEST_P(DeviceTest, invalidDevice) { // run test - const auto result = Device::create(kName, kInvalidDevice); + const auto result = Device::create(kName, kInvalidDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::INVALID_ARGUMENT); } -TEST(DeviceTest, getVersionStringError) { +TEST_P(DeviceTest, getVersionStringError) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getVersionString(_)) @@ -175,14 +189,14 @@ TEST(DeviceTest, getVersionStringError) { .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getVersionStringTransportFailure) { +TEST_P(DeviceTest, getVersionStringTransportFailure) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getVersionString(_)) @@ -190,14 +204,14 @@ TEST(DeviceTest, getVersionStringTransportFailure) { .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getVersionStringDeadObject) { +TEST_P(DeviceTest, getVersionStringDeadObject) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getVersionString(_)) @@ -205,27 +219,27 @@ TEST(DeviceTest, getVersionStringDeadObject) { .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, getTypeError) { +TEST_P(DeviceTest, getTypeError) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getType(_)).Times(1).WillOnce(InvokeWithoutArgs(makeGeneralFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getTypeTransportFailure) { +TEST_P(DeviceTest, getTypeTransportFailure) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getType(_)) @@ -233,14 +247,14 @@ TEST(DeviceTest, getTypeTransportFailure) { .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getTypeDeadObject) { +TEST_P(DeviceTest, getTypeDeadObject) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getType(_)) @@ -248,14 +262,14 @@ TEST(DeviceTest, getTypeDeadObject) { .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, getSupportedExtensionsError) { +TEST_P(DeviceTest, getSupportedExtensionsError) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getSupportedExtensions(_)) @@ -263,14 +277,14 @@ TEST(DeviceTest, getSupportedExtensionsError) { .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getSupportedExtensionsTransportFailure) { +TEST_P(DeviceTest, getSupportedExtensionsTransportFailure) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getSupportedExtensions(_)) @@ -278,14 +292,14 @@ TEST(DeviceTest, getSupportedExtensionsTransportFailure) { .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getSupportedExtensionsDeadObject) { +TEST_P(DeviceTest, getSupportedExtensionsDeadObject) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getSupportedExtensions(_)) @@ -293,20 +307,20 @@ TEST(DeviceTest, getSupportedExtensionsDeadObject) { .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, getNumberOfCacheFilesNeeded) { +TEST_P(DeviceTest, getNumberOfCacheFilesNeeded) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_TRUE(result.has_value()); @@ -315,7 +329,7 @@ TEST(DeviceTest, getNumberOfCacheFilesNeeded) { EXPECT_EQ(result.value()->getNumberOfCacheFilesNeeded(), kNumberOfCacheFilesPair); } -TEST(DeviceTest, getNumberOfCacheFilesNeededError) { +TEST_P(DeviceTest, getNumberOfCacheFilesNeededError) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)) @@ -323,14 +337,14 @@ TEST(DeviceTest, getNumberOfCacheFilesNeededError) { .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, dataCacheFilesExceedsSpecifiedMax) { +TEST_P(DeviceTest, dataCacheFilesExceedsSpecifiedMax) { // setup test const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)) @@ -341,14 +355,14 @@ TEST(DeviceTest, dataCacheFilesExceedsSpecifiedMax) { InvokeWithoutArgs(makeStatusOk))); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, modelCacheFilesExceedsSpecifiedMax) { +TEST_P(DeviceTest, modelCacheFilesExceedsSpecifiedMax) { // setup test const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)) @@ -359,14 +373,14 @@ TEST(DeviceTest, modelCacheFilesExceedsSpecifiedMax) { InvokeWithoutArgs(makeStatusOk))); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getNumberOfCacheFilesNeededTransportFailure) { +TEST_P(DeviceTest, getNumberOfCacheFilesNeededTransportFailure) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)) @@ -374,14 +388,14 @@ TEST(DeviceTest, getNumberOfCacheFilesNeededTransportFailure) { .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getNumberOfCacheFilesNeededDeadObject) { +TEST_P(DeviceTest, getNumberOfCacheFilesNeededDeadObject) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)) @@ -389,14 +403,14 @@ TEST(DeviceTest, getNumberOfCacheFilesNeededDeadObject) { .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, getCapabilitiesError) { +TEST_P(DeviceTest, getCapabilitiesError) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getCapabilities(_)) @@ -404,14 +418,14 @@ TEST(DeviceTest, getCapabilitiesError) { .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getCapabilitiesTransportFailure) { +TEST_P(DeviceTest, getCapabilitiesTransportFailure) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getCapabilities(_)) @@ -419,14 +433,14 @@ TEST(DeviceTest, getCapabilitiesTransportFailure) { .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getCapabilitiesDeadObject) { +TEST_P(DeviceTest, getCapabilitiesDeadObject) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getCapabilities(_)) @@ -434,17 +448,17 @@ TEST(DeviceTest, getCapabilitiesDeadObject) { .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, getName) { +TEST_P(DeviceTest, getName) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); // run test const auto& name = device->getName(); @@ -453,19 +467,19 @@ TEST(DeviceTest, getName) { EXPECT_EQ(name, kName); } -TEST(DeviceTest, getFeatureLevel) { +TEST_P(DeviceTest, getFeatureLevel) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); // run test const auto featureLevel = device->getFeatureLevel(); // verify result - EXPECT_EQ(featureLevel, nn::Version::ANDROID_S); + EXPECT_EQ(featureLevel, kVersion); } -TEST(DeviceTest, getCachedData) { +TEST_P(DeviceTest, getCachedData) { // setup call const auto mockDevice = createMockDevice(); EXPECT_CALL(*mockDevice, getVersionString(_)).Times(1); @@ -474,7 +488,7 @@ TEST(DeviceTest, getCachedData) { EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1); EXPECT_CALL(*mockDevice, getCapabilities(_)).Times(1); - const auto result = Device::create(kName, mockDevice); + const auto result = Device::create(kName, mockDevice, kVersion); ASSERT_TRUE(result.has_value()) << "Failed with " << result.error().code << ": " << result.error().message; const auto& device = result.value(); @@ -487,10 +501,10 @@ TEST(DeviceTest, getCachedData) { EXPECT_EQ(device->getCapabilities(), device->getCapabilities()); } -TEST(DeviceTest, getSupportedOperations) { +TEST_P(DeviceTest, getSupportedOperations) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, getSupportedOperations(_, _)) .Times(1) .WillOnce(DoAll( @@ -508,10 +522,10 @@ TEST(DeviceTest, getSupportedOperations) { EXPECT_THAT(supportedOperations, Each(testing::IsTrue())); } -TEST(DeviceTest, getSupportedOperationsError) { +TEST_P(DeviceTest, getSupportedOperationsError) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, getSupportedOperations(_, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); @@ -524,10 +538,10 @@ TEST(DeviceTest, getSupportedOperationsError) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getSupportedOperationsTransportFailure) { +TEST_P(DeviceTest, getSupportedOperationsTransportFailure) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, getSupportedOperations(_, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); @@ -540,10 +554,10 @@ TEST(DeviceTest, getSupportedOperationsTransportFailure) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, getSupportedOperationsDeadObject) { +TEST_P(DeviceTest, getSupportedOperationsDeadObject) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, getSupportedOperations(_, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); @@ -556,10 +570,12 @@ TEST(DeviceTest, getSupportedOperationsDeadObject) { EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, prepareModel) { +TEST_P(DeviceTest, prepareModel) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); const auto mockPreparedModel = MockPreparedModel::create(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) @@ -568,7 +584,7 @@ TEST(DeviceTest, prepareModel) { // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_TRUE(result.has_value()) @@ -576,10 +592,12 @@ TEST(DeviceTest, prepareModel) { EXPECT_NE(result.value(), nullptr); } -TEST(DeviceTest, prepareModelLaunchError) { +TEST_P(DeviceTest, prepareModelLaunchError) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) .WillOnce(Invoke(makePreparedModelReturn(ErrorStatus::GENERAL_FAILURE, @@ -587,17 +605,19 @@ TEST(DeviceTest, prepareModelLaunchError) { // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelReturnError) { +TEST_P(DeviceTest, prepareModelReturnError) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) .WillOnce(Invoke(makePreparedModelReturn(ErrorStatus::NONE, @@ -605,17 +625,19 @@ TEST(DeviceTest, prepareModelReturnError) { // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelNullptrError) { +TEST_P(DeviceTest, prepareModelNullptrError) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) .WillOnce( @@ -623,51 +645,57 @@ TEST(DeviceTest, prepareModelNullptrError) { // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelTransportFailure) { +TEST_P(DeviceTest, prepareModelTransportFailure) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelDeadObject) { +TEST_P(DeviceTest, prepareModelDeadObject) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModel(_, _, _, _, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, prepareModelAsyncCrash) { +TEST_P(DeviceTest, prepareModelAsyncCrash) { + if (kVersion.level > nn::Version::Level::FEATURE_LEVEL_7) return; + // setup test const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); const auto ret = [&device]() { DeathMonitor::serviceDied(device->getDeathMonitor()); return ndk::ScopedAStatus::ok(); @@ -678,17 +706,167 @@ TEST(DeviceTest, prepareModelAsyncCrash) { // run test const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, - nn::Priority::DEFAULT, {}, {}, {}, {}); + nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {}); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); +} + +TEST_P(DeviceTest, prepareModelWithConfig) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + const auto mockPreparedModel = MockPreparedModel::create(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(Invoke(makePreparedModelWithConfigReturn(ErrorStatus::NONE, ErrorStatus::NONE, + mockPreparedModel))); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_TRUE(result.has_value()) + << "Failed with " << result.error().code << ": " << result.error().message; + EXPECT_NE(result.value(), nullptr); +} + +TEST_P(DeviceTest, prepareModelWithConfigLaunchError) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(Invoke(makePreparedModelWithConfigReturn( + ErrorStatus::GENERAL_FAILURE, ErrorStatus::GENERAL_FAILURE, nullptr))); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); +} + +TEST_P(DeviceTest, prepareModelWithConfigReturnError) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(Invoke(makePreparedModelWithConfigReturn( + ErrorStatus::NONE, ErrorStatus::GENERAL_FAILURE, nullptr))); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); +} + +TEST_P(DeviceTest, prepareModelWithConfigNullptrError) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(Invoke(makePreparedModelWithConfigReturn(ErrorStatus::NONE, ErrorStatus::NONE, + nullptr))); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); +} + +TEST_P(DeviceTest, prepareModelWithConfigTransportFailure) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); +} + +TEST_P(DeviceTest, prepareModelWithConfigDeadObject) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup call + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); + + // verify result + ASSERT_FALSE(result.has_value()); + EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); +} + +TEST_P(DeviceTest, prepareModelWithConfigAsyncCrash) { + if (kVersion.level < nn::Version::Level::FEATURE_LEVEL_8) return; + + // setup test + const auto mockDevice = createMockDevice(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); + const auto ret = [&device]() { + DeathMonitor::serviceDied(device->getDeathMonitor()); + return ndk::ScopedAStatus::ok(); + }; + EXPECT_CALL(*mockDevice, prepareModelWithConfig(_, _, _)) + .Times(1) + .WillOnce(InvokeWithoutArgs(ret)); + + // run test + const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT, + nn::Priority::DEFAULT, {}, {}, {}, {}, kHints, + kExtensionNameToPrefix); // verify result ASSERT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, prepareModelFromCache) { +TEST_P(DeviceTest, prepareModelFromCache) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); const auto mockPreparedModel = MockPreparedModel::create(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) @@ -704,10 +882,10 @@ TEST(DeviceTest, prepareModelFromCache) { EXPECT_NE(result.value(), nullptr); } -TEST(DeviceTest, prepareModelFromCacheLaunchError) { +TEST_P(DeviceTest, prepareModelFromCacheLaunchError) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) .WillOnce(Invoke(makePreparedModelFromCacheReturn( @@ -721,10 +899,10 @@ TEST(DeviceTest, prepareModelFromCacheLaunchError) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelFromCacheReturnError) { +TEST_P(DeviceTest, prepareModelFromCacheReturnError) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) .WillOnce(Invoke(makePreparedModelFromCacheReturn( @@ -738,10 +916,10 @@ TEST(DeviceTest, prepareModelFromCacheReturnError) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelFromCacheNullptrError) { +TEST_P(DeviceTest, prepareModelFromCacheNullptrError) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) .WillOnce(Invoke(makePreparedModelFromCacheReturn(ErrorStatus::NONE, ErrorStatus::NONE, @@ -755,10 +933,10 @@ TEST(DeviceTest, prepareModelFromCacheNullptrError) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelFromCacheTransportFailure) { +TEST_P(DeviceTest, prepareModelFromCacheTransportFailure) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); @@ -771,10 +949,10 @@ TEST(DeviceTest, prepareModelFromCacheTransportFailure) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, prepareModelFromCacheDeadObject) { +TEST_P(DeviceTest, prepareModelFromCacheDeadObject) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); @@ -787,10 +965,10 @@ TEST(DeviceTest, prepareModelFromCacheDeadObject) { EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, prepareModelFromCacheAsyncCrash) { +TEST_P(DeviceTest, prepareModelFromCacheAsyncCrash) { // setup test const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); const auto ret = [&device]() { DeathMonitor::serviceDied(device->getDeathMonitor()); return ndk::ScopedAStatus::ok(); @@ -807,10 +985,10 @@ TEST(DeviceTest, prepareModelFromCacheAsyncCrash) { EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } -TEST(DeviceTest, allocate) { +TEST_P(DeviceTest, allocate) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); const auto mockBuffer = DeviceBuffer{.buffer = MockBuffer::create(), .token = 1}; EXPECT_CALL(*mockDevice, allocate(_, _, _, _, _)) .Times(1) @@ -825,10 +1003,10 @@ TEST(DeviceTest, allocate) { EXPECT_NE(result.value(), nullptr); } -TEST(DeviceTest, allocateError) { +TEST_P(DeviceTest, allocateError) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, allocate(_, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralFailure)); @@ -841,10 +1019,10 @@ TEST(DeviceTest, allocateError) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, allocateTransportFailure) { +TEST_P(DeviceTest, allocateTransportFailure) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, allocate(_, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure)); @@ -857,10 +1035,10 @@ TEST(DeviceTest, allocateTransportFailure) { EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE); } -TEST(DeviceTest, allocateDeadObject) { +TEST_P(DeviceTest, allocateDeadObject) { // setup call const auto mockDevice = createMockDevice(); - const auto device = Device::create(kName, mockDevice).value(); + const auto device = Device::create(kName, mockDevice, kVersion).value(); EXPECT_CALL(*mockDevice, allocate(_, _, _, _, _)) .Times(1) .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure)); @@ -873,4 +1051,6 @@ TEST(DeviceTest, allocateDeadObject) { EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT); } +INSTANTIATE_VERSIONED_AIDL_UTILS_TEST(DeviceTest, kAllAidlVersions); + } // namespace aidl::android::hardware::neuralnetworks::utils |