IVGCVSW-4340 Backend profiling: Add tests for Timeline functions

* Add tests for the timeline functions that are part of
  IBackendProfiling: GetSendTimelinePacket & GetProfilingGuidGenerator
* Modify MockBackendProfilingService to store a
  MockBackendProfilingContext shared pointer.

Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: I99fc4b1da019858b9f29409cd59ef8f590c0d3a2
diff --git a/src/backends/backendsCommon/test/BackendProfilingTests.cpp b/src/backends/backendsCommon/test/BackendProfilingTests.cpp
index 6e4a020..4555336 100644
--- a/src/backends/backendsCommon/test/BackendProfilingTests.cpp
+++ b/src/backends/backendsCommon/test/BackendProfilingTests.cpp
@@ -16,6 +16,7 @@
 
 #include <armnn/BackendId.hpp>
 #include <armnn/Logging.hpp>
+#include <armnn/profiling/ISendTimelinePacket.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/numeric/conversion/cast.hpp>
@@ -442,4 +443,69 @@
     BOOST_CHECK(boost::contains(ss.str(), "ActivateCounters example test error"));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_CASE(BackendProfilingContextGetSendTimelinePacket)
+{
+    // Reset the profiling service to the uninitialized state
+    armnn::IRuntime::CreationOptions options;
+    options.m_ProfilingOptions.m_EnableProfiling = true;
+    armnn::profiling::ProfilingService& profilingService = armnn::profiling::ProfilingService::Instance();
+    profilingService.ConfigureProfilingService(options.m_ProfilingOptions, true);
+
+    armnn::MockBackendInitialiser initialiser;
+    // Create a runtime. During this the mock backend will be registered and context returned.
+    armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
+    armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
+    armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext();
+    // Check that there is a valid context set.
+    BOOST_CHECK(mockBackEndProfilingContext);
+    armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
+        mockBackEndProfilingContext->GetBackendProfiling();
+    BOOST_CHECK(backendProfilingIface);
+
+    // Now for the meat of the test. We're just going to send a random packet and make sure there
+    // are no exceptions or errors. The sending of packets is already tested in SendTimelinePacketTests.
+    std::unique_ptr<armnn::profiling::ISendTimelinePacket> timelinePacket =
+        backendProfilingIface->GetSendTimelinePacket();
+    // Send TimelineEntityClassBinaryPacket
+    const uint64_t entityBinaryPacketProfilingGuid = 123456u;
+    timelinePacket->SendTimelineEntityBinaryPacket(entityBinaryPacketProfilingGuid);
+    timelinePacket->Commit();
+
+    // Reset the profiling servie after the test.
+    options.m_ProfilingOptions.m_EnableProfiling = false;
+    profilingService.ResetExternalProfilingOptions(options.m_ProfilingOptions, true);
+}
+
+BOOST_AUTO_TEST_CASE(GetProfilingGuidGenerator)
+{
+    // Reset the profiling service to the uninitialized state
+    armnn::IRuntime::CreationOptions options;
+    options.m_ProfilingOptions.m_EnableProfiling = true;
+    armnn::profiling::ProfilingService& profilingService = armnn::profiling::ProfilingService::Instance();
+    profilingService.ConfigureProfilingService(options.m_ProfilingOptions, true);
+
+    armnn::MockBackendInitialiser initialiser;
+    // Create a runtime. During this the mock backend will be registered and context returned.
+    armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
+    armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
+    armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext();
+    // Check that there is a valid context set.
+    BOOST_CHECK(mockBackEndProfilingContext);
+    armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
+        mockBackEndProfilingContext->GetBackendProfiling();
+    BOOST_CHECK(backendProfilingIface);
+
+    // Get the Guid generator and check the getting two Guid's results in the second being greater than the first.
+    armnn::profiling::IProfilingGuidGenerator& guidGenerator = backendProfilingIface->GetProfilingGuidGenerator();
+    BOOST_CHECK(backendProfilingIface);
+    const armnn::profiling::ProfilingDynamicGuid& firstGuid = guidGenerator.NextGuid();
+    BOOST_CHECK(firstGuid);
+    const armnn::profiling::ProfilingDynamicGuid& secondGuid = guidGenerator.NextGuid();
+    BOOST_CHECK(secondGuid > firstGuid);
+
+    // Reset the profiling servie after the test.
+    options.m_ProfilingOptions.m_EnableProfiling = false;
+    profilingService.ResetExternalProfilingOptions(options.m_ProfilingOptions, true);
+}
+
+BOOST_AUTO_TEST_SUITE_END()