aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/test/DynamicBackendTests.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/backendsCommon/test/DynamicBackendTests.hpp')
-rw-r--r--src/backends/backendsCommon/test/DynamicBackendTests.hpp447
1 files changed, 395 insertions, 52 deletions
diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.hpp b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
index e3fbe311bc..ae922bc26d 100644
--- a/src/backends/backendsCommon/test/DynamicBackendTests.hpp
+++ b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
@@ -36,17 +36,43 @@ static std::string g_TestInvalidTestDynamicBackend7FileName = "libInvalidTestDyn
static std::string g_TestValidBackend2FileName = "Arm_TestValid2_backend.so";
static std::string g_TestValidBackend3FileName = "Arm_TestValid3_backend.so";
static std::string g_TestValidBackend4FileName = "Arm_TestValid4_backend.so";
+static std::string g_TestValidBackend5FileName = "Arm_TestValid5_backend.so";
static std::string g_TestInvalidBackend8FileName = "Arm_TestInvalid8_backend.so";
static std::string g_TestInvalidBackend9FileName = "Arm_TestInvalid9_backend.so";
+static std::string g_TestInvalidBackend10FileName = "Arm_TestInvalid10_backend.so";
+static std::string g_TestInvalidBackend11FileName = "Arm_TestInvalid11_backend.so";
+
+static std::string g_TestDynamicBackendsSubDir1 = "backendsTestPath1/";
+static std::string g_TestDynamicBackendsSubDir2 = "backendsTestPath2/";
+static std::string g_TestDynamicBackendsSubDir3 = "backendsTestPath3/";
+static std::string g_TestDynamicBackendsSubDir4 = "backendsTestPath4/";
+static std::string g_TestDynamicBackendsSubDir5 = "backendsTestPath5/";
+static std::string g_TestDynamicBackendsSubDir6 = "backendsTestPath6/";
+static std::string g_TestDynamicBackendsSubDir7 = "backendsTestPath7/";
+static std::string g_TestDynamicBackendsSubDir8 = "backendsTestPath8/";
+static std::string g_TestDynamicBackendsSubDir9 = "backendsTestPath9/";
+
+// Wrapper class used for testing
+class TestDynamicBackendUtils : public armnn::DynamicBackendUtils
+{
+public:
+ static bool IsBackendCompatibleTest(const armnn::BackendVersion& backendApiVersion,
+ const armnn::BackendVersion& backendVersion)
+ {
+ return IsBackendCompatibleImpl(backendApiVersion, backendVersion);
+ }
-static std::string g_TestDynamicBackendsFileParsingSubDir1 = "backendsTestPath1/";
-static std::string g_TestDynamicBackendsFileParsingSubDir2 = "backendsTestPath2/";
-static std::string g_TestDynamicBackendsFileParsingSubDir3 = "backendsTestPath3/";
-static std::string g_TestDynamicBackendsFileParsingSubDir4 = "backendsTestPath4/";
-static std::string g_TestDynamicBackendsFileParsingSubDir5 = "backendsTestPath5/";
-static std::string g_TestDynamicBackendsFileParsingSubDir6 = "backendsTestPath6/";
-static std::string g_TestDynamicBackendsFileParsingSubDir7 = "backendsTestPath7/";
-static std::string g_TestDynamicBackendsFileParsingSubDir8 = "backendsTestPath8/";
+ static std::vector<std::string> GetBackendPathsImplTest(const std::string& path)
+ {
+ return GetBackendPathsImpl(path);
+ }
+
+ static void RegisterDynamicBackendsImplTest(armnn::BackendRegistry& backendRegistry,
+ const std::vector<armnn::DynamicBackendPtr>& dynamicBackends)
+ {
+ RegisterDynamicBackendsImpl(backendRegistry, dynamicBackends);
+ }
+};
std::string GetTestDirectoryBasePath()
{
@@ -222,16 +248,6 @@ void BackendVersioningTestImpl()
{
using namespace armnn;
- class TestDynamicBackendUtils : public DynamicBackendUtils
- {
- public:
- static bool IsBackendCompatibleTest(const BackendVersion& backendApiVersion,
- const BackendVersion& backendVersion)
- {
- return IsBackendCompatibleImpl(backendApiVersion, backendVersion);
- }
- };
-
// The backend API version used for the tests
BackendVersion backendApiVersion{ 2, 4 };
@@ -297,11 +313,20 @@ void CreateValidDynamicBackendObjectTestImpl()
BOOST_CHECK_NO_THROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
BOOST_TEST((dynamicBackendVersion == IBackendInternal::GetApiVersion()));
- IBackendInternalUniquePtr dynamicBackendInstance;
- BOOST_CHECK_NO_THROW(dynamicBackendInstance = dynamicBackend->GetBackend());
- BOOST_TEST((dynamicBackendInstance != nullptr));
+ IBackendInternalUniquePtr dynamicBackendInstance1;
+ BOOST_CHECK_NO_THROW(dynamicBackendInstance1 = dynamicBackend->GetBackend());
+ BOOST_TEST((dynamicBackendInstance1 != nullptr));
+
+ BackendRegistry::FactoryFunction dynamicBackendFactoryFunction = nullptr;
+ BOOST_CHECK_NO_THROW(dynamicBackendFactoryFunction = dynamicBackend->GetFactoryFunction());
+ BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
+
+ IBackendInternalUniquePtr dynamicBackendInstance2;
+ BOOST_CHECK_NO_THROW(dynamicBackendInstance2 = dynamicBackendFactoryFunction());
+ BOOST_TEST((dynamicBackendInstance2 != nullptr));
- BOOST_TEST((dynamicBackendInstance->GetId() == "ValidTestDynamicBackend"));
+ BOOST_TEST((dynamicBackendInstance1->GetId() == "ValidTestDynamicBackend"));
+ BOOST_TEST((dynamicBackendInstance2->GetId() == "ValidTestDynamicBackend"));
}
void CreateDynamicBackendObjectInvalidHandleTestImpl()
@@ -444,9 +469,17 @@ void CreateDynamicBackendObjectInvalidInterface6TestImpl()
BOOST_CHECK_NO_THROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
BOOST_TEST((dynamicBackendVersion == BackendVersion({ 1, 0 })));
- IBackendInternalUniquePtr dynamicBackendInstance;
- BOOST_CHECK_THROW(dynamicBackendInstance = dynamicBackend->GetBackend(), RuntimeException);
- BOOST_TEST((dynamicBackendInstance == nullptr));
+ IBackendInternalUniquePtr dynamicBackendInstance1;
+ BOOST_CHECK_THROW(dynamicBackendInstance1 = dynamicBackend->GetBackend(), RuntimeException);
+ BOOST_TEST((dynamicBackendInstance1 == nullptr));
+
+ BackendRegistry::FactoryFunction dynamicBackendFactoryFunction = nullptr;
+ BOOST_CHECK_NO_THROW(dynamicBackendFactoryFunction = dynamicBackend->GetFactoryFunction());
+ BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
+
+ IBackendInternalUniquePtr dynamicBackendInstance2;
+ BOOST_CHECK_THROW(dynamicBackendInstance2 = dynamicBackendFactoryFunction(), RuntimeException);
+ BOOST_TEST((dynamicBackendInstance2 == nullptr));
}
void CreateDynamicBackendObjectInvalidInterface7TestImpl()
@@ -482,25 +515,16 @@ void GetBackendPathsTestImpl()
// ├─ backendsTestPath3/ -> exists, but empty
// └─ backendsTestPath4/ -> does not exist
- std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir1);
- std::string subDir2 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir2);
- std::string subDir3 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir3);
- std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir4);
+ std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
+ std::string subDir2 = GetTestSubDirectory(g_TestDynamicBackendsSubDir2);
+ std::string subDir3 = GetTestSubDirectory(g_TestDynamicBackendsSubDir3);
+ std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
BOOST_CHECK(exists(subDir1));
BOOST_CHECK(exists(subDir2));
BOOST_CHECK(exists(subDir3));
BOOST_CHECK(!exists(subDir4));
- class TestDynamicBackendUtils : public DynamicBackendUtils
- {
- public:
- static std::vector<std::string> GetBackendPathsImplTest(const std::string& path)
- {
- return GetBackendPathsImpl(path);
- }
- };
-
// No path
BOOST_TEST(TestDynamicBackendUtils::GetBackendPathsImplTest("").empty());
@@ -564,8 +588,8 @@ void GetBackendPathsOverrideTestImpl()
using namespace armnn;
using namespace boost::filesystem;
- std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir1);
- std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir4);
+ std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
+ std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
BOOST_CHECK(exists(subDir1));
BOOST_CHECK(!exists(subDir4));
@@ -629,10 +653,10 @@ void GetSharedObjectsTestImpl()
//
// Arm_GpuAcc_backend.so -> valid (but duplicated from backendsTestPath1/)
- std::string testDynamicBackendsSubDir1 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir1);
- std::string testDynamicBackendsSubDir2 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir2);
- std::string testDynamicBackendsSubDir3 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir3);
- std::string testDynamicBackendsSubDir4 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir4);
+ std::string testDynamicBackendsSubDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
+ std::string testDynamicBackendsSubDir2 = GetTestSubDirectory(g_TestDynamicBackendsSubDir2);
+ std::string testDynamicBackendsSubDir3 = GetTestSubDirectory(g_TestDynamicBackendsSubDir3);
+ std::string testDynamicBackendsSubDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
BOOST_CHECK(exists(testDynamicBackendsSubDir1));
BOOST_CHECK(exists(testDynamicBackendsSubDir2));
BOOST_CHECK(exists(testDynamicBackendsSubDir3));
@@ -676,7 +700,7 @@ void CreateDynamicBackendsTestImpl()
using namespace armnn;
using namespace boost::filesystem;
- // The test covers three directories:
+ // The test covers four directories:
// <unit test path>/src/backends/backendsCommon/test/
// ├─ backendsTestPath5/ -> exists, contains files
// ├─ backendsTestPath6/ -> exists, contains files
@@ -695,14 +719,15 @@ void CreateDynamicBackendsTestImpl()
// Arm_TestValid4_backend.so -> valid (it has a different filename,
// but it has the same backend id of Arm_TestValid2_backend.so
// and the same version)
+ // Arm_TestValid5_backend.so -> valid (basic backend name)
// Arm_TestInvalid9_backend.so -> not valid (it has a different filename,
// but it has the same backend id of Arm_TestValid2_backend.so
// and a version incompatible with the Backend API)
- std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir5);
- std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir6);
- std::string testDynamicBackendsSubDir7 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir7);
- std::string testDynamicBackendsSubDir8 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir8);
+ std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
+ std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
+ std::string testDynamicBackendsSubDir7 = GetTestSubDirectory(g_TestDynamicBackendsSubDir7);
+ std::string testDynamicBackendsSubDir8 = GetTestSubDirectory(g_TestDynamicBackendsSubDir8);
BOOST_CHECK(exists(testDynamicBackendsSubDir5));
BOOST_CHECK(exists(testDynamicBackendsSubDir6));
BOOST_CHECK(exists(testDynamicBackendsSubDir7));
@@ -718,17 +743,19 @@ void CreateDynamicBackendsTestImpl()
std::vector<std::string> sharedObjects = DynamicBackendUtils::GetSharedObjects(backendPaths);
std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
- BOOST_TEST(dynamicBackends.size() == 4);
+ BOOST_TEST(dynamicBackends.size() == 5);
BOOST_TEST((dynamicBackends[0] != nullptr));
BOOST_TEST((dynamicBackends[1] != nullptr));
BOOST_TEST((dynamicBackends[2] != nullptr));
BOOST_TEST((dynamicBackends[3] != nullptr));
+ BOOST_TEST((dynamicBackends[4] != nullptr));
// Duplicates are allowed here, they will be skipped later during the backend registration
BOOST_TEST((dynamicBackends[0]->GetBackendId() == "TestValid2"));
BOOST_TEST((dynamicBackends[1]->GetBackendId() == "TestValid3"));
BOOST_TEST((dynamicBackends[2]->GetBackendId() == "TestValid2")); // From duplicate Arm_TestValid2_backend.so
BOOST_TEST((dynamicBackends[3]->GetBackendId() == "TestValid2")); // From Arm_TestValid4_backend.so
+ BOOST_TEST((dynamicBackends[4]->GetBackendId() == "TestValid5"));
}
void CreateDynamicBackendsNoPathsTestImpl()
@@ -760,8 +787,8 @@ void CreateDynamicBackendsMixedTypesTestImpl()
using namespace armnn;
using namespace boost::filesystem;
- std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir5);
- std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsFileParsingSubDir6);
+ std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
+ std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
BOOST_CHECK(exists(testDynamicBackendsSubDir5));
BOOST_CHECK(exists(testDynamicBackendsSubDir6));
@@ -788,3 +815,319 @@ void CreateDynamicBackendsMixedTypesTestImpl()
BOOST_TEST((dynamicBackends[0] != nullptr));
BOOST_TEST((dynamicBackends[0]->GetBackendId() == "TestValid2"));
}
+
+void RegisterSingleDynamicBackendTestImpl()
+{
+ using namespace armnn;
+ using namespace boost::filesystem;
+
+ // Register one valid dynamic backend
+
+ // Dummy registry used for testing
+ BackendRegistry backendRegistry;
+ BOOST_TEST(backendRegistry.Size() == 0);
+
+ std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
+ BOOST_CHECK(exists(testDynamicBackendsSubDir5));
+
+ std::string testValidBackend2FilePath = GetTestFilePath(testDynamicBackendsSubDir5, g_TestValidBackend2FileName);
+ BOOST_CHECK(exists(testValidBackend2FilePath));
+
+ std::vector<std::string> sharedObjects{ testValidBackend2FilePath };
+ std::vector<DynamicBackendPtr> dynamicBackends = TestDynamicBackendUtils::CreateDynamicBackends(sharedObjects);
+
+ BOOST_TEST(dynamicBackends.size() == 1);
+ BOOST_TEST((dynamicBackends[0] != nullptr));
+
+ BackendId dynamicBackendId = dynamicBackends[0]->GetBackendId();
+ BOOST_TEST((dynamicBackendId == "TestValid2"));
+
+ BackendVersion dynamicBackendVersion = dynamicBackends[0]->GetBackendVersion();
+ BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatible(dynamicBackendVersion));
+
+ TestDynamicBackendUtils::RegisterDynamicBackendsImplTest(backendRegistry, dynamicBackends);
+ BOOST_TEST(backendRegistry.Size() == 1);
+
+ BackendIdSet backendIds = backendRegistry.GetBackendIds();
+ BOOST_TEST(backendIds.size() == 1);
+ BOOST_TEST((backendIds.find(dynamicBackendId) != backendIds.end()));
+
+ auto dynamicBackendFactoryFunction = backendRegistry.GetFactory(dynamicBackendId);
+ BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
+
+ IBackendInternalUniquePtr dynamicBackend = dynamicBackendFactoryFunction();
+ BOOST_TEST((dynamicBackend != nullptr));
+ BOOST_TEST((dynamicBackend->GetId() == dynamicBackendId));
+}
+
+void RegisterMultipleDynamicBackendsTestImpl()
+{
+ using namespace armnn;
+ using namespace boost::filesystem;
+
+ // Register many valid dynamic backends
+
+ std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
+ std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
+ BOOST_CHECK(exists(testDynamicBackendsSubDir5));
+ BOOST_CHECK(exists(testDynamicBackendsSubDir6));
+
+ std::string testValidBackend2FilePath = GetTestFilePath(testDynamicBackendsSubDir5, g_TestValidBackend2FileName);
+ std::string testValidBackend3FilePath = GetTestFilePath(testDynamicBackendsSubDir5, g_TestValidBackend3FileName);
+ std::string testValidBackend5FilePath = GetTestFilePath(testDynamicBackendsSubDir6, g_TestValidBackend5FileName);
+ BOOST_CHECK(exists(testValidBackend2FilePath));
+ BOOST_CHECK(exists(testValidBackend3FilePath));
+ BOOST_CHECK(exists(testValidBackend5FilePath));
+
+ std::vector<std::string> sharedObjects
+ {
+ testValidBackend2FilePath,
+ testValidBackend3FilePath,
+ testValidBackend5FilePath
+ };
+ std::vector<DynamicBackendPtr> dynamicBackends = TestDynamicBackendUtils::CreateDynamicBackends(sharedObjects);
+
+ BOOST_TEST(dynamicBackends.size() == 3);
+ BOOST_TEST((dynamicBackends[0] != nullptr));
+ BOOST_TEST((dynamicBackends[1] != nullptr));
+ BOOST_TEST((dynamicBackends[2] != nullptr));
+
+ BackendId dynamicBackendId1 = dynamicBackends[0]->GetBackendId();
+ BackendId dynamicBackendId2 = dynamicBackends[1]->GetBackendId();
+ BackendId dynamicBackendId3 = dynamicBackends[2]->GetBackendId();
+ BOOST_TEST((dynamicBackendId1 == "TestValid2"));
+ BOOST_TEST((dynamicBackendId2 == "TestValid3"));
+ BOOST_TEST((dynamicBackendId3 == "TestValid5"));
+
+ for (size_t i = 0; i < dynamicBackends.size(); i++)
+ {
+ BackendVersion dynamicBackendVersion = dynamicBackends[i]->GetBackendVersion();
+ BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatible(dynamicBackendVersion));
+ }
+
+ // Dummy registry used for testing
+ BackendRegistry backendRegistry;
+ BOOST_TEST(backendRegistry.Size() == 0);
+
+ TestDynamicBackendUtils::RegisterDynamicBackendsImplTest(backendRegistry, dynamicBackends);
+ BOOST_TEST(backendRegistry.Size() == 3);
+
+ BackendIdSet backendIds = backendRegistry.GetBackendIds();
+ BOOST_TEST(backendIds.size() == 3);
+ BOOST_TEST((backendIds.find(dynamicBackendId1) != backendIds.end()));
+ BOOST_TEST((backendIds.find(dynamicBackendId2) != backendIds.end()));
+ BOOST_TEST((backendIds.find(dynamicBackendId3) != backendIds.end()));
+
+ for (size_t i = 0; i < dynamicBackends.size(); i++)
+ {
+ BackendId dynamicBackendId = dynamicBackends[i]->GetBackendId();
+
+ auto dynamicBackendFactoryFunction = backendRegistry.GetFactory(dynamicBackendId);
+ BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
+
+ IBackendInternalUniquePtr dynamicBackend = dynamicBackendFactoryFunction();
+ BOOST_TEST((dynamicBackend != nullptr));
+ BOOST_TEST((dynamicBackend->GetId() == dynamicBackendId));
+ }
+}
+
+void RegisterMultipleInvalidDynamicBackendsTestImpl()
+{
+ using namespace armnn;
+ using namespace boost::filesystem;
+
+ // Try to register many invalid dynamic backends
+
+ // The test covers one directory:
+ // <unit test path>/src/backends/backendsCommon/test/
+ // └─ backendsTestPath9/ -> exists, contains files
+ //
+ // The test sub-directory backendsTestPath9/ contains the following test files:
+ //
+ // Arm_TestInvalid10_backend.so -> not valid (invalid backend id)
+ // Arm_TestInvalid11_backend.so -> not valid (invalid backend id)
+
+ std::string testDynamicBackendsSubDir9 = GetTestSubDirectory(g_TestDynamicBackendsSubDir9);
+ BOOST_CHECK(exists(testDynamicBackendsSubDir9));
+
+ std::string testInvalidBackend10FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
+ g_TestInvalidBackend10FileName);
+ std::string testInvalidBackend11FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
+ g_TestInvalidBackend11FileName);
+ BOOST_CHECK(exists(testInvalidBackend10FilePath));
+ BOOST_CHECK(exists(testInvalidBackend11FilePath));
+
+ std::vector<std::string> sharedObjects
+ {
+ testInvalidBackend10FilePath,
+ testInvalidBackend11FilePath,
+ "InvalidSharedObject"
+ };
+ std::vector<DynamicBackendPtr> dynamicBackends = TestDynamicBackendUtils::CreateDynamicBackends(sharedObjects);
+
+ BOOST_TEST(dynamicBackends.size() == 2);
+ BOOST_TEST((dynamicBackends[0] != nullptr));
+ BOOST_TEST((dynamicBackends[1] != nullptr));
+
+ BackendId dynamicBackendId1 = dynamicBackends[0]->GetBackendId();
+ BackendId dynamicBackendId2 = dynamicBackends[1]->GetBackendId();
+ BOOST_TEST((dynamicBackendId1 == ""));
+ BOOST_TEST((dynamicBackendId2 == "Unknown"));
+
+ for (size_t i = 0; i < dynamicBackends.size(); i++)
+ {
+ BackendVersion dynamicBackendVersion = dynamicBackends[i]->GetBackendVersion();
+ BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatible(dynamicBackendVersion));
+ }
+
+ // Dummy registry used for testing
+ BackendRegistry backendRegistry;
+ BOOST_TEST(backendRegistry.Size() == 0);
+
+ // Check that no dynamic backend got registered
+ TestDynamicBackendUtils::RegisterDynamicBackendsImplTest(backendRegistry, dynamicBackends);
+ BOOST_TEST(backendRegistry.Size() == 0);
+}
+
+void RegisterMixedDynamicBackendsTestImpl()
+{
+ using namespace armnn;
+ using namespace boost::filesystem;
+
+ // The test covers five directories:
+ // <unit test path>/src/backends/backendsCommon/test/
+ // ├─ backendsTestPath5/ -> exists, contains files
+ // ├─ backendsTestPath6/ -> exists, contains files
+ // ├─ backendsTestPath7/ -> exists, but empty
+ // ├─ backendsTestPath8/ -> does not exist
+ // └─ backendsTestPath9/ -> exists, contains files
+ //
+ // The test sub-directory backendsTestPath5/ contains the following test files:
+ //
+ // Arm_TestValid2_backend.so -> valid (basic backend name)
+ // Arm_TestValid3_backend.so -> valid (basic backend name)
+ // Arm_TestInvalid8_backend.so -> not valid (invalid backend id)
+ //
+ // The test sub-directory backendsTestPath6/ contains the following test files:
+ //
+ // Arm_TestValid2_backend.so -> valid (but duplicated from backendsTestPath5/)
+ // Arm_TestValid4_backend.so -> valid (it has a different filename,
+ // but it has the same backend id of Arm_TestValid2_backend.so
+ // and the same version)
+ // Arm_TestValid5_backend.so -> valid (basic backend name)
+ // Arm_TestInvalid9_backend.so -> not valid (it has a different filename,
+ // but it has the same backend id of Arm_TestValid2_backend.so
+ // and a version incompatible with the Backend API)
+ //
+ // The test sub-directory backendsTestPath9/ contains the following test files:
+ //
+ // Arm_TestInvalid10_backend.so -> not valid (empty backend id)
+ // Arm_TestInvalid11_backend.so -> not valid ("Unknown" backend id)
+
+ std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
+ std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
+ std::string testDynamicBackendsSubDir7 = GetTestSubDirectory(g_TestDynamicBackendsSubDir7);
+ std::string testDynamicBackendsSubDir8 = GetTestSubDirectory(g_TestDynamicBackendsSubDir8);
+ std::string testDynamicBackendsSubDir9 = GetTestSubDirectory(g_TestDynamicBackendsSubDir9);
+ BOOST_CHECK(exists(testDynamicBackendsSubDir5));
+ BOOST_CHECK(exists(testDynamicBackendsSubDir6));
+ BOOST_CHECK(exists(testDynamicBackendsSubDir7));
+ BOOST_CHECK(!exists(testDynamicBackendsSubDir8));
+ BOOST_CHECK(exists(testDynamicBackendsSubDir9));
+
+ std::string testValidBackend2FilePath = GetTestFilePath(testDynamicBackendsSubDir5, g_TestValidBackend2FileName);
+ std::string testValidBackend3FilePath = GetTestFilePath(testDynamicBackendsSubDir5, g_TestValidBackend3FileName);
+ std::string testValidBackend2DupFilePath = GetTestFilePath(testDynamicBackendsSubDir6, g_TestValidBackend2FileName);
+ std::string testValidBackend4FilePath = GetTestFilePath(testDynamicBackendsSubDir6, g_TestValidBackend4FileName);
+ std::string testValidBackend5FilePath = GetTestFilePath(testDynamicBackendsSubDir6, g_TestValidBackend5FileName);
+ std::string testInvalidBackend8FilePath = GetTestFilePath(testDynamicBackendsSubDir5,
+ g_TestInvalidBackend8FileName);
+ std::string testInvalidBackend9FilePath = GetTestFilePath(testDynamicBackendsSubDir6,
+ g_TestInvalidBackend9FileName);
+ std::string testInvalidBackend10FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
+ g_TestInvalidBackend10FileName);
+ std::string testInvalidBackend11FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
+ g_TestInvalidBackend11FileName);
+ BOOST_CHECK(exists(testValidBackend2FilePath));
+ BOOST_CHECK(exists(testValidBackend3FilePath));
+ BOOST_CHECK(exists(testValidBackend2DupFilePath));
+ BOOST_CHECK(exists(testValidBackend4FilePath));
+ BOOST_CHECK(exists(testValidBackend5FilePath));
+ BOOST_CHECK(exists(testInvalidBackend8FilePath));
+ BOOST_CHECK(exists(testInvalidBackend9FilePath));
+ BOOST_CHECK(exists(testInvalidBackend10FilePath));
+ BOOST_CHECK(exists(testInvalidBackend11FilePath));
+
+ std::vector<std::string> sharedObjects
+ {
+ testValidBackend2FilePath,
+ testValidBackend3FilePath,
+ testValidBackend2DupFilePath,
+ testValidBackend4FilePath,
+ testValidBackend5FilePath,
+ testInvalidBackend8FilePath,
+ testInvalidBackend9FilePath,
+ testInvalidBackend10FilePath,
+ testInvalidBackend11FilePath,
+ "InvalidSharedObject"
+ };
+ std::vector<DynamicBackendPtr> dynamicBackends = TestDynamicBackendUtils::CreateDynamicBackends(sharedObjects);
+
+ BOOST_TEST(dynamicBackends.size() == 7);
+ BOOST_TEST((dynamicBackends[0] != nullptr));
+ BOOST_TEST((dynamicBackends[1] != nullptr));
+ BOOST_TEST((dynamicBackends[2] != nullptr));
+ BOOST_TEST((dynamicBackends[3] != nullptr));
+ BOOST_TEST((dynamicBackends[4] != nullptr));
+ BOOST_TEST((dynamicBackends[5] != nullptr));
+ BOOST_TEST((dynamicBackends[6] != nullptr));
+
+ BackendId dynamicBackendId1 = dynamicBackends[0]->GetBackendId();
+ BackendId dynamicBackendId2 = dynamicBackends[1]->GetBackendId();
+ BackendId dynamicBackendId3 = dynamicBackends[2]->GetBackendId();
+ BackendId dynamicBackendId4 = dynamicBackends[3]->GetBackendId();
+ BackendId dynamicBackendId5 = dynamicBackends[4]->GetBackendId();
+ BackendId dynamicBackendId6 = dynamicBackends[5]->GetBackendId();
+ BackendId dynamicBackendId7 = dynamicBackends[6]->GetBackendId();
+ BOOST_TEST((dynamicBackendId1 == "TestValid2"));
+ BOOST_TEST((dynamicBackendId2 == "TestValid3"));
+ BOOST_TEST((dynamicBackendId3 == "TestValid2")); // From duplicate Arm_TestValid2_backend.so
+ BOOST_TEST((dynamicBackendId4 == "TestValid2")); // From Arm_TestValid4_backend.so
+ BOOST_TEST((dynamicBackendId5 == "TestValid5"));
+ BOOST_TEST((dynamicBackendId6 == ""));
+ BOOST_TEST((dynamicBackendId7 == "Unknown"));
+
+ for (size_t i = 0; i < dynamicBackends.size(); i++)
+ {
+ BackendVersion dynamicBackendVersion = dynamicBackends[i]->GetBackendVersion();
+ BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatible(dynamicBackendVersion));
+ }
+
+ // Dummy registry used for testing
+ BackendRegistry backendRegistry;
+ BOOST_TEST(backendRegistry.Size() == 0);
+
+ std::vector<BackendId> expectedRegisteredbackendIds
+ {
+ "TestValid2",
+ "TestValid3",
+ "TestValid5"
+ };
+
+ TestDynamicBackendUtils::RegisterDynamicBackendsImplTest(backendRegistry, dynamicBackends);
+ BOOST_TEST(backendRegistry.Size() == expectedRegisteredbackendIds.size());
+
+ BackendIdSet backendIds = backendRegistry.GetBackendIds();
+ BOOST_TEST(backendIds.size() == expectedRegisteredbackendIds.size());
+ for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
+ {
+ BOOST_TEST((backendIds.find(expectedRegisteredbackendId) != backendIds.end()));
+
+ auto dynamicBackendFactoryFunction = backendRegistry.GetFactory(expectedRegisteredbackendId);
+ BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
+
+ IBackendInternalUniquePtr dynamicBackend = dynamicBackendFactoryFunction();
+ BOOST_TEST((dynamicBackend != nullptr));
+ BOOST_TEST((dynamicBackend->GetId() == expectedRegisteredbackendId));
+ }
+}