IVGCVSW-6678 Register CopyAndImportFactoryPairs to NeonBackend and unit tests

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: If5392020dfd0caa3f09ea2edbaf0f83ec36ab99b
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 54af14e..66547ad 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -74,7 +74,13 @@
                                                              BaseMemoryManager::MemoryAffinity::Offset);
 
     tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
-    tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
+
+    auto factory = std::make_unique<NeonTensorHandleFactory>(memoryManager);
+    // Register copy and import factory pair
+    tensorHandleFactoryRegistry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId());
+    // Register the factory
+    tensorHandleFactoryRegistry.RegisterFactory(std::move(factory));
+
 
     return std::make_unique<NeonWorkloadFactory>(
         PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager));
@@ -87,7 +93,12 @@
                                                              BaseMemoryManager::MemoryAffinity::Offset);
 
     tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
-    tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
+
+    auto factory = std::make_unique<NeonTensorHandleFactory>(memoryManager);
+    // Register copy and import factory pair
+    tensorHandleFactoryRegistry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId());
+    // Register the factory
+    tensorHandleFactoryRegistry.RegisterFactory(std::move(factory));
 
     return std::make_unique<NeonWorkloadFactory>(
         PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
@@ -424,7 +435,12 @@
                                                              BaseMemoryManager::MemoryAffinity::Offset);
 
     registry.RegisterMemoryManager(memoryManager);
-    registry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
+
+    auto factory = std::make_unique<NeonTensorHandleFactory>(memoryManager);
+    // Register copy and import factory pair
+    registry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId());
+    // Register the factory
+    registry.RegisterFactory(std::move(factory));
 }
 
 std::unique_ptr<ICustomAllocator> NeonBackend::GetDefaultAllocator() const
diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk
index daf2e5e..8ae50ac 100644
--- a/src/backends/neon/backend.mk
+++ b/src/backends/neon/backend.mk
@@ -106,6 +106,7 @@
 # Include the source files for the NEON backend tests
 
 BACKEND_TEST_SOURCES := \
+        test/NeonBackendTests.cpp \
         test/NeonCreateWorkloadTests.cpp \
         test/NeonEndToEndTests.cpp \
         test/NeonJsonPrinterTests.cpp \
diff --git a/src/backends/neon/test/CMakeLists.txt b/src/backends/neon/test/CMakeLists.txt
index e4c5b34..f7438ea 100644
--- a/src/backends/neon/test/CMakeLists.txt
+++ b/src/backends/neon/test/CMakeLists.txt
@@ -4,6 +4,7 @@
 #
 
 list(APPEND armnnNeonBackendUnitTests_sources
+    NeonBackendTests.cpp
     NeonCreateWorkloadTests.cpp
     NeonEndToEndTests.cpp
     NeonJsonPrinterTests.cpp
diff --git a/src/backends/neon/test/NeonBackendTests.cpp b/src/backends/neon/test/NeonBackendTests.cpp
new file mode 100644
index 0000000..23f58a7
--- /dev/null
+++ b/src/backends/neon/test/NeonBackendTests.cpp
@@ -0,0 +1,51 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <neon/NeonBackend.hpp>
+#include <neon/NeonTensorHandleFactory.hpp>
+
+#include <doctest/doctest.h>
+
+using namespace armnn;
+
+TEST_SUITE("NeonBackendTests")
+{
+TEST_CASE("NeonRegisterTensorHandleFactoriesMatchingImportFactoryId")
+{
+    auto neonBackend = std::make_unique<NeonBackend>();
+    TensorHandleFactoryRegistry registry;
+    neonBackend->RegisterTensorHandleFactories(registry);
+
+    // When calling RegisterTensorHandleFactories, CopyAndImportFactoryPair is registered
+    // Get matching import factory id correctly
+    CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) ==
+           NeonTensorHandleFactory::GetIdStatic()));
+}
+
+TEST_CASE("NeonCreateWorkloadFactoryMatchingImportFactoryId")
+{
+    auto neonBackend = std::make_unique<NeonBackend>();
+    TensorHandleFactoryRegistry registry;
+    neonBackend->CreateWorkloadFactory(registry);
+
+    // When calling CreateWorkloadFactory, CopyAndImportFactoryPair is registered
+    // Get matching import factory id correctly
+    CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) ==
+           NeonTensorHandleFactory::GetIdStatic()));
+}
+
+TEST_CASE("NeonCreateWorkloadFactoryWithOptionsMatchingImportFactoryId")
+{
+    auto neonBackend = std::make_unique<NeonBackend>();
+    TensorHandleFactoryRegistry registry;
+    ModelOptions modelOptions;
+    neonBackend->CreateWorkloadFactory(registry, modelOptions);
+
+    // When calling CreateWorkloadFactory with ModelOptions, CopyAndImportFactoryPair is registered
+    // Get matching import factory id correctly
+    CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) ==
+           NeonTensorHandleFactory::GetIdStatic()));
+}
+}