IVGCVSW-3561 Fix the linker issues of the test shared objects in
the Android builds

 * Changed the test libs from SHARED to MODULE
 * Added IBackendInternal.cpp to separate the default
   implementation of OptimizeSubgraphView from the header file
 * Linked the modules against armnn to get the missing symbols
 * Renamed the test modules to avoid name clashing in the CI system
 * Moved the test shared objects to separate folders to keep the
   filesystem tidy

Change-Id: I987c56d2d66bdb86f7b391a83c602d0dadf4c674
Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
diff --git a/src/backends/backendsCommon/CMakeLists.txt b/src/backends/backendsCommon/CMakeLists.txt
index 4048c58..653f372 100644
--- a/src/backends/backendsCommon/CMakeLists.txt
+++ b/src/backends/backendsCommon/CMakeLists.txt
@@ -13,6 +13,7 @@
     DynamicBackend.hpp
     DynamicBackendUtils.cpp
     DynamicBackendUtils.hpp
+    IBackendInternal.cpp
     IBackendInternal.hpp
     IBackendContext.hpp
     ITensorHandleFactory.cpp
diff --git a/src/backends/backendsCommon/IBackendInternal.cpp b/src/backends/backendsCommon/IBackendInternal.cpp
new file mode 100644
index 0000000..261613c
--- /dev/null
+++ b/src/backends/backendsCommon/IBackendInternal.cpp
@@ -0,0 +1,89 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "IBackendInternal.hpp"
+
+namespace armnn
+{
+
+ARMNN_NO_DEPRECATE_WARN_BEGIN
+IBackendInternal::ISubGraphConverterPtr IBackendInternal::CreateSubGraphConverter(
+    const std::shared_ptr<SubGraph>& subGraph) const
+{
+    return ISubGraphConverterPtr{};
+}
+
+IBackendInternal::Optimizations IBackendInternal::GetOptimizations() const
+{
+    return Optimizations{};
+}
+
+IBackendInternal::SubGraphUniquePtr IBackendInternal::OptimizeSubGraph(const SubGraph& subGraph,
+                                                                       bool& optimizationAttempted) const
+{
+    optimizationAttempted = false;
+    return nullptr;
+}
+ARMNN_NO_DEPRECATE_WARN_END
+
+IMemoryManagerUniquePtr IBackendInternal::CreateMemoryManager() const
+{
+    return IMemoryManagerUniquePtr();
+}
+
+IBackendInternal::IBackendContextPtr IBackendInternal::CreateBackendContext(const IRuntime::CreationOptions&) const
+{
+    return IBackendContextPtr{};
+}
+
+// Default implementation of OptimizeSubgraphView for backward compatibility with the old API.
+// Override this method with a custom optimization implementation.
+OptimizationViews IBackendInternal::OptimizeSubgraphView(const SubgraphView& subgraph) const
+{
+    bool optimizationAttempted = false;
+
+    ARMNN_NO_DEPRECATE_WARN_BEGIN
+    SubGraphUniquePtr optSubgraph = OptimizeSubGraph(subgraph, optimizationAttempted);
+    ARMNN_NO_DEPRECATE_WARN_END
+
+    OptimizationViews result;
+    if (!optimizationAttempted)
+    {
+        result.AddUntouchedSubgraph(SubgraphView(subgraph));
+    }
+    else if (optSubgraph)
+    {
+        result.AddSubstitution({subgraph, SubgraphView(*optSubgraph.get())});
+    }
+    else
+    {
+        result.AddFailedSubgraph(SubgraphView(subgraph));
+    }
+
+    return result;
+}
+
+bool IBackendInternal::SupportsTensorAllocatorAPI() const
+{
+    return !GetHandleFactoryPreferences().empty();
+}
+
+ITensorHandleFactory::FactoryId IBackendInternal::GetBackwardCompatibleFavoriteHandleFactory()
+{
+    auto favorites = GetHandleFactoryPreferences();
+    if (favorites.empty())
+    {
+        return ITensorHandleFactory::LegacyFactoryId;
+    }
+
+    return favorites[0];
+}
+
+std::vector<ITensorHandleFactory::FactoryId> IBackendInternal::GetHandleFactoryPreferences() const
+{
+    return std::vector<ITensorHandleFactory::FactoryId>();
+}
+
+} // namespace armnn
diff --git a/src/backends/backendsCommon/IBackendInternal.hpp b/src/backends/backendsCommon/IBackendInternal.hpp
index c548683..f8f9df5 100644
--- a/src/backends/backendsCommon/IBackendInternal.hpp
+++ b/src/backends/backendsCommon/IBackendInternal.hpp
@@ -2,6 +2,7 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
+
 #pragma once
 
 #include <armnn/Types.hpp>
@@ -18,6 +19,7 @@
 #include "OptimizationViews.hpp"
 
 #include <vector>
+#include <memory>
 
 namespace armnn
 {
@@ -30,11 +32,11 @@
     uint32_t m_Major;
     uint32_t m_Minor;
 
-    BackendVersion()
+    constexpr BackendVersion()
         : m_Major(0)
         , m_Minor(0)
     {}
-    BackendVersion(uint32_t major, uint32_t minor)
+    constexpr BackendVersion(uint32_t major, uint32_t minor)
         : m_Major(major)
         , m_Minor(minor)
     {}
@@ -92,87 +94,32 @@
         = std::unique_ptr<SubGraph>;
 
     ARMNN_DEPRECATED_MSG("This method is no longer supported")
-    virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const
-    {
-        return ISubGraphConverterPtr{};
-    }
+    virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const;
 
     ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
-    virtual Optimizations GetOptimizations() const
-    {
-        return Optimizations{};
-    }
+    virtual Optimizations GetOptimizations() const;
 
     ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
-    virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const
-    {
-        optimizationAttempted = false;
-        return nullptr;
-    }
+    virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const;
     ARMNN_NO_DEPRECATE_WARN_END
 
-
-    virtual IMemoryManagerUniquePtr CreateMemoryManager() const
-    {
-        return IMemoryManagerUniquePtr();
-    }
+    virtual IMemoryManagerUniquePtr CreateMemoryManager() const;
 
     virtual IWorkloadFactoryPtr CreateWorkloadFactory(
         const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
 
-    virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const
-    {
-        return IBackendContextPtr{};
-    }
+    virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const;
 
     virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
 
-    // Default implementation of OptimizeSubgraphView for backward compatibility with the old API.
-    // Override this method with a custom optimization implementation.
-    virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const
-    {
-        bool optimizationAttempted = false;
+    virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const;
 
-        ARMNN_NO_DEPRECATE_WARN_BEGIN
-        SubGraphUniquePtr optSubgraph = OptimizeSubGraph(subgraph, optimizationAttempted);
-        ARMNN_NO_DEPRECATE_WARN_END
+    bool SupportsTensorAllocatorAPI() const;
 
-        OptimizationViews result;
-        if (!optimizationAttempted)
-        {
-            result.AddUntouchedSubgraph(SubgraphView(subgraph));
-        }
-        else
-        {
-            if (optSubgraph)
-            {
-                result.AddSubstitution({subgraph, SubgraphView(*optSubgraph.get())});
-            }
-            else
-            {
-                result.AddFailedSubgraph(SubgraphView(subgraph));
-            }
-        }
-        return result;
-    }
-
-    bool SupportsTensorAllocatorAPI() const { return GetHandleFactoryPreferences().empty() == false; }
-
-    ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory()
-    {
-        auto favorites = GetHandleFactoryPreferences();
-        if (favorites.empty())
-        {
-            return ITensorHandleFactory::LegacyFactoryId;
-        }
-        return favorites[0];
-    }
+    ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory();
 
     /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
-    virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const
-    {
-        return std::vector<ITensorHandleFactory::FactoryId>();
-    }
+    virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const;
 
     /// (Optional) Register TensorHandleFactories
     /// Either this method or CreateMemoryManager() and
@@ -180,7 +127,7 @@
     virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) {}
 
     /// Returns the version of the Backend API
-    static BackendVersion GetApiVersion() { return { 1, 0 }; }
+    static constexpr BackendVersion GetApiVersion() { return BackendVersion(1, 0); }
 };
 
 using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk
index 8df5ab9..69bde81 100644
--- a/src/backends/backendsCommon/common.mk
+++ b/src/backends/backendsCommon/common.mk
@@ -10,6 +10,7 @@
 COMMON_SOURCES := \
     BackendRegistry.cpp \
     CpuTensorHandle.cpp \
+    IBackendInternal.cpp \
     ITensorHandleFactory.cpp \
     LayerSupportBase.cpp \
     MemCopyWorkload.cpp \
diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt
index 8c9644f..930157f 100644
--- a/src/backends/backendsCommon/test/CMakeLists.txt
+++ b/src/backends/backendsCommon/test/CMakeLists.txt
@@ -68,59 +68,76 @@
 # 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
+list(APPEND testSharedObject_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")
+add_library_ex(TestSharedObject MODULE ${testSharedObject_sources})
+set_target_properties(TestSharedObject PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testSharedObject)
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/testSharedObject/libNoSharedObject.txt "This is not a shared object")
 
 # Dummy dynamic backends for testing.
 # Both a valid and a number of invalid dummy dynamic backends (covering various use cases) share the
 # same source code. The various test cases are put together in the code using compiler directives.
 
-list(APPEND armnnTestDynamicBackend_sources
+list(APPEND testDynamicBackend_sources
     TestDynamicBackend.cpp
     TestDynamicBackend.hpp
 )
 
-add_library_ex(armnnValidTestDynamicBackend SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnValidTestDynamicBackend PRIVATE -DVALID_TEST_DYNAMIC_BACKEND)
-target_include_directories(armnnValidTestDynamicBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnValidTestDynamicBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(ValidTestDynamicBackend MODULE ${testDynamicBackend_sources})
+target_compile_definitions(ValidTestDynamicBackend PRIVATE -DVALID_TEST_DYNAMIC_BACKEND)
+target_include_directories(ValidTestDynamicBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(ValidTestDynamicBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(ValidTestDynamicBackend armnn)
+set_target_properties(ValidTestDynamicBackend PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend1 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend1 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_1)
-target_include_directories(armnnInvalidTestDynamicBackend1 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend1 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend1 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend1 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_1)
+target_include_directories(InvalidTestDynamicBackend1 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend1 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend1 armnn)
+set_target_properties(InvalidTestDynamicBackend1 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend2 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend2 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_2)
-target_include_directories(armnnInvalidTestDynamicBackend2 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend2 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend2 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend2 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_2)
+target_include_directories(InvalidTestDynamicBackend2 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend2 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend2 armnn)
+set_target_properties(InvalidTestDynamicBackend2 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend3 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend3 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_3)
-target_include_directories(armnnInvalidTestDynamicBackend3 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend3 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend3 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend3 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_3)
+target_include_directories(InvalidTestDynamicBackend3 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend3 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend3 armnn)
+set_target_properties(InvalidTestDynamicBackend3 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend4 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend4 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_4)
-target_include_directories(armnnInvalidTestDynamicBackend4 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend4 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend4 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend4 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_4)
+target_include_directories(InvalidTestDynamicBackend4 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend4 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend4 armnn)
+set_target_properties(InvalidTestDynamicBackend4 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend5 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend5 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_5)
-target_include_directories(armnnInvalidTestDynamicBackend5 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend5 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend5 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend5 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_5)
+target_include_directories(InvalidTestDynamicBackend5 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend5 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend5 armnn)
+set_target_properties(InvalidTestDynamicBackend5 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend6 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend6 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_6)
-target_include_directories(armnnInvalidTestDynamicBackend6 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend6 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend6 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend6 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_6)
+target_include_directories(InvalidTestDynamicBackend6 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend6 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend6 armnn)
+set_target_properties(InvalidTestDynamicBackend6 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
 
-add_library_ex(armnnInvalidTestDynamicBackend7 SHARED ${armnnTestDynamicBackend_sources})
-target_compile_definitions(armnnInvalidTestDynamicBackend7 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_7)
-target_include_directories(armnnInvalidTestDynamicBackend7 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnInvalidTestDynamicBackend7 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+add_library_ex(InvalidTestDynamicBackend7 MODULE ${testDynamicBackend_sources})
+target_compile_definitions(InvalidTestDynamicBackend7 PRIVATE -DINVALID_TEST_DYNAMIC_BACKEND_7)
+target_include_directories(InvalidTestDynamicBackend7 PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(InvalidTestDynamicBackend7 PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_link_libraries(InvalidTestDynamicBackend7 armnn)
+set_target_properties(InvalidTestDynamicBackend7 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testDynamicBackend)
diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.hpp b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
index 2bc4558..55f90d4 100644
--- a/src/backends/backendsCommon/test/DynamicBackendTests.hpp
+++ b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
@@ -17,34 +17,63 @@
 #include <boost/filesystem.hpp>
 #include <boost/dll.hpp>
 
-static std::string g_TestSharedObjectSubDir                 = "src/backends/backendsCommon/test/";
-static std::string g_TestSharedObjectFileName               = "libarmnnTestSharedObject.so";
-static std::string g_TestValidTestDynamicBackendFileName    = "libarmnnValidTestDynamicBackend.so";
-static std::string g_TestInvalidTestDynamicBackend1FileName = "libarmnnInvalidTestDynamicBackend1.so";
-static std::string g_TestInvalidTestDynamicBackend2FileName = "libarmnnInvalidTestDynamicBackend2.so";
-static std::string g_TestInvalidTestDynamicBackend3FileName = "libarmnnInvalidTestDynamicBackend3.so";
-static std::string g_TestInvalidTestDynamicBackend4FileName = "libarmnnInvalidTestDynamicBackend4.so";
-static std::string g_TestInvalidTestDynamicBackend5FileName = "libarmnnInvalidTestDynamicBackend5.so";
-static std::string g_TestInvalidTestDynamicBackend6FileName = "libarmnnInvalidTestDynamicBackend6.so";
-static std::string g_TestInvalidTestDynamicBackend7FileName = "libarmnnInvalidTestDynamicBackend7.so";
+static std::string g_TestBaseDir                            = "src/backends/backendsCommon/test/";
 
-std::string GetTestFilePath(const std::string& fileName)
+static std::string g_TestSharedObjectSubDir                 = "testSharedObject/";
+static std::string g_TestDynamicBackendSubDir               = "testDynamicBackend/";
+
+static std::string g_TestSharedObjectFileName               = "libTestSharedObject.so";
+static std::string g_TestNoSharedObjectFileName             = "libNoSharedObject.txt";
+
+static std::string g_TestValidTestDynamicBackendFileName    = "libValidTestDynamicBackend.so";
+static std::string g_TestInvalidTestDynamicBackend1FileName = "libInvalidTestDynamicBackend1.so";
+static std::string g_TestInvalidTestDynamicBackend2FileName = "libInvalidTestDynamicBackend2.so";
+static std::string g_TestInvalidTestDynamicBackend3FileName = "libInvalidTestDynamicBackend3.so";
+static std::string g_TestInvalidTestDynamicBackend4FileName = "libInvalidTestDynamicBackend4.so";
+static std::string g_TestInvalidTestDynamicBackend5FileName = "libInvalidTestDynamicBackend5.so";
+static std::string g_TestInvalidTestDynamicBackend6FileName = "libInvalidTestDynamicBackend6.so";
+static std::string g_TestInvalidTestDynamicBackend7FileName = "libInvalidTestDynamicBackend7.so";
+
+std::string GetTestDirectoryBasePath()
 {
     using namespace boost::filesystem;
 
     path programLocation = boost::dll::program_location().parent_path();
-    path sharedObjectPath = programLocation.append(g_TestSharedObjectSubDir);
-    path sharedObjectFile = sharedObjectPath.append(fileName);
-    BOOST_TEST(exists(sharedObjectFile));
+    path sharedObjectPath = programLocation.append(g_TestBaseDir);
+    BOOST_CHECK(exists(sharedObjectPath));
 
-    return sharedObjectFile.string();
+    return sharedObjectPath.string();
+}
+
+std::string GetTestSubDirectory(const std::string& subdir)
+{
+    using namespace boost::filesystem;
+
+    std::string testDynamicBackendsBaseDir = GetTestDirectoryBasePath();
+    path testDynamicBackendsBasePath(testDynamicBackendsBaseDir);
+    path testDynamicBackendsSubDir = testDynamicBackendsBasePath.append(subdir);
+    // Do not check that the sub-directory exists because for testing reasons we may use non-existing paths
+
+    return testDynamicBackendsSubDir.string();
+}
+
+std::string GetTestFilePath(const std::string& directory, const std::string& fileName)
+{
+    using namespace boost::filesystem;
+
+    path directoryPath(directory);
+    path fileNamePath = directoryPath.append(fileName);
+    BOOST_CHECK(exists(fileNamePath));
+
+    return fileNamePath.string();
 }
 
 void OpenCloseHandleTestImpl()
 {
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -83,7 +112,8 @@
 {
     using namespace armnn;
 
-    std::string notSharedObjectFilePath = GetTestFilePath("libarmnnNoSharedObject.txt");
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string notSharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestNoSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(notSharedObjectFilePath), RuntimeException);
@@ -94,7 +124,8 @@
 {
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -114,7 +145,8 @@
 {
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -134,7 +166,8 @@
 {
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -154,7 +187,8 @@
 {
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestSharedObjectFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -230,7 +264,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestValidTestDynamicBackendFileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestValidTestDynamicBackendFileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -274,7 +309,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend1FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend1FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -293,7 +329,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend2FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend2FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -312,7 +349,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend3FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend3FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -331,7 +369,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend4FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend4FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -351,7 +390,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend5FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend5FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -371,7 +411,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend6FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend6FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
@@ -403,7 +444,8 @@
 
     using namespace armnn;
 
-    std::string sharedObjectFilePath = GetTestFilePath(g_TestInvalidTestDynamicBackend7FileName);
+    std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
+    std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend7FileName);
 
     void* sharedObjectHandle = nullptr;
     BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));