ArmNN
 21.02
DynamicBackendTests.hpp File Reference
#include <armnn/BackendRegistry.hpp>
#include <armnn/backends/DynamicBackend.hpp>
#include <armnn/ILayerSupport.hpp>
#include <armnn/utility/PolymorphicDowncast.hpp>
#include <backendsCommon/CpuTensorHandle.hpp>
#include <backendsCommon/DynamicBackendUtils.hpp>
#include <Filesystem.hpp>
#include <reference/workloads/RefConvolution2dWorkload.hpp>
#include <Runtime.hpp>
#include <string>
#include <memory>
#include <boost/test/unit_test.hpp>

Go to the source code of this file.

Classes

class  TestDynamicBackendUtils
 
class  TestBackendRegistry
 

Macros

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

Functions

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 24 of file DynamicBackendTests.hpp.

Referenced by GetBasePath().

Function Documentation

◆ BackendVersioningTestImpl()

void BackendVersioningTestImpl ( )

Definition at line 336 of file DynamicBackendTests.hpp.

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

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

◆ CloseInvalidHandleTestImpl()

void CloseInvalidHandleTestImpl ( )

Definition at line 214 of file DynamicBackendTests.hpp.

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

◆ CreateDynamicBackendObjectInvalidHandleTestImpl()

void CreateDynamicBackendObjectInvalidHandleTestImpl ( )

Definition at line 428 of file DynamicBackendTests.hpp.

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

◆ CreateDynamicBackendObjectInvalidInterface1TestImpl()

void CreateDynamicBackendObjectInvalidInterface1TestImpl ( )

Definition at line 440 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

441 {
442  // Valid shared object handle
443  // Wrong (not C-style) name mangling
444 
445  using namespace armnn;
446 
447  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
448  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend1FileName);
449 
450  void* sharedObjectHandle = nullptr;
451  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
452  BOOST_TEST((sharedObjectHandle != nullptr));
453 
454  DynamicBackendPtr dynamicBackend;
455  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
456  BOOST_TEST((dynamicBackend == nullptr));
457 }
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 459 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

460 {
461  // Valid shared object handle
462  // Correct name mangling
463  // Wrong interface (missing GetBackendId())
464 
465  using namespace armnn;
466 
467  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
468  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend2FileName);
469 
470  void* sharedObjectHandle = nullptr;
471  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
472  BOOST_TEST((sharedObjectHandle != nullptr));
473 
474  DynamicBackendPtr dynamicBackend;
475  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
476  BOOST_TEST((dynamicBackend == nullptr));
477 }
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 479 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

480 {
481  // Valid shared object handle
482  // Correct name mangling
483  // Wrong interface (missing GetVersion())
484 
485  using namespace armnn;
486 
487  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
488  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend3FileName);
489 
490  void* sharedObjectHandle = nullptr;
491  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
492  BOOST_TEST((sharedObjectHandle != nullptr));
493 
494  DynamicBackendPtr dynamicBackend;
495  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
496  BOOST_TEST((dynamicBackend == nullptr));
497 }
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 499 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

500 {
501  // Valid shared object handle
502  // Correct name mangling
503  // Wrong interface (missing BackendFactory())
504 
505  using namespace armnn;
506 
507  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
508  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend4FileName);
509 
510  void* sharedObjectHandle = nullptr;
511  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
512  BOOST_TEST((sharedObjectHandle != nullptr));
513 
514  DynamicBackendPtr dynamicBackend;
515  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
516  BOOST_TEST((dynamicBackend == nullptr));
517 }
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 519 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

520 {
521  // Valid shared object handle
522  // Correct name mangling
523  // Correct interface
524  // Invalid (null) backend id returned by GetBackendId()
525 
526  using namespace armnn;
527 
528  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
529  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend5FileName);
530 
531  void* sharedObjectHandle = nullptr;
532  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
533  BOOST_TEST((sharedObjectHandle != nullptr));
534 
535  DynamicBackendPtr dynamicBackend;
536  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
537  BOOST_TEST((dynamicBackend == nullptr));
538 }
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 540 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

541 {
542  // Valid shared object handle
543  // Correct name mangling
544  // Correct interface
545  // Invalid (null) backend instance returned by BackendFactory()
546 
547  using namespace armnn;
548 
549  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
550  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend6FileName);
551 
552  void* sharedObjectHandle = nullptr;
553  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
554  BOOST_TEST((sharedObjectHandle != nullptr));
555 
556  DynamicBackendPtr dynamicBackend;
557  BOOST_CHECK_NO_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)));
558  BOOST_TEST((dynamicBackend != nullptr));
559 
560  BackendId dynamicBackendId;
561  BOOST_CHECK_NO_THROW(dynamicBackendId = dynamicBackend->GetBackendId());
562  BOOST_TEST((dynamicBackendId == "InvalidTestDynamicBackend"));
563 
564  BackendVersion dynamicBackendVersion;
565  BOOST_CHECK_NO_THROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
566  BOOST_TEST((dynamicBackendVersion == BackendVersion({ 1, 0 })));
567 
568  IBackendInternalUniquePtr dynamicBackendInstance1;
569  BOOST_CHECK_THROW(dynamicBackendInstance1 = dynamicBackend->GetBackend(), RuntimeException);
570  BOOST_TEST((dynamicBackendInstance1 == nullptr));
571 
572  BackendRegistry::FactoryFunction dynamicBackendFactoryFunction = nullptr;
573  BOOST_CHECK_NO_THROW(dynamicBackendFactoryFunction = dynamicBackend->GetFactoryFunction());
574  BOOST_TEST((dynamicBackendFactoryFunction != nullptr));
575 
576  IBackendInternalUniquePtr dynamicBackendInstance2;
577  BOOST_CHECK_THROW(dynamicBackendInstance2 = dynamicBackendFactoryFunction(), RuntimeException);
578  BOOST_TEST((dynamicBackendInstance2 == nullptr));
579 }
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 581 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

582 {
583  // Valid shared object handle
584  // Correct name mangling
585  // Correct interface
586  // Invalid (incompatible backend API version) backend instance returned by BackendFactory()
587 
588  using namespace armnn;
589 
590  std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
591  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend7FileName);
592 
593  void* sharedObjectHandle = nullptr;
594  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
595  BOOST_TEST((sharedObjectHandle != nullptr));
596 
597  DynamicBackendPtr dynamicBackend;
598  BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
599  BOOST_TEST((dynamicBackend == nullptr));
600 }
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 866 of file DynamicBackendTests.hpp.

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

◆ CreateDynamicBackendsMixedTypesTestImpl()

void CreateDynamicBackendsMixedTypesTestImpl ( )

Definition at line 881 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

882 {
883  using namespace armnn;
884  using namespace fs;
885 
886  std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
887  std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
888  BOOST_CHECK(exists(testDynamicBackendsSubDir5));
889  BOOST_CHECK(exists(testDynamicBackendsSubDir6));
890 
891  std::string testValidBackend2FilePath = GetTestFilePath(testDynamicBackendsSubDir5,
892  g_TestValidBackend2FileName);
893  std::string testInvalidBackend8FilePath = GetTestFilePath(testDynamicBackendsSubDir5,
894  g_TestInvalidBackend8FileName);
895  std::string testInvalidBackend9FilePath = GetTestFilePath(testDynamicBackendsSubDir6,
896  g_TestInvalidBackend9FileName);
897  BOOST_CHECK(exists(testValidBackend2FilePath));
898  BOOST_CHECK(exists(testInvalidBackend8FilePath));
899  BOOST_CHECK(exists(testInvalidBackend9FilePath));
900 
901  std::vector<std::string> sharedObjects
902  {
903  testValidBackend2FilePath, // Arm_TestValid2_backend.so -> valid (basic backend name)
904  testInvalidBackend8FilePath, // Arm_TestInvalid8_backend.so -> not valid (invalid backend id)
905  testInvalidBackend9FilePath, // Arm_TestInvalid9_backend.so -> not valid (incompatible version)
906  "InvalidSharedObject", // The file does not exist
907  };
908  std::vector<DynamicBackendPtr> dynamicBackends = DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
909 
910  BOOST_TEST(dynamicBackends.size() == 1);
911  BOOST_TEST((dynamicBackends[0] != nullptr));
912  BOOST_TEST((dynamicBackends[0]->GetBackendId() == "TestValid2"));
913 }
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 857 of file DynamicBackendTests.hpp.

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

◆ CreateDynamicBackendsTestImpl()

void CreateDynamicBackendsTestImpl ( )

Definition at line 794 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

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

References GetTestSubDirectory().

683 {
684  using namespace armnn;
685  using namespace fs;
686 
687  std::string subDir1 = GetTestSubDirectory(g_TestDynamicBackendsSubDir1);
688  std::string subDir4 = GetTestSubDirectory(g_TestDynamicBackendsSubDir4);
689 
690  BOOST_CHECK(exists(subDir1));
691  BOOST_CHECK(!exists(subDir4));
692 
693  // Override with valid path
694  std::vector<std::string> validResult = DynamicBackendUtils::GetBackendPaths(subDir1);
695  BOOST_TEST(validResult.size() == 1);
696  BOOST_TEST(validResult[0] == subDir1);
697 
698  // Override with invalid path
699  std::vector<std::string> invalidResult = DynamicBackendUtils::GetBackendPaths(subDir4);
700  BOOST_TEST(invalidResult.empty());
701 }
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 602 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

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

References DYNAMIC_BACKEND_BUILD_DIR.

Referenced by GetDynamicBackendsBasePath(), and GetTestDirectoryBasePath().

110 {
111  using namespace fs;
112  // What we're looking for here is the location of the UnitTests executable.
113  // In the normal build environment there are a series of files and
114  // directories created by cmake. If the executable has been relocated they
115  // may not be there. The search hierarchy is:
116  // * User specified --dynamic-backend-build-dir
117  // * Compile time value of DYNAMIC_BACKEND_BUILD_DIR.
118  // * Arg0 location.
119  // * Fall back value of current directory.
120  path programLocation = DYNAMIC_BACKEND_BUILD_DIR;
121  // Look for the specific argument --dynamic-backend-build-dir?
122  if (boost::unit_test::framework::master_test_suite().argc == 3)
123  {
124  // Boost custom arguments begin after a '--' on the command line.
125  if (g_TestDirCLI.compare(boost::unit_test::framework::master_test_suite().argv[1]) == 0)
126  {
127  // Then the next argument is the path.
128  programLocation = boost::unit_test::framework::master_test_suite().argv[2];
129  }
130  }
131  else
132  {
133  // Start by checking if DYNAMIC_BACKEND_BUILD_DIR value exist.
134  if (!exists(programLocation))
135  {
136  // That doesn't exist try looking at arg[0].
137  path arg0Path(boost::unit_test::framework::master_test_suite().argv[0]);
138  arg0Path.remove_filename();
139  path arg0SharedObjectPath(arg0Path);
140  arg0SharedObjectPath.append(basePath);
141  if (exists(arg0SharedObjectPath))
142  {
143  // Yeah arg0 worked.
144  programLocation = arg0Path;
145  }
146  }
147  }
148  // This is the base path from the build where the test libraries were built.
149  path sharedObjectPath = programLocation.append(basePath);
150  BOOST_REQUIRE_MESSAGE(exists(sharedObjectPath), "Base path for shared objects does not exist: " +
151  sharedObjectPath.string() + "\nTo specify the root of this base path on the " +
152  "command line add: \'-- --dynamic-backend-build-dir <path>\'");
153  return sharedObjectPath.string();
154 }
#define DYNAMIC_BACKEND_BUILD_DIR

◆ GetDynamicBackendsBasePath()

std::string GetDynamicBackendsBasePath ( )

Definition at line 161 of file DynamicBackendTests.hpp.

References GetBasePath().

Referenced by RuntimeInvalidOverridePathTestImpl().

162 {
163  return GetBasePath(g_DynamicBackendsBaseDir);
164 }
std::string GetBasePath(const std::string &basePath)

◆ GetNameMangledEntryPointTestImpl()

void GetNameMangledEntryPointTestImpl ( )

Definition at line 273 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

274 {
275  using namespace armnn;
276 
277  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
278  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
279 
280  void* sharedObjectHandle = nullptr;
281  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
282  BOOST_TEST((sharedObjectHandle != nullptr));
283 
284  using TestFunctionType = int(*)(int);
285  TestFunctionType testFunctionPointer = nullptr;
286  BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
287  "TestFunction2"),
289  BOOST_TEST((testFunctionPointer == nullptr));
290 
291  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
292 }
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 294 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

295 {
296  using namespace armnn;
297 
298  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
299  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
300 
301  void* sharedObjectHandle = nullptr;
302  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
303  BOOST_TEST((sharedObjectHandle != nullptr));
304 
305  using TestFunctionType = int(*)(int);
306  TestFunctionType testFunctionPointer = nullptr;
307  BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
308  "TestFunction3"),
310  BOOST_TEST((testFunctionPointer == nullptr));
311 
312  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
313 }
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 315 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

316 {
317  using namespace armnn;
318 
319  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
320  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
321 
322  void* sharedObjectHandle = nullptr;
323  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
324  BOOST_TEST((sharedObjectHandle != nullptr));
325 
326  using TestFunctionType = int(*)(int);
327  TestFunctionType testFunctionPointer = nullptr;
328  BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
329  "TestFunction4"),
331  BOOST_TEST((testFunctionPointer == nullptr));
332 
333  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
334 }
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 703 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

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

References GetBasePath().

Referenced by GetTestSubDirectory().

157 {
158  return GetBasePath(g_TestBaseDir);
159 }
std::string GetBasePath(const std::string &basePath)

◆ GetTestFilePath()

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

Definition at line 189 of file DynamicBackendTests.hpp.

190 {
191  using namespace fs;
192 
193  path directoryPath(directory);
194  path fileNamePath = directoryPath.append(fileName);
195  BOOST_CHECK(exists(fileNamePath));
196 
197  return fileNamePath.string();
198 }

◆ GetTestSubDirectory() [1/2]

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

Definition at line 166 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().

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

◆ GetTestSubDirectory() [2/2]

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

Definition at line 178 of file DynamicBackendTests.hpp.

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

◆ GetValidEntryPointTestImpl()

void GetValidEntryPointTestImpl ( )

Definition at line 252 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

253 {
254  using namespace armnn;
255 
256  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
257  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
258 
259  void* sharedObjectHandle = nullptr;
260  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
261  BOOST_TEST((sharedObjectHandle != nullptr));
262 
263  using TestFunctionType = int(*)(int);
264  TestFunctionType testFunctionPointer = nullptr;
265  BOOST_CHECK_NO_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
266  "TestFunction1"));
267  BOOST_TEST((testFunctionPointer != nullptr));
268  BOOST_TEST(testFunctionPointer(7) == 7);
269 
270  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
271 }
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 200 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

201 {
202  using namespace armnn;
203 
204  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
205  std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
206 
207  void* sharedObjectHandle = nullptr;
208  BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
209  BOOST_TEST((sharedObjectHandle != nullptr));
210 
211  DynamicBackendUtils::CloseHandle(sharedObjectHandle);
212 }
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 222 of file DynamicBackendTests.hpp.

223 {
224  using namespace armnn;
225 
226  void* sharedObjectHandle = nullptr;
227  BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(""), RuntimeException);
228  BOOST_TEST((sharedObjectHandle == nullptr));
229 }
static void * OpenHandle(const std::string &sharedObjectPath)
Copyright (c) 2021 ARM Limited and Contributors.

◆ OpenNotExistingFileTestImpl()

void OpenNotExistingFileTestImpl ( )

Definition at line 231 of file DynamicBackendTests.hpp.

232 {
233  using namespace armnn;
234 
235  void* sharedObjectHandle = nullptr;
236  BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle("NotExistingFileName"), RuntimeException);
237  BOOST_TEST((sharedObjectHandle == nullptr));
238 }
static void * OpenHandle(const std::string &sharedObjectPath)
Copyright (c) 2021 ARM Limited and Contributors.

◆ OpenNotSharedObjectTestImpl()

void OpenNotSharedObjectTestImpl ( )

Definition at line 240 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

241 {
242  using namespace armnn;
243 
244  std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
245  std::string notSharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestNoSharedObjectFileName);
246 
247  void* sharedObjectHandle = nullptr;
248  BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(notSharedObjectFilePath), RuntimeException);
249  BOOST_TEST((sharedObjectHandle == nullptr));
250 }
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 1186 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

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

References GetTestSubDirectory().

1312 {
1313  using namespace armnn;
1314  using namespace fs;
1315 
1316  // Swapping the backend registry storage for testing
1317  TestBackendRegistry testBackendRegistry;
1318 
1319  // This directory contains valid, invalid and duplicate backends
1320  std::string testDynamicBackendsSubDir6 = GetTestSubDirectory(g_TestDynamicBackendsSubDir6);
1321  BOOST_CHECK(exists(testDynamicBackendsSubDir6));
1322 
1323  // Using the path override in CreationOptions to load some test dynamic backends
1324  IRuntime::CreationOptions creationOptions;
1325  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir6;
1326  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1327 
1328  std::vector<BackendId> expectedRegisteredbackendIds
1329  {
1330  "TestValid2",
1331  "TestValid5"
1332  };
1333 
1334  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1335  BOOST_TEST(backendRegistry.Size() == expectedRegisteredbackendIds.size());
1336 
1337  BackendIdSet backendIds = backendRegistry.GetBackendIds();
1338  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1339  {
1340  BOOST_TEST((backendIds.find(expectedRegisteredbackendId) != backendIds.end()));
1341  }
1342 
1343  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1344  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1345  BOOST_TEST(supportedBackendIds.size() == expectedRegisteredbackendIds.size());
1346  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1347  {
1348  BOOST_TEST((supportedBackendIds.find(expectedRegisteredbackendId) != supportedBackendIds.end()));
1349  }
1350 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
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:26
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:60
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeDynamicBackendsTestImpl()

void RuntimeDynamicBackendsTestImpl ( )

Definition at line 1270 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

1271 {
1272  using namespace armnn;
1273  using namespace fs;
1274 
1275  // Swapping the backend registry storage for testing
1276  TestBackendRegistry testBackendRegistry;
1277 
1278  // This directory contains valid and invalid backends
1279  std::string testDynamicBackendsSubDir5 = GetTestSubDirectory(g_TestDynamicBackendsSubDir5);
1280  BOOST_CHECK(exists(testDynamicBackendsSubDir5));
1281 
1282  // Using the path override in CreationOptions to load some test dynamic backends
1283  IRuntime::CreationOptions creationOptions;
1284  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir5;
1285  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1286 
1287  std::vector<BackendId> expectedRegisteredbackendIds
1288  {
1289  "TestValid2",
1290  "TestValid3"
1291  };
1292 
1293  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1294  BOOST_TEST(backendRegistry.Size() == expectedRegisteredbackendIds.size());
1295 
1296  BackendIdSet backendIds = backendRegistry.GetBackendIds();
1297  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1298  {
1299  BOOST_TEST((backendIds.find(expectedRegisteredbackendId) != backendIds.end()));
1300  }
1301 
1302  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1303  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1304  BOOST_TEST(supportedBackendIds.size() == expectedRegisteredbackendIds.size());
1305  for (const BackendId& expectedRegisteredbackendId : expectedRegisteredbackendIds)
1306  {
1307  BOOST_TEST((supportedBackendIds.find(expectedRegisteredbackendId) != supportedBackendIds.end()));
1308  }
1309 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
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:26
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:60
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeEmptyTestImpl()

void RuntimeEmptyTestImpl ( )

Definition at line 1248 of file DynamicBackendTests.hpp.

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

1249 {
1250  using namespace armnn;
1251 
1252  // Swapping the backend registry storage for testing
1253  TestBackendRegistry testBackendRegistry;
1254 
1255  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1256  BOOST_TEST(backendRegistry.Size() == 0);
1257 
1258  IRuntime::CreationOptions creationOptions;
1259  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1260 
1261  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1262  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1263  BOOST_TEST(supportedBackendIds.empty());
1264 
1265  BOOST_TEST(backendRegistry.Size() == 0);
1266 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:26
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 1352 of file DynamicBackendTests.hpp.

References GetTestSubDirectory().

1353 {
1354  using namespace armnn;
1355  using namespace fs;
1356 
1357  // Swapping the backend registry storage for testing
1358  TestBackendRegistry testBackendRegistry;
1359 
1360  // This directory contains only invalid backends
1361  std::string testDynamicBackendsSubDir9 = GetTestSubDirectory(g_TestDynamicBackendsSubDir9);
1362  BOOST_CHECK(exists(testDynamicBackendsSubDir9));
1363 
1364  // Using the path override in CreationOptions to load some test dynamic backends
1365  IRuntime::CreationOptions creationOptions;
1366  creationOptions.m_DynamicBackendsPath = testDynamicBackendsSubDir9;
1367  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1368 
1369  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1370  BOOST_TEST(backendRegistry.Size() == 0);
1371 
1372  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1373  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1374  BOOST_TEST(supportedBackendIds.empty());
1375 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
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:26
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:60
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25

◆ RuntimeInvalidOverridePathTestImpl()

void RuntimeInvalidOverridePathTestImpl ( )

Definition at line 1377 of file DynamicBackendTests.hpp.

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

1378 {
1379  using namespace armnn;
1380 
1381  // Swapping the backend registry storage for testing
1382  TestBackendRegistry testBackendRegistry;
1383 
1384  // Using the path override in CreationOptions to load some test dynamic backends
1385  IRuntime::CreationOptions creationOptions;
1386  creationOptions.m_DynamicBackendsPath = "InvalidPath";
1387  IRuntimePtr runtime = IRuntime::Create(creationOptions);
1388 
1389  const BackendRegistry& backendRegistry = BackendRegistryInstance();
1390  BOOST_TEST(backendRegistry.Size() == 0);
1391 
1392  const DeviceSpec& deviceSpec = *PolymorphicDowncast<const DeviceSpec*>(&runtime->GetDeviceSpec());
1393  BackendIdSet supportedBackendIds = deviceSpec.GetSupportedBackends();
1394  BOOST_TEST(supportedBackendIds.empty());
1395 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:26
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:60
virtual const BackendIdSet & GetSupportedBackends() const override
Definition: DeviceSpec.hpp:25