From 986c186468e6023b234c24bd10ed9687f9eea0da Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Fri, 26 Jul 2019 15:12:47 +0100 Subject: IVGCVSW-3555 Add unit tests for the dynamic backend utility functions * Added a test library to exercise the utility functions that handle the shared objects Signed-off-by: Matteo Martincigh Change-Id: Ic8095febca2a46050831eb42f55a714f3ae3bfe3 --- src/backends/backendsCommon/test/CMakeLists.txt | 11 ++ .../backendsCommon/test/DynamicBackendTests.cpp | 10 ++ .../backendsCommon/test/DynamicBackendTests.hpp | 168 +++++++++++++++++++-- .../backendsCommon/test/TestSharedObject.cpp | 21 +++ .../backendsCommon/test/TestSharedObject.hpp | 20 +++ 5 files changed, 221 insertions(+), 9 deletions(-) create mode 100644 src/backends/backendsCommon/test/TestSharedObject.cpp create mode 100644 src/backends/backendsCommon/test/TestSharedObject.hpp (limited to 'src') diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 3ddaaaf162..4131b9e787 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -64,3 +64,14 @@ add_library(armnnBackendsCommonUnitTests OBJECT ${armnnBackendsCommonUnitTests_s target_include_directories(armnnBackendsCommonUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) target_include_directories(armnnBackendsCommonUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) target_include_directories(armnnBackendsCommonUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/backends) + +# Dummy shared object for testing. +# This is a simple library used to test the utility functions that will be used to handle the shared objects. + +list(APPEND armnnTestSharedObject_sources + TestSharedObject.cpp + TestSharedObject.hpp +) + +add_library_ex(armnnTestSharedObject SHARED ${armnnTestSharedObject_sources}) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/libarmnnNoSharedObject.txt "This is not a shared object") diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.cpp b/src/backends/backendsCommon/test/DynamicBackendTests.cpp index 5104d0663d..30622b6b3b 100644 --- a/src/backends/backendsCommon/test/DynamicBackendTests.cpp +++ b/src/backends/backendsCommon/test/DynamicBackendTests.cpp @@ -7,6 +7,16 @@ BOOST_AUTO_TEST_SUITE(DynamicBackendTests) +ARMNN_SIMPLE_TEST_CASE(OpenCloseHandle, OpenCloseHandleTestImpl); +ARMNN_SIMPLE_TEST_CASE(CloseInvalidHandle, CloseInvalidHandleTestImpl); +ARMNN_SIMPLE_TEST_CASE(OpenEmptyFileName, OpenEmptyFileNameTestImpl); +ARMNN_SIMPLE_TEST_CASE(OpenNotExistingFile, OpenNotExistingFileTestImpl); +ARMNN_SIMPLE_TEST_CASE(OpenNotSharedObjectFile, OpenNotSharedObjectTestImpl); +ARMNN_SIMPLE_TEST_CASE(GetValidEntryPoint, GetValidEntryPointTestImpl); +ARMNN_SIMPLE_TEST_CASE(GetNameMangledEntryPoint, GetNameMangledEntryPointTestImpl); +ARMNN_SIMPLE_TEST_CASE(GetNoExternEntryPoint, GetNoExternEntryPointTestImpl); +ARMNN_SIMPLE_TEST_CASE(GetNotExistingEntryPoint, GetNotExistingEntryPointTestImpl); + ARMNN_SIMPLE_TEST_CASE(BackendVersioning, BackendVersioningTestImpl); BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.hpp b/src/backends/backendsCommon/test/DynamicBackendTests.hpp index 3b0c95b00f..9835113458 100644 --- a/src/backends/backendsCommon/test/DynamicBackendTests.hpp +++ b/src/backends/backendsCommon/test/DynamicBackendTests.hpp @@ -9,37 +9,187 @@ #include +#include + #include +#include + +static std::string g_TestSharedObjectSubDir = "src/backends/backendsCommon/test/"; +static std::string g_TestSharedObjectFileName = "libarmnnTestSharedObject.so"; + +std::string GetTestFilePath(const std::string& fileName) +{ + using namespace boost::filesystem; + + path currentPath(current_path()); + path sharedObjectPath = currentPath.append(g_TestSharedObjectSubDir); + path sharedObjectFile = sharedObjectPath.append(fileName); + BOOST_TEST(exists(sharedObjectFile)); + + return sharedObjectFile.string(); +} + +void OpenCloseHandleTestImpl() +{ + using namespace armnn; + + std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath)); + BOOST_TEST((sharedObjectHandle != nullptr)); + + DynamicBackendUtils::CloseHandle(sharedObjectHandle); +} + +void CloseInvalidHandleTestImpl() +{ + using namespace armnn; + + // This calls must silently handle invalid handles and complete successfully (no segfaults, etc.) + DynamicBackendUtils::CloseHandle(nullptr); +} + +void OpenEmptyFileNameTestImpl() +{ + using namespace armnn; + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(""), RuntimeException); + BOOST_TEST((sharedObjectHandle == nullptr)); +} + +void OpenNotExistingFileTestImpl() +{ + using namespace armnn; + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle("NotExistingFileName"), RuntimeException); + BOOST_TEST((sharedObjectHandle == nullptr)); +} + +void OpenNotSharedObjectTestImpl() +{ + using namespace armnn; + + std::string notSharedObjectFilePath = GetTestFilePath("libarmnnNoSharedObject.txt"); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(notSharedObjectFilePath), RuntimeException); + BOOST_TEST((sharedObjectHandle == nullptr)); +} + +void GetValidEntryPointTestImpl() +{ + using namespace armnn; + + std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath)); + BOOST_TEST((sharedObjectHandle != nullptr)); + + using TestFunctionType = int(*)(int); + TestFunctionType testFunctionPointer = nullptr; + BOOST_CHECK_NO_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint(sharedObjectHandle, + "TestFunction1")); + BOOST_TEST((testFunctionPointer != nullptr)); + BOOST_TEST(testFunctionPointer(7) == 7); + + DynamicBackendUtils::CloseHandle(sharedObjectHandle); +} + +void GetNameMangledEntryPointTestImpl() +{ + using namespace armnn; + + std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath)); + BOOST_TEST((sharedObjectHandle != nullptr)); + + using TestFunctionType = int(*)(int); + TestFunctionType testFunctionPointer = nullptr; + BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint(sharedObjectHandle, + "TestFunction2"), + RuntimeException); + BOOST_TEST((testFunctionPointer == nullptr)); + + DynamicBackendUtils::CloseHandle(sharedObjectHandle); +} + +void GetNoExternEntryPointTestImpl() +{ + using namespace armnn; + + std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath)); + BOOST_TEST((sharedObjectHandle != nullptr)); + + using TestFunctionType = int(*)(int); + TestFunctionType testFunctionPointer = nullptr; + BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint(sharedObjectHandle, + "TestFunction3"), + RuntimeException); + BOOST_TEST((testFunctionPointer == nullptr)); + + DynamicBackendUtils::CloseHandle(sharedObjectHandle); +} + +void GetNotExistingEntryPointTestImpl() +{ + using namespace armnn; + + std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName); + + void* sharedObjectHandle = nullptr; + BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath)); + BOOST_TEST((sharedObjectHandle != nullptr)); + + using TestFunctionType = int(*)(int); + TestFunctionType testFunctionPointer = nullptr; + BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint(sharedObjectHandle, + "TestFunction4"), + RuntimeException); + BOOST_TEST((testFunctionPointer == nullptr)); + + DynamicBackendUtils::CloseHandle(sharedObjectHandle); +} void BackendVersioningTestImpl() { - class TestDynamicBackendUtils : public armnn::DynamicBackendUtils + using namespace armnn; + + class TestDynamicBackendUtils : public DynamicBackendUtils { public: - static bool IsBackendCompatibleTest(const armnn::BackendVersion& backendApiVersion, - const armnn::BackendVersion& backendVersion) + static bool IsBackendCompatibleTest(const BackendVersion& backendApiVersion, + const BackendVersion& backendVersion) { return IsBackendCompatibleImpl(backendApiVersion, backendVersion); } }; // The backend API version used for the tests - armnn::BackendVersion backendApiVersion{ 2, 4 }; + BackendVersion backendApiVersion{ 2, 4 }; // Same backend and backend API versions are compatible with the backend API - armnn::BackendVersion sameBackendVersion{ 2, 4 }; + BackendVersion sameBackendVersion{ 2, 4 }; BOOST_TEST(sameBackendVersion == backendApiVersion); BOOST_TEST(sameBackendVersion <= backendApiVersion); BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, sameBackendVersion) == true); // Backend versions that differ from the backend API version by major revision are not compatible // with the backend API - armnn::BackendVersion laterMajorBackendVersion{ 3, 4 }; + BackendVersion laterMajorBackendVersion{ 3, 4 }; BOOST_TEST(!(laterMajorBackendVersion == backendApiVersion)); BOOST_TEST(!(laterMajorBackendVersion <= backendApiVersion)); BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMajorBackendVersion) == false); - armnn::BackendVersion earlierMajorBackendVersion{ 1, 4 }; + BackendVersion earlierMajorBackendVersion{ 1, 4 }; BOOST_TEST(!(earlierMajorBackendVersion == backendApiVersion)); BOOST_TEST(earlierMajorBackendVersion <= backendApiVersion); BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, @@ -47,14 +197,14 @@ void BackendVersioningTestImpl() // Backend versions with the same major revision but later minor revision than // the backend API version are not compatible with the backend API - armnn::BackendVersion laterMinorBackendVersion{ 2, 5 }; + BackendVersion laterMinorBackendVersion{ 2, 5 }; BOOST_TEST(!(laterMinorBackendVersion == backendApiVersion)); BOOST_TEST(!(laterMinorBackendVersion <= backendApiVersion)); BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMinorBackendVersion) == false); // Backend versions with the same major revision but earlier minor revision than // the backend API version are compatible with the backend API - armnn::BackendVersion earlierMinorBackendVersion{ 2, 3 }; + BackendVersion earlierMinorBackendVersion{ 2, 3 }; BOOST_TEST(!(earlierMinorBackendVersion == backendApiVersion)); BOOST_TEST(earlierMinorBackendVersion <= backendApiVersion); BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, earlierMinorBackendVersion) == true); diff --git a/src/backends/backendsCommon/test/TestSharedObject.cpp b/src/backends/backendsCommon/test/TestSharedObject.cpp new file mode 100644 index 0000000000..d6b593c4d8 --- /dev/null +++ b/src/backends/backendsCommon/test/TestSharedObject.cpp @@ -0,0 +1,21 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "TestSharedObject.hpp" + +int TestFunction1(int i) +{ + return i; +} + +int TestFunction2(int i) +{ + return i; +} + +int TestFunction3(int i) +{ + return i; +} diff --git a/src/backends/backendsCommon/test/TestSharedObject.hpp b/src/backends/backendsCommon/test/TestSharedObject.hpp new file mode 100644 index 0000000000..b2c515b1aa --- /dev/null +++ b/src/backends/backendsCommon/test/TestSharedObject.hpp @@ -0,0 +1,20 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +// No name mangling +extern "C" +{ +int TestFunction1(int i); +} + +// C++ name mangling +extern int TestFunction2(int i); + +// No external linkage +int TestFunction3(int i); -- cgit v1.2.1