IVGCVSW-6635 Move MemCopyTestImpl from acl to armnnTestUtils.

* Move MemCopyTestImpl.hpp from src/backends/aclCommon/test/ to
  include/armnnTestutils.
* Refactor MemCopyTests in aclCommon, cl and Neon.
* Introduce RefMemCopyTests to exercise this utility in x86 builds.

Signed-off-by: Colm Donelan <colm.donelan@arm.com>
Change-Id: I8824f013d3656658ed0a2904bb79384e3af68641
diff --git a/src/backends/aclCommon/test/MemCopyTestImpl.hpp b/src/backends/aclCommon/test/MemCopyTestImpl.hpp
index 956ea27..0c38ed9 100644
--- a/src/backends/aclCommon/test/MemCopyTestImpl.hpp
+++ b/src/backends/aclCommon/test/MemCopyTestImpl.hpp
@@ -1,94 +1,10 @@
 //
-// Copyright © 2017 Arm Ltd. All rights reserved.
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
-#pragma once
 
-#include <ResolveType.hpp>
-#include <armnn/backends/IBackendInternal.hpp>
+#include <armnnTestUtils/MemCopyTestImpl.hpp>
 
-#include <test/TensorHelpers.hpp>
-
-#include <armnnTestUtils/LayerTestResult.hpp>
-#include <armnnTestUtils/TensorCopyUtils.hpp>
-#include <armnnTestUtils/WorkloadTestUtils.hpp>
-#include <backendsCommon/test/WorkloadFactoryHelper.hpp>
-
-namespace
-{
-
-template<armnn::DataType dataType, typename T = armnn::ResolveType<dataType>>
-LayerTestResult<T, 4> MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory,
-                                  armnn::IWorkloadFactory& dstWorkloadFactory,
-                                  bool withSubtensors)
-{
-    const std::array<unsigned int, 4> shapeData = { { 1u, 1u, 6u, 5u } };
-    const armnn::TensorShape tensorShape(4, shapeData.data());
-    const armnn::TensorInfo tensorInfo(tensorShape, dataType);
-    std::vector<T> inputData =
-    {
-         1,  2,  3,  4,  5,
-         6,  7,  8,  9, 10,
-        11, 12, 13, 14, 15,
-        16, 17, 18, 19, 20,
-        21, 22, 23, 24, 25,
-        26, 27, 28, 29, 30,
-    };
-
-    LayerTestResult<T, 4> ret(tensorInfo);
-    ret.m_ExpectedData = inputData;
-
-    std::vector<T> actualOutput(tensorInfo.GetNumElements());
-
-    ARMNN_NO_DEPRECATE_WARN_BEGIN
-    auto inputTensorHandle = srcWorkloadFactory.CreateTensorHandle(tensorInfo);
-    auto outputTensorHandle = dstWorkloadFactory.CreateTensorHandle(tensorInfo);
-    ARMNN_NO_DEPRECATE_WARN_END
-
-    AllocateAndCopyDataToITensorHandle(inputTensorHandle.get(), inputData.data());
-    outputTensorHandle->Allocate();
-
-    armnn::MemCopyQueueDescriptor memCopyQueueDesc;
-    armnn::WorkloadInfo workloadInfo;
-
-    const unsigned int origin[4] = {};
-
-    ARMNN_NO_DEPRECATE_WARN_BEGIN
-    auto workloadInput = (withSubtensors && srcWorkloadFactory.SupportsSubTensors())
-                         ? srcWorkloadFactory.CreateSubTensorHandle(*inputTensorHandle, tensorShape, origin)
-                         : std::move(inputTensorHandle);
-    auto workloadOutput = (withSubtensors && dstWorkloadFactory.SupportsSubTensors())
-                          ? dstWorkloadFactory.CreateSubTensorHandle(*outputTensorHandle, tensorShape, origin)
-                          : std::move(outputTensorHandle);
-    ARMNN_NO_DEPRECATE_WARN_END
-
-    AddInputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadInput.get());
-    AddOutputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadOutput.get());
-
-    dstWorkloadFactory.CreateWorkload(armnn::LayerType::MemCopy, memCopyQueueDesc, workloadInfo)->Execute();
-
-    CopyDataFromITensorHandle(actualOutput.data(), workloadOutput.get());
-    ret.m_ActualData = actualOutput;
-
-    return ret;
-}
-
-template<typename SrcWorkloadFactory,
-         typename DstWorkloadFactory,
-         armnn::DataType dataType,
-         typename T = armnn::ResolveType<dataType>>
-LayerTestResult<T, 4> MemCopyTest(bool withSubtensors)
-{
-    armnn::IBackendInternal::IMemoryManagerSharedPtr srcMemoryManager =
-        WorkloadFactoryHelper<SrcWorkloadFactory>::GetMemoryManager();
-
-    armnn::IBackendInternal::IMemoryManagerSharedPtr dstMemoryManager =
-        WorkloadFactoryHelper<DstWorkloadFactory>::GetMemoryManager();
-
-    SrcWorkloadFactory srcWorkloadFactory = WorkloadFactoryHelper<SrcWorkloadFactory>::GetFactory(srcMemoryManager);
-    DstWorkloadFactory dstWorkloadFactory = WorkloadFactoryHelper<DstWorkloadFactory>::GetFactory(dstMemoryManager);
-
-    return MemCopyTest<dataType>(srcWorkloadFactory, dstWorkloadFactory, withSubtensors);
-}
-
-} // anonymous namespace
+#pragma message("./src/backends/aclCommon/test/MemCopyTestImpl.hpp has been"\
+                " deprecated, it is due for removal in 22.11 release. Please"\
+                " use public interface include/armnnTestUtils/MemCopyTestImpl.hpp")
diff --git a/src/backends/aclCommon/test/MemCopyTests.cpp b/src/backends/aclCommon/test/MemCopyTests.cpp
index 1325503..7b7d4ff 100644
--- a/src/backends/aclCommon/test/MemCopyTests.cpp
+++ b/src/backends/aclCommon/test/MemCopyTests.cpp
@@ -4,13 +4,13 @@
 //
 
 #include <aclCommon/ArmComputeTensorUtils.hpp>
-#include <aclCommon/test/MemCopyTestImpl.hpp>
 
 #if defined(ARMCOMPUTECL_ENABLED) && defined(ARMCOMPUTENEON_ENABLED)
+#include <armnnTestUtils/LayerTestResult.hpp>
+#include <armnnTestUtils/MemCopyTestImpl.hpp>
 #include <cl/ClWorkloadFactory.hpp>
 #include <cl/test/ClContextControlFixture.hpp>
 #include <cl/test/ClWorkloadFactoryHelper.hpp>
-
 #include <neon/NeonWorkloadFactory.hpp>
 #include <neon/test/NeonWorkloadFactoryHelper.hpp>
 #endif
@@ -42,6 +42,50 @@
 
 #if defined(ARMCOMPUTECL_ENABLED) && defined(ARMCOMPUTENEON_ENABLED)
 
+namespace
+{
+
+template <>
+struct MemCopyTestHelper<armnn::NeonWorkloadFactory>
+{
+    static armnn::IBackendInternal::IMemoryManagerSharedPtr GetMemoryManager()
+    {
+        armnn::NeonBackend backend;
+        return backend.CreateMemoryManager();
+    }
+
+    static armnn::NeonWorkloadFactory GetFactory(
+        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+        const armnn::ModelOptions& modelOptions = {})
+    {
+        armnn::NeonBackend backend;
+        return armnn::NeonWorkloadFactory(armnn::PolymorphicPointerDowncast<armnn::NeonMemoryManager>(memoryManager),
+                                          backend.CreateBackendSpecificModelContext(modelOptions));
+    }
+};
+
+template <>
+struct MemCopyTestHelper<armnn::ClWorkloadFactory>
+{
+    static armnn::IBackendInternal::IMemoryManagerSharedPtr GetMemoryManager()
+    {
+        armnn::ClBackend backend;
+        return backend.CreateMemoryManager();
+    }
+
+    static armnn::ClWorkloadFactory GetFactory(
+        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+        const armnn::ModelOptions& modelOptions = {})
+    {
+        armnn::ClBackend backend;
+        return armnn::ClWorkloadFactory(armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager),
+                                        backend.CreateBackendSpecificModelContext(modelOptions));
+    }
+};
+}    // namespace
+
+
+
 TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenNeonAndGpu")
 {
     LayerTestResult<float, 4> result =