IVGCVSW-2017: Refactored L2Normalisation Tests

* L2Normalisation Tests now take the layout as an argument.

Change-Id: Ib393889eedb3a81c9a500da91593e90a18549c33
diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp
index 85b3e1b..2556a3e 100755
--- a/src/backends/backendsCommon/test/LayerTests.cpp
+++ b/src/backends/backendsCommon/test/LayerTests.cpp
@@ -66,6 +66,24 @@
 // 2-channel bias used by a number of Conv2d tests.
 static std::vector<float> Bias2({0, 2});
 
+armnn::TensorShape GetTestTensorShape(unsigned int numberOfBatches,
+                                      unsigned int numberOfChannels,
+                                      unsigned int height,
+                                      unsigned int width,
+                                      const armnn::DataLayoutIndexed& dataLayout)
+{
+    switch (dataLayout.GetDataLayout())
+    {
+        case armnn::DataLayout::NCHW:
+            return armnn::TensorShape({numberOfBatches, numberOfChannels, height, width});
+        case armnn::DataLayout::NHWC:
+            return armnn::TensorShape({numberOfBatches, height, width, numberOfChannels});
+        default:
+            throw armnn::InvalidArgumentException("unknown data layout ["
+                                                  + std::to_string(static_cast<int>(dataLayout.GetDataLayout())) + "]");
+    }
+}
+
 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
 template<typename T>
 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale, int32_t qOffset)
@@ -3396,21 +3414,38 @@
                                                   const armnn::TensorShape& inputOutputTensorShape,
                                                   const std::vector<float>& inputValues,
                                                   const std::vector<float>& expectedOutputValues,
-                                                  armnn::DataLayout dataLayout)
+                                                  const armnn::DataLayoutIndexed& layout)
 {
     const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
     const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
 
-    auto inputTensor = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(inputValues));
+    // at this point if we require it permute the input data
+    const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
+    std::vector<float> inputData = inputValues;
+    if (layout.GetDataLayout() == armnn::DataLayout::NHWC)
+    {
+        std::vector<float> tmp(inputData.size());
+        armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data());
+        inputData = tmp;
+    }
+
+    auto inputTensor = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(inputData));
 
     LayerTestResult<float, 4> result(outputTensorInfo);
-    result.outputExpected = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(expectedOutputValues));
+    std::vector<float> expectedOutputData = expectedOutputValues;
+    if (layout.GetDataLayout() == armnn::DataLayout::NHWC)
+    {
+        std::vector<float> tmp(expectedOutputData.size());
+        armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, expectedOutputData.data(), tmp.data());
+        expectedOutputData = tmp;
+    }
+    result.outputExpected = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(expectedOutputData));
 
     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
 
     armnn::L2NormalizationQueueDescriptor descriptor;
-    descriptor.m_Parameters.m_DataLayout = dataLayout;
+    descriptor.m_Parameters.m_DataLayout = layout.GetDataLayout();
     armnn::WorkloadInfo info;
 
     AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
@@ -3848,14 +3883,21 @@
   return Pad4dTestCommon<float>(workloadFactory, 0.0f, 0);
 }
 
-LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 1
     // Height: 1
     // Channels: 10
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 10;
+    unsigned int height = 1;
+    unsigned int width = 1;
 
-    const armnn::TensorShape inputOutputShape{ 1, 10, 1, 1 };
+
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (1) x Width (1)
@@ -3905,50 +3947,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization1dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 1
-    // Height: 1
-    // Channels: 10
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 1, 1, 10 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (1) x Channel (10)
-        1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f
-    };
-    const float approxInvL2Norm = 0.050964719f;
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (1) x Channel (10)
-         1.0f * approxInvL2Norm,
-         2.0f * approxInvL2Norm,
-         3.0f * approxInvL2Norm,
-         4.0f * approxInvL2Norm,
-         5.0f * approxInvL2Norm,
-         6.0f * approxInvL2Norm,
-         7.0f * approxInvL2Norm,
-         8.0f * approxInvL2Norm,
-         9.0f * approxInvL2Norm,
-        10.0f * approxInvL2Norm
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 5
     // Height: 1
     // Channels: 2
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 2;
+    unsigned int height = 1;
+    unsigned int width = 5;
 
-    const armnn::TensorShape inputOutputShape{ 1, 2, 1, 5 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (1) x Width (5)
@@ -3975,53 +3990,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization2dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 5
-    // Height: 1
-    // Channels: 2
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 1, 5, 2 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (5) x Channel (2)
-        1.0f,  2.0f,
-        3.0f,  4.0f,
-        5.0f,  6.0f,
-        7.0f,  8.0f,
-        9.0f, 10.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (5) x Channel (2)
-        1.0f * CalcInvL2Norm({ 1.0f,  2.0f }),
-        2.0f * CalcInvL2Norm({ 1.0f,  2.0f }),
-        3.0f * CalcInvL2Norm({ 3.0f,  4.0f }),
-        4.0f * CalcInvL2Norm({ 3.0f,  4.0f }),
-        5.0f * CalcInvL2Norm({ 5.0f,  6.0f }),
-        6.0f * CalcInvL2Norm({ 5.0f,  6.0f }),
-        7.0f * CalcInvL2Norm({ 7.0f,  8.0f }),
-        8.0f * CalcInvL2Norm({ 7.0f,  8.0f }),
-        9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
-       10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 3
     // Height: 4
     // Channels: 2
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 2;
+    unsigned int height = 4;
+    unsigned int width = 3;
 
-    const armnn::TensorShape inputOutputShape{ 1, 2, 4, 3 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (4) x Width (3)
@@ -4068,86 +4053,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization3dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 3
-    // Height: 4
-    // Channels: 2
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 4, 3, 2 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (2)
-        119.0f, 110.0f,
-         21.0f, 140.0f,
-        150.0f,  73.0f,
-
-        // Batch 0, Height 1, Width (3) x Channel (2)
-        149.0f, 211.0f,
-         32.0f, 212.0f,
-        179.0f,  89.0f,
-
-        // Batch 0, Height 2, Width (3) x Channel (2)
-         15.0f,  24.0f,
-        227.0f, 138.0f,
-        141.0f, 188.0f,
-
-        // Batch 0, Height 3, Width (3) x Channel (2)
-        147.0f, 162.0f,
-        199.0f,  12.0f,
-        220.0f, 161.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (2)
-        119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
-        110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
-         21.0f * CalcInvL2Norm({  21.0f, 140.0f }),
-        140.0f * CalcInvL2Norm({  21.0f, 140.0f }),
-        150.0f * CalcInvL2Norm({ 150.0f,  73.0f }),
-         73.0f * CalcInvL2Norm({ 150.0f,  73.0f }),
-
-        // Batch 0, Height 1, Width (3) x Channel (2)
-        149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
-        211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
-         32.0f * CalcInvL2Norm({  32.0f, 212.0f }),
-        212.0f * CalcInvL2Norm({  32.0f, 212.0f }),
-        179.0f * CalcInvL2Norm({ 179.0f,  89.0f }),
-         89.0f * CalcInvL2Norm({ 179.0f,  89.0f }),
-
-        // Batch 0, Height 2, Width (3) x Channel (2)
-         15.0f * CalcInvL2Norm({  15.0f,  24.0f }),
-         24.0f * CalcInvL2Norm({  15.0f,  24.0f }),
-        227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
-        138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
-        141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
-        188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
-
-        // Batch 0, Height 3, Width (3) x Channel (2)
-        147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
-        162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
-        199.0f * CalcInvL2Norm({ 199.0f,  12.0f }),
-         12.0f * CalcInvL2Norm({ 199.0f,  12.0f }),
-        220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
-        161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 3
     // Height: 4
     // Channels: 3
     // BatchSize: 2
+    unsigned int numberOfBatches = 2;
+    unsigned int numberOfChannels = 3;
+    unsigned int height = 4;
+    unsigned int width = 3;
 
-    const armnn::TensorShape inputOutputShape{ 2, 3, 4, 3 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (4) x Width (3)
@@ -4274,152 +4196,7 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
-}
-
-LayerTestResult<float, 4> L2Normalization4dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 3
-    // Height: 4
-    // Channels: 3
-    // BatchSize: 2
-
-    const armnn::TensorShape inputOutputShape{ 2, 4, 3, 3 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (3)
-        235.0f, 113.0f,  56.0f,
-         46.0f,  95.0f, 170.0f,
-        178.0f, 202.0f, 162.0f,
-
-        // Batch 0, Height 1, Width (3) x Channel (3)
-        100.0f,  77.0f, 194.0f,
-        123.0f, 114.0f,  89.0f,
-         19.0f,  71.0f, 254.0f,
-
-        // Batch 0, Height 2, Width (3) x Channel (3)
-        172.0f, 122.0f,  12.0f,
-         74.0f, 246.0f, 209.0f,
-        250.0f, 166.0f, 200.0f,
-
-        // Batch 0, Height 3, Width (3) x Channel (3)
-          6.0f,  82.0f,   1.0f,
-        195.0f,  28.0f,  64.0f,
-         80.0f,  37.0f,  54.0f,
-
-        // Batch 1, Height 0, Width (3) x Channel (3)
-         67.0f, 239.0f,  97.0f,
-         90.0f, 104.0f, 145.0f,
-         49.0f, 199.0f, 215.0f,
-
-        // Batch 1, Height 1, Width (3) x Channel (3)
-          7.0f,  17.0f, 115.0f,
-        163.0f, 124.0f, 116.0f,
-         18.0f, 153.0f, 238.0f,
-
-        // Batch 1, Height 2, Width (3) x Channel (3)
-         25.0f, 222.0f, 226.0f,
-        117.0f, 217.0f,  16.0f,
-        103.0f,  75.0f, 132.0f,
-
-        // Batch 1, Height 3, Width (3) x Channel (3)
-        247.0f,  32.0f,  92.0f,
-         59.0f, 126.0f, 125.0f,
-        189.0f,  21.0f,  88.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (3)
-        235.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-        113.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-         56.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-         46.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-         95.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-        170.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-        178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-        202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-        162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-
-        // Batch 0, Height 1, Width (3) x Channel (3)
-        100.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-         77.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-        194.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-        123.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-        114.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-         89.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-         19.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-         71.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-        254.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-
-        // Batch 0, Height 2, Width (3) x Channel (3)
-        172.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-        122.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-         12.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-         74.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        246.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        209.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-        166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-        200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-
-        // Batch 0, Height 3, Width (3) x Channel (3)
-          6.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-         82.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-          1.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-        195.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         28.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         64.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         80.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-         37.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-         54.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-
-        // Batch 1, Height 0, Width (3) x Channel (3)
-         67.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-        239.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-         97.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-         90.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-        104.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-        145.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-         49.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-        199.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-        215.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-
-        // Batch 1, Height 1, Width (3) x Channel (3)
-          7.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-         17.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-        115.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-        163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-        124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-        116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-         18.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-        153.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-        238.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-
-        // Batch 1, Height 2, Width (3) x Channel (3)
-         25.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        222.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        226.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        117.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-        217.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-         16.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-        103.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-         75.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-        132.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-
-        // Batch 1, Height 3, Width (3) x Channel (3)
-        247.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         32.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         92.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         59.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        126.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        125.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        189.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f }),
-         21.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f }),
-         88.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
+                                   inputValues, expectedOutputValues, layout);
 }
 
 template <typename T>
diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp
index cd8758e..34d5583 100644
--- a/src/backends/backendsCommon/test/LayerTests.hpp
+++ b/src/backends/backendsCommon/test/LayerTests.hpp
@@ -280,15 +280,14 @@
 
 LayerTestResult<float, 2> FakeQuantizationTest(armnn::IWorkloadFactory& workloadFactory);
 
-LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory);
-
-LayerTestResult<float, 4> L2Normalization1dNhwcTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization2dNhwcTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization3dNhwcTest(armnn::IWorkloadFactory& workloadFactory);
-LayerTestResult<float, 4> L2Normalization4dNhwcTest(armnn::IWorkloadFactory& workloadFactory);
+LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout);
+LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout);
+LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout);
+LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout);
 
 LayerTestResult<float, 4> ConstantTest(armnn::IWorkloadFactory& workloadFactory);
 
diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp
index c7d64ef..2559fb4 100755
--- a/src/backends/cl/test/ClLayerTests.cpp
+++ b/src/backends/cl/test/ClLayerTests.cpp
@@ -224,15 +224,15 @@
 ARMNN_AUTO_TEST_CASE(BatchNormNhwc, BatchNormNhwcTest)
 
 // L2 Normalization
-ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest)
+ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest, armnn::DataLayout::NCHW)
 
-ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dNhwcTest)
+ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dTest, armnn::DataLayout::NHWC)
 
 // Resize Bilinear - NCHW data layout
 ARMNN_AUTO_TEST_CASE(ResizeBilinearNop, ResizeBilinearNopTest, armnn::DataLayout::NCHW)
diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp
index 48ef667..d4bfa17 100644
--- a/src/backends/neon/test/NeonLayerTests.cpp
+++ b/src/backends/neon/test/NeonLayerTests.cpp
@@ -415,15 +415,15 @@
 ARMNN_AUTO_TEST_CASE(Concatenation3dDim2DiffInputDimsUint8, Concatenation3dDim2DiffInputDimsUint8Test)
 
 // L2 Normalization
-ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest)
+ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest, armnn::DataLayout::NCHW)
 
-ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dNhwcTest)
+ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dTest, armnn::DataLayout::NHWC)
 
 // Floor
 ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest)
diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp
index 95ddbad..8bbf11b 100644
--- a/src/backends/reference/test/RefLayerTests.cpp
+++ b/src/backends/reference/test/RefLayerTests.cpp
@@ -270,10 +270,15 @@
 ARMNN_AUTO_TEST_CASE(FakeQuantization, FakeQuantizationTest)
 
 // L2 Normalization
-ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest)
+ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest, armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest, armnn::DataLayout::NCHW)
+
+ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dTest, armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dTest, armnn::DataLayout::NHWC)
 
 // Pad
 ARMNN_AUTO_TEST_CASE(PadFloat322d, PadFloat322dTest)
@@ -284,10 +289,6 @@
 ARMNN_AUTO_TEST_CASE(PadUint83d, PadUint83dTest)
 ARMNN_AUTO_TEST_CASE(PadUint84d, PadUint84dTest)
 
-ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dNhwcTest)
-ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dNhwcTest)
 
 // Constant
 ARMNN_AUTO_TEST_CASE(Constant, ConstantTest)