IVGCVSW-3543 Implement the backend versioning algorithm

 * Added version structure for backends, with comparisons operators
 * Added version to IBackendInternal
 * Added version utility function to DynamicBackendUtils class

Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
Change-Id: I3697469675c27f79f7cfb296cfa69ec7e06375e5
diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt
index 7c2d0eb..3ddaaaf 100644
--- a/src/backends/backendsCommon/test/CMakeLists.txt
+++ b/src/backends/backendsCommon/test/CMakeLists.txt
@@ -19,6 +19,8 @@
     DequantizeEndToEndTestImpl.hpp
     DetectionPostProcessLayerTestImpl.hpp
     DetectionPostProcessTestImpl.hpp
+    DynamicBackendTests.cpp
+    DynamicBackendTests.hpp
     EndToEndTestImpl.hpp
     FullyConnectedTestImpl.hpp
     GatherTestImpl.hpp
diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.cpp b/src/backends/backendsCommon/test/DynamicBackendTests.cpp
new file mode 100644
index 0000000..5104d06
--- /dev/null
+++ b/src/backends/backendsCommon/test/DynamicBackendTests.cpp
@@ -0,0 +1,12 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "DynamicBackendTests.hpp"
+
+BOOST_AUTO_TEST_SUITE(DynamicBackendTests)
+
+ARMNN_SIMPLE_TEST_CASE(BackendVersioning, BackendVersioningTestImpl);
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.hpp b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
new file mode 100644
index 0000000..3b0c95b
--- /dev/null
+++ b/src/backends/backendsCommon/test/DynamicBackendTests.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <backendsCommon/DynamicBackendUtils.hpp>
+
+#include <test/UnitTests.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+void BackendVersioningTestImpl()
+{
+    class TestDynamicBackendUtils : public armnn::DynamicBackendUtils
+    {
+    public:
+        static bool IsBackendCompatibleTest(const armnn::BackendVersion& backendApiVersion,
+                                            const armnn::BackendVersion& backendVersion)
+        {
+            return IsBackendCompatibleImpl(backendApiVersion, backendVersion);
+        }
+    };
+
+    // The backend API version used for the tests
+    armnn::BackendVersion backendApiVersion{ 2, 4 };
+
+    // Same backend and backend API versions are compatible with the backend API
+    armnn::BackendVersion sameBackendVersion{ 2, 4 };
+    BOOST_TEST(sameBackendVersion == backendApiVersion);
+    BOOST_TEST(sameBackendVersion <= backendApiVersion);
+    BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, sameBackendVersion) == true);
+
+    // Backend versions that differ from the backend API version by major revision are not compatible
+    // with the backend API
+    armnn::BackendVersion laterMajorBackendVersion{ 3, 4 };
+    BOOST_TEST(!(laterMajorBackendVersion == backendApiVersion));
+    BOOST_TEST(!(laterMajorBackendVersion <= backendApiVersion));
+    BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMajorBackendVersion) == false);
+
+    armnn::BackendVersion earlierMajorBackendVersion{ 1, 4 };
+    BOOST_TEST(!(earlierMajorBackendVersion == backendApiVersion));
+    BOOST_TEST(earlierMajorBackendVersion <= backendApiVersion);
+    BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion,
+                                                                earlierMajorBackendVersion) == false);
+
+    // Backend versions with the same major revision but later minor revision than
+    // the backend API version are not compatible with the backend API
+    armnn::BackendVersion laterMinorBackendVersion{ 2, 5 };
+    BOOST_TEST(!(laterMinorBackendVersion == backendApiVersion));
+    BOOST_TEST(!(laterMinorBackendVersion <= backendApiVersion));
+    BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMinorBackendVersion) == false);
+
+    // Backend versions with the same major revision but earlier minor revision than
+    // the backend API version are compatible with the backend API
+    armnn::BackendVersion earlierMinorBackendVersion{ 2, 3 };
+    BOOST_TEST(!(earlierMinorBackendVersion == backendApiVersion));
+    BOOST_TEST(earlierMinorBackendVersion <= backendApiVersion);
+    BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, earlierMinorBackendVersion) == true);
+}