IVGCVSW-6676 Register CopyAndImportFactoryPairs to RefBackend and unit tests

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: I9d695418fe240b7115a1c624abcd459f1459301b
diff --git a/src/armnn/test/TensorHandleStrategyTest.cpp b/src/armnn/test/TensorHandleStrategyTest.cpp
index 374479b..c591fff 100644
--- a/src/armnn/test/TensorHandleStrategyTest.cpp
+++ b/src/armnn/test/TensorHandleStrategyTest.cpp
@@ -402,7 +402,7 @@
     // Get mathing import factory id correctly
     CHECK((registry.GetMatchingImportFactoryId(copyId) == importId));
 
-    // Return empty id when Invailid Id is given
+    // Return empty id when Invalid Id is given
     CHECK((registry.GetMatchingImportFactoryId("InvalidFactoryId") == ""));
 }
 
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index ad52434..c38d6b6 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -38,7 +38,12 @@
     auto memoryManager = std::make_shared<RefMemoryManager>();
 
     tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
-    tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<RefTensorHandleFactory>(memoryManager));
+
+    std::unique_ptr<RefTensorHandleFactory> factory = std::make_unique<RefTensorHandleFactory>(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<RefWorkloadFactory>(PolymorphicPointerDowncast<RefMemoryManager>(memoryManager));
 }
@@ -84,7 +89,13 @@
     auto memoryManager = std::make_shared<RefMemoryManager>();
 
     registry.RegisterMemoryManager(memoryManager);
-    registry.RegisterFactory(std::make_unique<RefTensorHandleFactory>(memoryManager));
+
+    std::unique_ptr<RefTensorHandleFactory> factory = std::make_unique<RefTensorHandleFactory>(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> RefBackend::GetDefaultAllocator() const
diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk
index 0ddb16a..33e161c 100644
--- a/src/backends/reference/backend.mk
+++ b/src/backends/reference/backend.mk
@@ -133,6 +133,7 @@
 
 BACKEND_TEST_SOURCES := \
         test/ArgMinMaxTests.cpp \
+        test/RefBackendTests.cpp \
         test/RefCreateWorkloadTests.cpp \
         test/RefDetectionPostProcessTests.cpp \
         test/RefEndToEndTests.cpp \
diff --git a/src/backends/reference/test/CMakeLists.txt b/src/backends/reference/test/CMakeLists.txt
index d5ce355..9d6572a 100644
--- a/src/backends/reference/test/CMakeLists.txt
+++ b/src/backends/reference/test/CMakeLists.txt
@@ -5,6 +5,7 @@
 
 list(APPEND armnnRefBackendUnitTests_sources
     ArgMinMaxTests.cpp
+    RefBackendTests.cpp
     RefCreateWorkloadTests.cpp
     RefDetectionPostProcessTests.cpp
     RefEndToEndTests.cpp
diff --git a/src/backends/reference/test/RefBackendTests.cpp b/src/backends/reference/test/RefBackendTests.cpp
new file mode 100644
index 0000000..5154ea4
--- /dev/null
+++ b/src/backends/reference/test/RefBackendTests.cpp
@@ -0,0 +1,38 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <reference/RefBackend.hpp>
+#include <reference/RefTensorHandleFactory.hpp>
+
+#include <doctest/doctest.h>
+
+using namespace armnn;
+
+TEST_SUITE("RefBackendTests")
+{
+TEST_CASE("RefRegisterTensorHandleFactoriesMatchingImportFactoryId")
+{
+    auto refBackend = std::make_unique<RefBackend>();
+    TensorHandleFactoryRegistry registry;
+    refBackend->RegisterTensorHandleFactories(registry);
+
+    // When calling RegisterTensorHandleFactories, CopyAndImportFactoryPair is registered
+    // Get matching import factory id correctly
+    CHECK((registry.GetMatchingImportFactoryId(RefTensorHandleFactory::GetIdStatic()) ==
+           RefTensorHandleFactory::GetIdStatic()));
+}
+
+TEST_CASE("RefCreateWorkloadFactoryMatchingImportFactoryId")
+{
+    auto refBackend = std::make_unique<RefBackend>();
+    TensorHandleFactoryRegistry registry;
+    refBackend->CreateWorkloadFactory(registry);
+
+    // When calling CreateWorkloadFactory, CopyAndImportFactoryPair is registered
+    // Get matching import factory id correctly
+    CHECK((registry.GetMatchingImportFactoryId(RefTensorHandleFactory::GetIdStatic()) ==
+           RefTensorHandleFactory::GetIdStatic()));
+}
+}