ArmNN
 21.08
DynamicBackendTests.hpp File Reference

Go to the source code of this file.

Classes

class  TestDynamicBackendUtils
 
class  TestBackendRegistry
 

Macros

#define DYNAMIC_BACKEND_BUILD_DIR   fs::path("./")
 

Functions

std::string GetUnitTestExecutablePath ()
 
std::string GetBasePath (const std::string &basePath)
 
std::string GetTestDirectoryBasePath ()
 
std::string GetDynamicBackendsBasePath ()
 
std::string GetTestSubDirectory (const std::string &subdir)
 
std::string GetTestSubDirectory (const std::string &basePath, const std::string &subdir)
 
std::string GetTestFilePath (const std::string &directory, const std::string &fileName)
 
void OpenCloseHandleTestImpl ()
 
void CloseInvalidHandleTestImpl ()
 
void OpenEmptyFileNameTestImpl ()
 
void OpenNotExistingFileTestImpl ()
 
void OpenNotSharedObjectTestImpl ()
 
void GetValidEntryPointTestImpl ()
 
void GetNameMangledEntryPointTestImpl ()
 
void GetNoExternEntryPointTestImpl ()
 
void GetNotExistingEntryPointTestImpl ()
 
void BackendVersioningTestImpl ()
 
void CreateDynamicBackendObjectInvalidHandleTestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface1TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface2TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface3TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface4TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface5TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface6TestImpl ()
 
void CreateDynamicBackendObjectInvalidInterface7TestImpl ()
 
void GetBackendPathsTestImpl ()
 
void GetBackendPathsOverrideTestImpl ()
 
void GetSharedObjectsTestImpl ()
 
void CreateDynamicBackendsTestImpl ()
 
void CreateDynamicBackendsNoPathsTestImpl ()
 
void CreateDynamicBackendsAllInvalidTestImpl ()
 
void CreateDynamicBackendsMixedTypesTestImpl ()
 
void RegisterMultipleInvalidDynamicBackendsTestImpl ()
 
void RuntimeEmptyTestImpl ()
 
void RuntimeDynamicBackendsTestImpl ()
 
void RuntimeDuplicateDynamicBackendsTestImpl ()
 
void RuntimeInvalidDynamicBackendsTestImpl ()
 
void RuntimeInvalidOverridePathTestImpl ()
 

Macro Definition Documentation

◆ DYNAMIC_BACKEND_BUILD_DIR

#define DYNAMIC_BACKEND_BUILD_DIR   fs::path("./")

Definition at line 28 of file DynamicBackendTests.hpp.

Referenced by GetBasePath().

Function Documentation

◆ BackendVersioningTestImpl()

void BackendVersioningTestImpl ( )

Definition at line 333 of file DynamicBackendTests.hpp.

References GetTestSubDirectory(), and TestDynamicBackendUtils::IsBackendCompatibleTest().

Referenced by TEST_SUITE().

334 {
335  using namespace armnn;
336 
337  // The backend API version used for the tests
338  BackendVersion backendApiVersion{ 2, 4 };
339 
340  // Same backend and backend API versions are compatible with the backend API
341  BackendVersion sameBackendVersion{ 2, 4 };
342  CHECK(sameBackendVersion == backendApiVersion);
343  CHECK(sameBackendVersion <= backendApiVersion);
344  CHECK(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, sameBackendVersion) == true);
345 
346  // Backend versions that differ from the backend API version by major revision are not compatible
347  // with the backend API
348  BackendVersion laterMajorBackendVersion{ 3, 4 };
349  CHECK(!(laterMajorBackendVersion == backendApiVersion));
350  CHECK(!(laterMajorBackendVersion <= backendApiVersion));
351  CHECK(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMajorBackendVersion) == false);
352 
353  BackendVersion earlierMajorBackendVersion{ 1, 4 };
354  CHECK(!(earlierMajorBackendVersion == backendApiVersion));
355  CHECK(earlierMajorBackendVersion <= backendApiVersion);
356  CHECK(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion,
357  earlierMajorBackendVersion) == false);
358 
359  // Backend versions with the same major revision but later minor revision than
360  // the backend API version are not compatible with the backend API
361  BackendVersion laterMinorBackendVersion{ 2, 5 };
362  CHECK(!(laterMinorBackendVersion == backendApiVersion));
363  CHECK(!(laterMinorBackendVersion <= backendApiVersion));
364  CHECK(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMinorBackendVersion) == false);
365 
366  // Backend versions with the same major revision but earlier minor revision than
367  // the backend API version are compatible with the backend API
368  BackendVersion earlierMinorBackendVersion{ 2, 3 };
369  CHECK(!(earlierMinorBackendVersion == backendApiVersion));
370  CHECK(earlierMinorBackendVersion <= backendApiVersion);
371  CHECK(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, earlierMinorBackendVersion) == true);
372 }
Copyright (c) 2021 ARM Limited and Contributors.
static bool IsBackendCompatibleTest(const armnn::BackendVersion &backendApiVersion, const armnn::BackendVersion &backendVersion)

◆ CloseInvalidHandleTestImpl()

void CloseInvalidHandleTestImpl ( )

Definition at line 211 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

212 {
213  using namespace armnn;
214 
215  // This calls must silently handle invalid handles and complete successfully (no segfaults, etc.)
217 }
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ CreateDynamicBackendObjectInvalidHandleTestImpl()

void CreateDynamicBackendObjectInvalidHandleTestImpl ( )

Definition at line 425 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

426 {
427  // Invalid (null) shared object handle
428 
429  using namespace armnn;
430 
431  void* sharedObjectHandle = nullptr;
432  DynamicBackendPtr dynamicBackend;
433  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), InvalidArgumentException);
434  CHECK((dynamicBackend == nullptr));
435 }
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface1TestImpl()

void CreateDynamicBackendObjectInvalidInterface1TestImpl ( )

Definition at line 437 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

438 {
439  // Valid shared object handle
440  // Wrong (not C-style) name mangling
441 
442  using namespace armnn;
443 
444  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
445  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend1FileName);
446 
447  void* sharedObjectHandle = nullptr;
448  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
449  CHECK((sharedObjectHandle != nullptr));
450 
451  DynamicBackendPtr dynamicBackend;
452  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
453  CHECK((dynamicBackend == nullptr));
454 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface2TestImpl()

void CreateDynamicBackendObjectInvalidInterface2TestImpl ( )

Definition at line 456 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

457 {
458  // Valid shared object handle
459  // Correct name mangling
460  // Wrong interface (missing GetBackendId())
461 
462  using namespace armnn;
463 
464  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
465  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend2FileName);
466 
467  void* sharedObjectHandle = nullptr;
468  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
469  CHECK((sharedObjectHandle != nullptr));
470 
471  DynamicBackendPtr dynamicBackend;
472  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
473  CHECK((dynamicBackend == nullptr));
474 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface3TestImpl()

void CreateDynamicBackendObjectInvalidInterface3TestImpl ( )

Definition at line 476 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

477 {
478  // Valid shared object handle
479  // Correct name mangling
480  // Wrong interface (missing GetVersion())
481 
482  using namespace armnn;
483 
484  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
485  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend3FileName);
486 
487  void* sharedObjectHandle = nullptr;
488  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
489  CHECK((sharedObjectHandle != nullptr));
490 
491  DynamicBackendPtr dynamicBackend;
492  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
493  CHECK((dynamicBackend == nullptr));
494 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface4TestImpl()

void CreateDynamicBackendObjectInvalidInterface4TestImpl ( )

Definition at line 496 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

497 {
498  // Valid shared object handle
499  // Correct name mangling
500  // Wrong interface (missing BackendFactory())
501 
502  using namespace armnn;
503 
504  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
505  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend4FileName);
506 
507  void* sharedObjectHandle = nullptr;
508  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
509  CHECK((sharedObjectHandle != nullptr));
510 
511  DynamicBackendPtr dynamicBackend;
512  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
513  CHECK((dynamicBackend == nullptr));
514 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface5TestImpl()

void CreateDynamicBackendObjectInvalidInterface5TestImpl ( )

Definition at line 516 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

517 {
518  // Valid shared object handle
519  // Correct name mangling
520  // Correct interface
521  // Invalid (null) backend id returned by GetBackendId()
522 
523  using namespace armnn;
524 
525  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
526  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend5FileName);
527 
528  void* sharedObjectHandle = nullptr;
529  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
530  CHECK((sharedObjectHandle != nullptr));
531 
532  DynamicBackendPtr dynamicBackend;
533  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
534  CHECK((dynamicBackend == nullptr));
535 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendObjectInvalidInterface6TestImpl()

void CreateDynamicBackendObjectInvalidInterface6TestImpl ( )

Definition at line 537 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

538 {
539  // Valid shared object handle
540  // Correct name mangling
541  // Correct interface
542  // Invalid (null) backend instance returned by BackendFactory()
543 
544  using namespace armnn;
545 
546  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
547  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend6FileName);
548 
549  void* sharedObjectHandle = nullptr;
550  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
551  CHECK((sharedObjectHandle != nullptr));
552 
553  DynamicBackendPtr dynamicBackend;
554  CHECK_NOTHROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)));
555  CHECK((dynamicBackend != nullptr));
556 
557  BackendId dynamicBackendId;
558  CHECK_NOTHROW(dynamicBackendId = dynamicBackend->GetBackendId());
559  CHECK((dynamicBackendId == "InvalidTestDynamicBackend"));
560 
561  BackendVersion dynamicBackendVersion;
562  CHECK_NOTHROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
563  CHECK((dynamicBackendVersion >= BackendVersion({ 1, 0 })));
564 
565  IBackendInternalUniquePtr dynamicBackendInstance1;
566  CHECK_THROWS_AS(dynamicBackendInstance1 = dynamicBackend->GetBackend(), RuntimeException);
567  CHECK((dynamicBackendInstance1 == nullptr));
568 
569  BackendRegistry::FactoryFunction dynamicBackendFactoryFunction = nullptr;
570  CHECK_NOTHROW(dynamicBackendFactoryFunction = dynamicBackend->GetFactoryFunction());
571  CHECK((dynamicBackendFactoryFunction != nullptr));
572 
573  IBackendInternalUniquePtr dynamicBackendInstance2;
574  CHECK_THROWS_AS(dynamicBackendInstance2 = dynamicBackendFactoryFunction(), RuntimeException);
575  CHECK((dynamicBackendInstance2 == nullptr));
576 }
std::function< PointerType()> FactoryFunction
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr
std::unique_ptr< IBackendInternal > IBackendInternalUniquePtr

◆ CreateDynamicBackendObjectInvalidInterface7TestImpl()

void CreateDynamicBackendObjectInvalidInterface7TestImpl ( )

Definition at line 578 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

579 {
580  // Valid shared object handle
581  // Correct name mangling
582  // Correct interface
583  // Invalid (incompatible backend API version) backend instance returned by BackendFactory()
584 
585  using namespace armnn;
586 
587  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
588  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend7FileName);
589 
590  void* sharedObjectHandle = nullptr;
591  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
592  CHECK((sharedObjectHandle != nullptr));
593 
594  DynamicBackendPtr dynamicBackend;
595  CHECK_THROWS_AS(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
596  CHECK((dynamicBackend == nullptr));
597 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< DynamicBackend > DynamicBackendPtr

◆ CreateDynamicBackendsAllInvalidTestImpl()

void CreateDynamicBackendsAllInvalidTestImpl ( )

Definition at line 863 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

864 {
865  using namespace armnn;
866 
867  std::vector<std::string> sharedObjects
868  {
869  "InvalidSharedObject1",
870  "InvalidSharedObject2",
871  "InvalidSharedObject3",
872  };
873  std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
874 
875  CHECK(dynamicBackends.empty());
876 }
static std::vector< DynamicBackendPtr > CreateDynamicBackends(const std::vector< std::string > &sharedObjects)
Copyright (c) 2021 ARM Limited and Contributors.

◆ CreateDynamicBackendsMixedTypesTestImpl()

void CreateDynamicBackendsMixedTypesTestImpl ( )

Definition at line 878 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

879 {
880  using namespace armnn;
881  using namespace fs;
882 
883  std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
884  std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
885  CHECK(exists(testDynamicBackendsSubDir5));
886  CHECK(exists(testDynamicBackendsSubDir6));
887 
888  std::string testValidBackend2FilePath = GetTestFilePath(testDynamicBackendsSubDir5,
889  g_TestValidBackend2FileName);
890  std::string testInvalidBackend8FilePath = GetTestFilePath(testDynamicBackendsSubDir5,
891  g_TestInvalidBackend8FileName);
892  std::string testInvalidBackend9FilePath = GetTestFilePath(testDynamicBackendsSubDir6,
893  g_TestInvalidBackend9FileName);
894  CHECK(exists(testValidBackend2FilePath));
895  CHECK(exists(testInvalidBackend8FilePath));
896  CHECK(exists(testInvalidBackend9FilePath));
897 
898  std::vector<std::string> sharedObjects
899  {
900  testValidBackend2FilePath, // Arm_TestValid2_backend.so -> valid (basic backend name)
901  testInvalidBackend8FilePath, // Arm_TestInvalid8_backend.so -> not valid (invalid backend id)
902  testInvalidBackend9FilePath, // Arm_TestInvalid9_backend.so -> not valid (incompatible version)
903  "InvalidSharedObject", // The file does not exist
904  };
905  std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
906 
907  CHECK(dynamicBackends.size() == 1);
908  CHECK((dynamicBackends[0] != nullptr));
909  CHECK((dynamicBackends[0]->GetBackendId() == "TestValid2"));
910 }
std::string GetTestSubDirectory(const std::string &subdir)
static std::vector< DynamicBackendPtr > CreateDynamicBackends(const std::vector< std::string > &sharedObjects)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
const char * GetBackendId()

◆ CreateDynamicBackendsNoPathsTestImpl()

void CreateDynamicBackendsNoPathsTestImpl ( )

Definition at line 854 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

855 {
856  using namespace armnn;
857 
858  std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends({});
859 
860  CHECK(dynamicBackends.empty());
861 }
static std::vector< DynamicBackendPtr > CreateDynamicBackends(const std::vector< std::string > &sharedObjects)
Copyright (c) 2021 ARM Limited and Contributors.

◆ CreateDynamicBackendsTestImpl()

void CreateDynamicBackendsTestImpl ( )

Definition at line 791 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

792 {
793  using namespace armnn;
794  using namespace fs;
795 
796  // The test covers four directories:
797  // <unit test path>/src/backends/backendsCommon/test/
798  // ├─ backendsTestPath5/ -> exists, contains files
799  // ├─ backendsTestPath6/ -> exists, contains files
800  // ├─ backendsTestPath7/ -> exists, but empty
801  // └─ backendsTestPath8/ -> does not exist
802  //
803  // The test sub-directory backendsTestPath5/ contains the following test files:
804  //
805  // Arm_TestValid2_backend.so -> valid (basic backend name)
806  // Arm_TestValid3_backend.so -> valid (basic backend name)
807  // Arm_TestInvalid8_backend.so -> not valid (invalid backend id)
808  //
809  // The test sub-directory backendsTestPath6/ contains the following test files:
810  //
811  // Arm_TestValid2_backend.so -> valid (but duplicated from backendsTestPath5/)
812  // Arm_TestValid4_backend.so -> valid (it has a different filename,
813  // but it has the same backend id of Arm_TestValid2_backend.so
814  // and the same version)
815  // Arm_TestValid5_backend.so -> valid (basic backend name)
816  // Arm_TestInvalid9_backend.so -> not valid (it has a different filename,
817  // but it has the same backend id of Arm_TestValid2_backend.so
818  // and a version incompatible with the Backend API)
819 
820  std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
821  std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
822  std::string testDynamicBackendsSubDir7 = GetTestSubDirectory(g_TestDynamicBackendsSubDir7);
823  std::string testDynamicBackendsSubDir8 = GetTestSubDirectory(g_TestDynamicBackendsSubDir8);
824  CHECK(exists(testDynamicBackendsSubDir5));
825  CHECK(exists(testDynamicBackendsSubDir6));
826  CHECK(exists(testDynamicBackendsSubDir7));
827  CHECK(!exists(testDynamicBackendsSubDir8));
828 
829  std::vector<std::string> backendPaths
830  {
831  testDynamicBackendsSubDir5,
832  testDynamicBackendsSubDir6,
833  testDynamicBackendsSubDir7,
834  testDynamicBackendsSubDir8
835  };
836  std::vector<std::string> sharedObjects = DynamicBackendUtils::GetSharedObjects(backendPaths);
837  std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
838 
839  CHECK(dynamicBackends.size() == 5);
840  CHECK((dynamicBackends[0] != nullptr));
841  CHECK((dynamicBackends[1] != nullptr));
842  CHECK((dynamicBackends[2] != nullptr));
843  CHECK((dynamicBackends[3] != nullptr));
844  CHECK((dynamicBackends[4] != nullptr));
845 
846  // Duplicates are allowed here, they will be skipped later during the backend registration
847  CHECK((dynamicBackends[0]->GetBackendId() == "TestValid2"));
848  CHECK((dynamicBackends[1]->GetBackendId() == "TestValid3"));
849  CHECK((dynamicBackends[2]->GetBackendId() == "TestValid2")); // From duplicate Arm_TestValid2_backend.so
850  CHECK((dynamicBackends[3]->GetBackendId() == "TestValid2")); // From Arm_TestValid4_backend.so
851  CHECK((dynamicBackends[4]->GetBackendId() == "TestValid5"));
852 }
std::string GetTestSubDirectory(const std::string &subdir)
static std::vector< DynamicBackendPtr > CreateDynamicBackends(const std::vector< std::string > &sharedObjects)
Copyright (c) 2021 ARM Limited and Contributors.
const char * GetBackendId()
static std::vector< std::string > GetSharedObjects(const std::vector< std::string > &backendPaths)

◆ GetBackendPathsOverrideTestImpl()

void GetBackendPathsOverrideTestImpl ( )

Definition at line 679 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

680 {
681  using namespace armnn;
682  using namespace fs;
683 
684  std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
685  std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
686 
687  CHECK(exists(subDir1));
688  CHECK(!exists(subDir4));
689 
690  // Override with valid path
691  std::vector<std::string> validResult = DynamicBackendUtils::GetBackendPaths(subDir1);
692  CHECK(validResult.size() == 1);
693  CHECK(validResult[0] == subDir1);
694 
695  // Override with invalid path
696  std::vector<std::string> invalidResult = DynamicBackendUtils::GetBackendPaths(subDir4);
697  CHECK(invalidResult.empty());
698 }
std::string GetTestSubDirectory(const std::string &subdir)
Copyright (c) 2021 ARM Limited and Contributors.
static std::vector< std::string > GetBackendPaths(const std::string &overrideBackendPath="")

◆ GetBackendPathsTestImpl()

void GetBackendPathsTestImpl ( )

Definition at line 599 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

600 {
601  using namespace armnn;
602  using namespace fs;
603 
604  // The test covers four directories:
605  // <unit test path>/src/backends/backendsCommon/test/
606  // ├─ backendsTestPath1/ -> exists, contains files
607  // ├─ backendsTestPath2/ -> exists, contains files
608  // ├─ backendsTestPath3/ -> exists, but empty
609  // └─ backendsTestPath4/ -> does not exist
610 
611  std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
612  std::string subDir2 = GetTestSubDirectory(g_TestDynamicBackendsSubDir2);
613  std::string subDir3 = GetTestSubDirectory(g_TestDynamicBackendsSubDir3);
614  std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
615 
616  CHECK(exists(subDir1));
617  CHECK(exists(subDir2));
618  CHECK(exists(subDir3));
619  CHECK(!exists(subDir4));
620 
621  // No path
623 
624  // Malformed path
625  std::string malformedDir(subDir1 + "/" + subDir1);
626  CHECK(TestDynamicBackendUtils::GetBackendPathsImplTest(malformedDir).size()==0);
627 
628  // Single valid path
629  std::vector<std::string> DynamicBackendPaths2 = TestDynamicBackendUtils::GetBackendPathsImplTest(subDir1);
630  CHECK(DynamicBackendPaths2.size() == 1);
631  CHECK(DynamicBackendPaths2[0] == subDir1);
632 
633  // Multiple equal and valid paths
634  std::string multipleEqualDirs(subDir1 + ":" + subDir1);
635  std::vector<std::string> DynamicBackendPaths3 = TestDynamicBackendUtils::GetBackendPathsImplTest(multipleEqualDirs);
636  CHECK(DynamicBackendPaths3.size() == 1);
637  CHECK(DynamicBackendPaths3[0] == subDir1);
638 
639  // Multiple empty paths
641 
642  // Multiple valid paths
643  std::string multipleValidPaths(subDir1 + ":" + subDir2 + ":" + subDir3);
644  std::vector<std::string> DynamicBackendPaths5 =
646  CHECK(DynamicBackendPaths5.size() == 3);
647  CHECK(DynamicBackendPaths5[0] == subDir1);
648  CHECK(DynamicBackendPaths5[1] == subDir2);
649  CHECK(DynamicBackendPaths5[2] == subDir3);
650 
651  // Valid among empty paths
652  std::string validAmongEmptyDirs("::" + subDir1 + ":");
653  std::vector<std::string> DynamicBackendPaths6 =
655  CHECK(DynamicBackendPaths6.size() == 1);
656  CHECK(DynamicBackendPaths6[0] == subDir1);
657 
658  // Invalid among empty paths
659  std::string invalidAmongEmptyDirs(":" + subDir4 + "::");
660  CHECK(TestDynamicBackendUtils::GetBackendPathsImplTest(invalidAmongEmptyDirs).empty());
661 
662  // Valid, invalid and empty paths
663  std::string validInvalidEmptyDirs(subDir1 + ":" + subDir4 + ":");
664  std::vector<std::string> DynamicBackendPaths8 =
666  CHECK(DynamicBackendPaths8.size() == 1);
667  CHECK(DynamicBackendPaths8[0] == subDir1);
668 
669  // Mix of duplicates of valid, invalid and empty paths
670  std::string duplicateValidInvalidEmptyDirs(validInvalidEmptyDirs + ":" + validInvalidEmptyDirs + ":" +
671  subDir2 + ":" + subDir2);
672  std::vector<std::string> DynamicBackendPaths9 =
673  TestDynamicBackendUtils::GetBackendPathsImplTest(duplicateValidInvalidEmptyDirs);
674  CHECK(DynamicBackendPaths9.size() == 2);
675  CHECK(DynamicBackendPaths9[0] == subDir1);
676  CHECK(DynamicBackendPaths9[1] == subDir2);
677 }
std::string GetTestSubDirectory(const std::string &subdir)
Copyright (c) 2021 ARM Limited and Contributors.
static std::vector< std::string > GetBackendPathsImplTest(const std::string &path)

◆ GetBasePath()

std::string GetBasePath ( const std::string &  basePath)

Definition at line 135 of file DynamicBackendTests.hpp.

References DYNAMIC_BACKEND_BUILD_DIR, and GetUnitTestExecutablePath().

Referenced by GetDynamicBackendsBasePath(), and GetTestDirectoryBasePath().

136 {
137  using namespace fs;
138  // What we're looking for here is the location of the UnitTests executable.
139  // Fall back value of current directory.
140  path programLocation = GetUnitTestExecutablePath();
141  if (!exists(programLocation))
142  {
143  programLocation = DYNAMIC_BACKEND_BUILD_DIR;
144  }
145 
146  // This is the base path from the build where the test libraries were built.
147  path sharedObjectPath = programLocation.append(basePath);
148  REQUIRE_MESSAGE(exists(sharedObjectPath),
149  "Base path for shared objects does not exist: " + sharedObjectPath.string());
150  return sharedObjectPath.string();
151 }
std::string GetUnitTestExecutablePath()
#define DYNAMIC_BACKEND_BUILD_DIR

◆ GetDynamicBackendsBasePath()

std::string GetDynamicBackendsBasePath ( )

Definition at line 158 of file DynamicBackendTests.hpp.

References GetBasePath().

Referenced by RuntimeInvalidOverridePathTestImpl().

159 {
160  return GetBasePath(g_DynamicBackendsBaseDir);
161 }
std::string GetBasePath(const std::string &basePath)

◆ GetNameMangledEntryPointTestImpl()

void GetNameMangledEntryPointTestImpl ( )

Definition at line 270 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

271 {
272  using namespace armnn;
273 
274  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
275  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
276 
277  void* sharedObjectHandle = nullptr;
278  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
279  CHECK((sharedObjectHandle != nullptr));
280 
281  using TestFunctionType = int(*)(int);
282  TestFunctionType testFunctionPointer = nullptr;
283  CHECK_THROWS_AS(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
284  "TestFunction2"),
286  CHECK((testFunctionPointer == nullptr));
287 
288  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
289 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ GetNoExternEntryPointTestImpl()

void GetNoExternEntryPointTestImpl ( )

Definition at line 291 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

292 {
293  using namespace armnn;
294 
295  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
296  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
297 
298  void* sharedObjectHandle = nullptr;
299  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
300  CHECK((sharedObjectHandle != nullptr));
301 
302  using TestFunctionType = int(*)(int);
303  TestFunctionType testFunctionPointer = nullptr;
304  CHECK_THROWS_AS(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
305  "TestFunction3"),
307  CHECK((testFunctionPointer == nullptr));
308 
309  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
310 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ GetNotExistingEntryPointTestImpl()

void GetNotExistingEntryPointTestImpl ( )

Definition at line 312 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

313 {
314  using namespace armnn;
315 
316  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
317  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
318 
319  void* sharedObjectHandle = nullptr;
320  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
321  CHECK((sharedObjectHandle != nullptr));
322 
323  using TestFunctionType = int(*)(int);
324  TestFunctionType testFunctionPointer = nullptr;
325  CHECK_THROWS_AS(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
326  "TestFunction4"),
328  CHECK((testFunctionPointer == nullptr));
329 
330  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
331 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ GetSharedObjectsTestImpl()

void GetSharedObjectsTestImpl ( )

Definition at line 700 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

701 {
702  using namespace armnn;
703  using namespace fs;
704 
705  // The test covers four directories:
706  // <unit test path>/src/backends/backendsCommon/test/
707  // ├─ backendsTestPath1/ -> exists, contains files
708  // ├─ backendsTestPath2/ -> exists, contains files
709  // ├─ backendsTestPath3/ -> exists, but empty
710  // └─ backendsTestPath4/ -> does not exist
711  //
712  // The test sub-directory backendsTestPath1/ contains the following test files:
713  //
714  // Arm_GpuAcc_backend.so -> valid (basic backend name)
715  // Arm_GpuAcc_backend.so.1 -> valid (single field version number)
716  // Arm_GpuAcc_backend.so.1.2 -> valid (multiple field version number)
717  // Arm_GpuAcc_backend.so.1.2.3 -> valid (multiple field version number)
718  // Arm_GpuAcc_backend.so.10.1.27 -> valid (Multiple digit version)
719  // Arm_GpuAcc_backend.so.10.1.33. -> not valid (dot not followed by version number)
720  // Arm_GpuAcc_backend.so.3.4..5 -> not valid (dot not followed by version number)
721  // Arm_GpuAcc_backend.so.1,1.1 -> not valid (comma instead of dot in the version)
722  //
723  // Arm123_GpuAcc_backend.so -> valid (digits in vendor name are allowed)
724  // Arm_GpuAcc456_backend.so -> valid (digits in backend id are allowed)
725  // Arm%Co_GpuAcc_backend.so -> not valid (invalid character in vendor name)
726  // Arm_Gpu.Acc_backend.so -> not valid (invalid character in backend id)
727  //
728  // GpuAcc_backend.so -> not valid (missing vendor name)
729  // _GpuAcc_backend.so -> not valid (missing vendor name)
730  // Arm__backend.so -> not valid (missing backend id)
731  // Arm_GpuAcc.so -> not valid (missing "backend" at the end)
732  // __backend.so -> not valid (missing vendor name and backend id)
733  // __.so -> not valid (missing all fields)
734  //
735  // Arm_GpuAcc_backend -> not valid (missing at least ".so" at the end)
736  // Arm_GpuAcc_backend_v1.2.so -> not valid (extra version info at the end)
737  //
738  // The test sub-directory backendsTestPath1/ contains the following test files:
739  //
740  // Arm_CpuAcc_backend.so -> valid (basic backend name)
741  // Arm_CpuAcc_backend.so.1 -> Arm_CpuAcc_backend.so -> valid (symlink to valid backend file)
742  // Arm_CpuAcc_backend.so.1.2 -> Arm_CpuAcc_backend.so.1 -> valid (symlink to valid symlink)
743  // Arm_CpuAcc_backend.so.1.2.3 -> Arm_CpuAcc_backend.so.1.2 -> valid (symlink to valid symlink)
744  //
745  // Arm_no_backend.so -> nothing -> not valid (symlink resolves to non-existent file)
746  //
747  // Arm_GpuAcc_backend.so -> valid (but duplicated from backendsTestPath1/)
748 
749  std::string testDynamicBackendsSubDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
750  std::string testDynamicBackendsSubDir2 = GetTestSubDirectory(g_TestDynamicBackendsSubDir2);
751  std::string testDynamicBackendsSubDir3 = GetTestSubDirectory(g_TestDynamicBackendsSubDir3);
752  std::string testDynamicBackendsSubDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
753  CHECK(exists(testDynamicBackendsSubDir1));
754  CHECK(exists(testDynamicBackendsSubDir2));
755  CHECK(exists(testDynamicBackendsSubDir3));
756  CHECK(!exists(testDynamicBackendsSubDir4));
757 
758  std::vector<std::string> backendPaths
759  {
760  testDynamicBackendsSubDir1,
761  testDynamicBackendsSubDir2,
762  testDynamicBackendsSubDir3,
763  testDynamicBackendsSubDir4
764  };
765  std::vector<std::string> sharedObjects = DynamicBackendUtils::GetSharedObjects(backendPaths);
766  std::vector<fs::path> expectedSharedObjects
767  {
768  path(testDynamicBackendsSubDir1 + "Arm123_GpuAcc_backend.so"), // Digits in vendor name are allowed
769  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc456_backend.so"), // Digits in backend id are allowed
770  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc_backend.so"), // Basic backend name
771  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc_backend.so.1"), // Single field version number
772  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc_backend.so.1.2"), // Multiple field version number
773  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc_backend.so.1.2.3"), // Multiple field version number
774  path(testDynamicBackendsSubDir1 + "Arm_GpuAcc_backend.so.10.1.27"), // Multiple digit version
775  path(testDynamicBackendsSubDir2 + "Arm_CpuAcc_backend.so"), // Duplicate symlinks removed
776  path(testDynamicBackendsSubDir2 + "Arm_GpuAcc_backend.so") // Duplicates on different paths are allowed
777  };
778 
779  CHECK(sharedObjects.size() == expectedSharedObjects.size());
780  CHECK(fs::equivalent(path(sharedObjects[0]), expectedSharedObjects[0]));
781  CHECK(fs::equivalent(path(sharedObjects[1]), expectedSharedObjects[1]));
782  CHECK(fs::equivalent(path(sharedObjects[2]), expectedSharedObjects[2]));
783  CHECK(fs::equivalent(path(sharedObjects[3]), expectedSharedObjects[3]));
784  CHECK(fs::equivalent(path(sharedObjects[4]), expectedSharedObjects[4]));
785  CHECK(fs::equivalent(path(sharedObjects[5]), expectedSharedObjects[5]));
786  CHECK(fs::equivalent(path(sharedObjects[6]), expectedSharedObjects[6]));
787  CHECK(fs::equivalent(path(sharedObjects[7]), expectedSharedObjects[7]));
788  CHECK(fs::equivalent(path(sharedObjects[8]), expectedSharedObjects[8]));
789 }
std::string GetTestSubDirectory(const std::string &subdir)
Copyright (c) 2021 ARM Limited and Contributors.
static std::vector< std::string > GetSharedObjects(const std::vector< std::string > &backendPaths)

◆ GetTestDirectoryBasePath()

std::string GetTestDirectoryBasePath ( )

Definition at line 153 of file DynamicBackendTests.hpp.

References GetBasePath().

Referenced by GetTestSubDirectory().

154 {
155  return GetBasePath(g_TestBaseDir);
156 }
std::string GetBasePath(const std::string &basePath)

◆ GetTestFilePath()

std::string GetTestFilePath ( const std::string &  directory,
const std::string &  fileName 
)

Definition at line 186 of file DynamicBackendTests.hpp.

187 {
188  using namespace fs;
189 
190  path directoryPath(directory);
191  path fileNamePath = directoryPath.append(fileName);
192  CHECK(exists(fileNamePath));
193 
194  return fileNamePath.string();
195 }

◆ GetTestSubDirectory() [1/2]

std::string GetTestSubDirectory ( const std::string &  subdir)

Definition at line 163 of file DynamicBackendTests.hpp.

References GetTestDirectoryBasePath().

Referenced by BackendVersioningTestImpl(), CreateDynamicBackendObjectInvalidInterface1TestImpl(), CreateDynamicBackendObjectInvalidInterface2TestImpl(), CreateDynamicBackendObjectInvalidInterface3TestImpl(), CreateDynamicBackendObjectInvalidInterface4TestImpl(), CreateDynamicBackendObjectInvalidInterface5TestImpl(), CreateDynamicBackendObjectInvalidInterface6TestImpl(), CreateDynamicBackendObjectInvalidInterface7TestImpl(), CreateDynamicBackendsMixedTypesTestImpl(), CreateDynamicBackendsTestImpl(), GetBackendPathsOverrideTestImpl(), GetBackendPathsTestImpl(), GetNameMangledEntryPointTestImpl(), GetNoExternEntryPointTestImpl(), GetNotExistingEntryPointTestImpl(), GetSharedObjectsTestImpl(), GetValidEntryPointTestImpl(), OpenCloseHandleTestImpl(), OpenNotSharedObjectTestImpl(), RegisterMultipleInvalidDynamicBackendsTestImpl(), RuntimeDuplicateDynamicBackendsTestImpl(), RuntimeDynamicBackendsTestImpl(), RuntimeInvalidDynamicBackendsTestImpl(), and RuntimeInvalidOverridePathTestImpl().

164 {
165  using namespace fs;
166 
167  std::string testDynamicBackendsBaseDir = GetTestDirectoryBasePath();
168  path testDynamicBackendsBasePath(testDynamicBackendsBaseDir);
169  path testDynamicBackendsSubDir = testDynamicBackendsBasePath.append(subdir);
170  // Do not check that the sub-directory exists because for testing reasons we may use non-existing paths
171 
172  return testDynamicBackendsSubDir.string();
173 }
std::string GetTestDirectoryBasePath()

◆ GetTestSubDirectory() [2/2]

std::string GetTestSubDirectory ( const std::string &  basePath,
const std::string &  subdir 
)

Definition at line 175 of file DynamicBackendTests.hpp.

176 {
177  using namespace fs;
178 
179  path testDynamicBackendsBasePath(basePath);
180  path testDynamicBackendsSubDir = testDynamicBackendsBasePath.append(subdir);
181  // Do not check that the sub-directory exists because for testing reasons we may use non-existing paths
182 
183  return testDynamicBackendsSubDir.string();
184 }

◆ GetUnitTestExecutablePath()

std::string GetUnitTestExecutablePath ( )

Definition at line 123 of file DynamicBackendTests.hpp.

Referenced by GetBasePath(), and TestBackendRegistry::~TestBackendRegistry().

124 {
125  char buffer[PATH_MAX] = "";
126  if (readlink("/proc/self/exe", buffer, PATH_MAX) != -1)
127  {
128  fs::path executablePath(buffer);
129  return executablePath.parent_path();
130  }
131  return "";
132 }

◆ GetValidEntryPointTestImpl()

void GetValidEntryPointTestImpl ( )

Definition at line 249 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

250 {
251  using namespace armnn;
252 
253  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
254  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
255 
256  void* sharedObjectHandle = nullptr;
257  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
258  CHECK((sharedObjectHandle != nullptr));
259 
260  using TestFunctionType = int(*)(int);
261  TestFunctionType testFunctionPointer = nullptr;
262  CHECK_NOTHROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
263  "TestFunction1"));
264  CHECK((testFunctionPointer != nullptr));
265  CHECK(testFunctionPointer(7) == 7);
266 
267  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
268 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ OpenCloseHandleTestImpl()

void OpenCloseHandleTestImpl ( )

Definition at line 197 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

198 {
199  using namespace armnn;
200 
201  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
202  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
203 
204  void* sharedObjectHandle = nullptr;
205  CHECK_NOTHROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
206  CHECK((sharedObjectHandle != nullptr));
207 
208  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
209 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.
static void CloseHandle(const void *sharedObjectHandle)

◆ OpenEmptyFileNameTestImpl()

void OpenEmptyFileNameTestImpl ( )

Definition at line 219 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

220 {
221  using namespace armnn;
222 
223  void* sharedObjectHandle = nullptr;
224  CHECK_THROWS_AS(sharedObjectHandle = DynamicBackendUtils::OpenHandle(""), RuntimeException);
225  CHECK((sharedObjectHandle == nullptr));
226 }
static void * OpenHandle(const std::string &sharedObjectPath)
Copyright (c) 2021 ARM Limited and Contributors.

◆ OpenNotExistingFileTestImpl()

void OpenNotExistingFileTestImpl ( )

Definition at line 228 of file DynamicBackendTests.hpp.

Referenced by TEST_SUITE().

229 {
230  using namespace armnn;
231 
232  void* sharedObjectHandle = nullptr;
233  CHECK_THROWS_AS(sharedObjectHandle = DynamicBackendUtils::OpenHandle("NotExistingFileName"), RuntimeException);
234  CHECK((sharedObjectHandle == nullptr));
235 }
static void * OpenHandle(const std::string &sharedObjectPath)
Copyright (c) 2021 ARM Limited and Contributors.

◆ OpenNotSharedObjectTestImpl()

void OpenNotSharedObjectTestImpl ( )

Definition at line 237 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

238 {
239  using namespace armnn;
240 
241  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
242  std::string notSharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestNoSharedObjectFileName);
243 
244  void* sharedObjectHandle = nullptr;
245  CHECK_THROWS_AS(sharedObjectHandle = DynamicBackendUtils::OpenHandle(notSharedObjectFilePath), RuntimeException);
246  CHECK((sharedObjectHandle == nullptr));
247 }
std::string GetTestSubDirectory(const std::string &subdir)
static void * OpenHandle(const std::string &sharedObjectPath)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.

◆ RegisterMultipleInvalidDynamicBackendsTestImpl()

void RegisterMultipleInvalidDynamicBackendsTestImpl ( )

Definition at line 1183 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

1184 {
1185  using namespace armnn;
1186  using namespace fs;
1187 
1188  // Try to register many invalid dynamic backends
1189 
1190  // The test covers one directory:
1191  // <unit test path>/src/backends/backendsCommon/test/
1192  // └─ backendsTestPath9/ -> exists, contains files
1193  //
1194  // The test sub-directory backendsTestPath9/ contains the following test files:
1195  //
1196  // Arm_TestInvalid10_backend.so -> not valid (invalid backend id)
1197  // Arm_TestInvalid11_backend.so -> not valid (invalid backend id)
1198 
1199  std::string testDynamicBackendsSubDir9 = GetTestSubDirectory(g_TestDynamicBackendsSubDir9);
1200  CHECK(exists(testDynamicBackendsSubDir9));
1201 
1202  std::string testInvalidBackend10FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
1203  g_TestInvalidBackend10FileName);
1204  std::string testInvalidBackend11FilePath = GetTestFilePath(testDynamicBackendsSubDir9,
1205  g_TestInvalidBackend11FileName);
1206  CHECK(exists(testInvalidBackend10FilePath));
1207  CHECK(exists(testInvalidBackend11FilePath));
1208 
1209  std::vector<std::string> sharedObjects
1210  {
1211  testInvalidBackend10FilePath,
1212  testInvalidBackend11FilePath,
1213  "InvalidSharedObject"
1214  };
1215  std::vector<DynamicBackendPtr> dynamicBackends = TestDynamicBackendUtils::CreateDynamicBackends(sharedObjects);
1216 
1217  CHECK(dynamicBackends.size() == 2);
1218  CHECK((dynamicBackends[0] != nullptr));
1219  CHECK((dynamicBackends[1] != nullptr));
1220 
1221  BackendId dynamicBackendId1 = dynamicBackends[0]->GetBackendId();
1222  BackendId dynamicBackendId2 = dynamicBackends[1]->GetBackendId();
1223  CHECK((dynamicBackendId1 == ""));
1224  CHECK((dynamicBackendId2 == "Unknown"));
1225 
1226  for (size_t i = 0; i < dynamicBackends.size(); i++)
1227  {
1228  BackendVersion dynamicBackendVersion = dynamicBackends[i]->GetBackendVersion();
1229  CHECK(TestDynamicBackendUtils::IsBackendCompatible(dynamicBackendVersion));
1230  }
1231 
1232  // Dummy registry used for testing
1233  BackendRegistry backendRegistry;
1234  CHECK(backendRegistry.Size() == 0);
1235 
1236  // Check that no dynamic backend got registered
1237  BackendIdSet registeredBackendIds = TestDynamicBackendUtils::RegisterDynamicBackendsImplTest(backendRegistry,
1238  dynamicBackends);
1239  CHECK(backendRegistry.Size() == 0);
1240  CHECK(registeredBackendIds.empty());
1241 }
static armnn::BackendIdSet RegisterDynamicBackendsImplTest(armnn::BackendRegistry &backendRegistry, const std::vector< armnn::DynamicBackendPtr > &dynamicBackends)
std::string GetTestSubDirectory(const std::string &subdir)
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
static bool IsBackendCompatible(const BackendVersion &backendVersion)
static std::vector< DynamicBackendPtr > CreateDynamicBackends(const std::vector< std::string > &sharedObjects)
std::string GetTestFilePath(const std::string &directory, const std::string &fileName)
Copyright (c) 2021 ARM Limited and Contributors.

◆ RuntimeDuplicateDynamicBackendsTestImpl()

void RuntimeDuplicateDynamicBackendsTestImpl ( )

Definition at line 1308 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

1309 {
1310  using namespace armnn;
1311  using namespace fs;
1312 
1313  // Swapping the backend registry storage for testing
1314  TestBackendRegistry testBackendRegistry;
1315 
1316  // This directory contains valid, invalid and duplicate backends
1317  std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
1318  CHECK(exists(testDynamicBackendsSubDir6));
1319 
1320  // Using the path override in CreationOptions to load some test dynamic backends
1321  IRuntime::CreationOptions creationOptions;
1322  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir6;
1323  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1324 
1325  std::vector<BackendId> expectedRegisteredbackendIds
1326  {
1327  "TestValid2",
1328  "TestValid5"
1329  };
1330 
1331  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1332  CHECK(backendRegistry.Size() == expectedRegisteredbackendIds.size());
1333 
1334  BackendIdSet backendIds = backendRegistry.GetBackendIds();
1335  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1336  {
1337  CHECK((backendIds.find(expectedRegisteredbackendId) != backendIds.end()));
1338  }
1339 
1340  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1341  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1342  CHECK(supportedBackendIds.size() == expectedRegisteredbackendIds.size());
1343  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1344  {
1345  CHECK((supportedBackendIds.find(expectedRegisteredbackendId) != supportedBackendIds.end()));
1346  }
1347 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:39
BackendIdSet GetBackendIds() const
std::string GetTestSubDirectory(const std::string &subdir)
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:30
BackendRegistry & BackendRegistryInstance()
Copyright (c) 2021 ARM Limited and Contributors.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:120
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeDynamicBackendsTestImpl()

void RuntimeDynamicBackendsTestImpl ( )

Definition at line 1267 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

1268 {
1269  using namespace armnn;
1270  using namespace fs;
1271 
1272  // Swapping the backend registry storage for testing
1273  TestBackendRegistry testBackendRegistry;
1274 
1275  // This directory contains valid and invalid backends
1276  std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
1277  CHECK(exists(testDynamicBackendsSubDir5));
1278 
1279  // Using the path override in CreationOptions to load some test dynamic backends
1280  IRuntime::CreationOptions creationOptions;
1281  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir5;
1282  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1283 
1284  std::vector<BackendId> expectedRegisteredbackendIds
1285  {
1286  "TestValid2",
1287  "TestValid3"
1288  };
1289 
1290  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1291  CHECK(backendRegistry.Size() == expectedRegisteredbackendIds.size());
1292 
1293  BackendIdSet backendIds = backendRegistry.GetBackendIds();
1294  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1295  {
1296  CHECK((backendIds.find(expectedRegisteredbackendId) != backendIds.end()));
1297  }
1298 
1299  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1300  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1301  CHECK(supportedBackendIds.size() == expectedRegisteredbackendIds.size());
1302  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1303  {
1304  CHECK((supportedBackendIds.find(expectedRegisteredbackendId) != supportedBackendIds.end()));
1305  }
1306 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:39
BackendIdSet GetBackendIds() const
std::string GetTestSubDirectory(const std::string &subdir)
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:30
BackendRegistry & BackendRegistryInstance()
Copyright (c) 2021 ARM Limited and Contributors.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:120
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeEmptyTestImpl()

void RuntimeEmptyTestImpl ( )

Definition at line 1245 of file DynamicBackendTests.hpp.

References armnn::BackendRegistryInstance(), DeviceSpec::GetSupportedBackends(), and BackendRegistry::Size().

Referenced by TEST_SUITE().

1246 {
1247  using namespace armnn;
1248 
1249  // Swapping the backend registry storage for testing
1250  TestBackendRegistry testBackendRegistry;
1251 
1252  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1253  CHECK(backendRegistry.Size() == 0);
1254 
1255  IRuntime::CreationOptions creationOptions;
1256  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1257 
1258  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1259  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1260  CHECK(supportedBackendIds.empty());
1261 
1262  CHECK(backendRegistry.Size() == 0);
1263 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:39
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:30
BackendRegistry & BackendRegistryInstance()
Copyright (c) 2021 ARM Limited and Contributors.
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeInvalidDynamicBackendsTestImpl()

void RuntimeInvalidDynamicBackendsTestImpl ( )

Definition at line 1349 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

Referenced by TEST_SUITE().

1350 {
1351  using namespace armnn;
1352  using namespace fs;
1353 
1354  // Swapping the backend registry storage for testing
1355  TestBackendRegistry testBackendRegistry;
1356 
1357  // This directory contains only invalid backends
1358  std::string testDynamicBackendsSubDir9 = GetTestSubDirectory(g_TestDynamicBackendsSubDir9);
1359  CHECK(exists(testDynamicBackendsSubDir9));
1360 
1361  // Using the path override in CreationOptions to load some test dynamic backends
1362  IRuntime::CreationOptions creationOptions;
1363  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir9;
1364  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1365 
1366  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1367  CHECK(backendRegistry.Size() == 0);
1368 
1369  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1370  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1371  CHECK(supportedBackendIds.empty());
1372 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:39
std::string GetTestSubDirectory(const std::string &subdir)
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:30
BackendRegistry & BackendRegistryInstance()
Copyright (c) 2021 ARM Limited and Contributors.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:120
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeInvalidOverridePathTestImpl()

void RuntimeInvalidOverridePathTestImpl ( )

Definition at line 1374 of file DynamicBackendTests.hpp.

References armnn::BackendRegistryInstance(), GetDynamicBackendsBasePath(), DeviceSpec::GetSupportedBackends(), GetTestSubDirectory(), IRuntime::CreationOptions::m_DynamicBackendsPath, and BackendRegistry::Size().

Referenced by TEST_SUITE().

1375 {
1376  using namespace armnn;
1377 
1378  // Swapping the backend registry storage for testing
1379  TestBackendRegistry testBackendRegistry;
1380 
1381  // Using the path override in CreationOptions to load some test dynamic backends
1382  IRuntime::CreationOptions creationOptions;
1383  creationOptions.m_DynamicBackendsPath = "InvalidPath";
1384  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1385 
1386  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1387  CHECK(backendRegistry.Size() == 0);
1388 
1389  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1390  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1391  CHECK(supportedBackendIds.empty());
1392 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:39
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:30
BackendRegistry & BackendRegistryInstance()
Copyright (c) 2021 ARM Limited and Contributors.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:120
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25