MLECO-1870: Cherry pick profiling changes from dev to open source repo
* Documentation update

Change-Id: If85e7ebc44498840b291c408f14e66a5a5faa424
Signed-off-by: Isabella Gottardi <isabella.gottardi@arm.com>
diff --git a/tests/common/ProfilerTests.cc b/tests/common/ProfilerTests.cc
index caf492b..1435dde 100644
--- a/tests/common/ProfilerTests.cc
+++ b/tests/common/ProfilerTests.cc
@@ -34,28 +34,73 @@
     hal_init(&platform, &data_acq, &data_psn, &timer);
     hal_platform_init(&platform);
 
-    /* An invalid profiler shouldn't be of much use. */
-    arm::app::Profiler profilerInvalid {nullptr, "test_invalid"};
-    REQUIRE(false == profilerInvalid.StartProfiling());
-    REQUIRE(false == profilerInvalid.StopProfiling());
+    /* An invalid profiler shouldn't be of much use */
+    SECTION("Test invalid profiler") {
+        arm::app::Profiler profilerInvalid{nullptr, "test_invalid"};
+        REQUIRE(false == profilerInvalid.StartProfiling());
+        REQUIRE(false == profilerInvalid.StopProfiling());
+    }
 
-    arm::app::Profiler profilerValid{&platform, "test_valid"};
-    REQUIRE(true == profilerValid.StartProfiling());
-    REQUIRE(true == profilerValid.StopProfiling());
+    SECTION("Test valid profiler") {
+        arm::app::Profiler profilerValid{&platform, "test_valid"};
+        REQUIRE(true == profilerValid.StartProfiling());
+        REQUIRE(true == profilerValid.StopProfiling());
+        std::vector<arm::app::ProfileResult> results;
+        profilerValid.GetAllResultsAndReset(results);
+        REQUIRE(results.size() == 1);
+        REQUIRE(results[0].name == "test_valid");
+        /* Abuse should still fail: */
+        REQUIRE(false == profilerValid.StopProfiling()); /* We need to start it first */
+        REQUIRE(true == profilerValid.StartProfiling()); /* Should be able to start it fine */
+        REQUIRE(false == profilerValid.StartProfiling()); /* Can't restart it without resetting */
+        profilerValid.Reset();
+        REQUIRE(true == profilerValid.StartProfiling()); /* Can start it again now.. */
+        REQUIRE(true == profilerValid.StopProfiling());
+    }
 
-    std::string strProfile = profilerValid.GetResultsAndReset();
-    REQUIRE(std::string::npos != strProfile.find("test_valid"));
+    SECTION("Test multiple profilers") {
+        arm::app::Profiler profilerValid{&platform, "one"};
+        REQUIRE(true == profilerValid.StartProfiling());
+        REQUIRE(true == profilerValid.StopProfiling());
 
-#if defined(CPU_PROFILE_ENABLED)
-    /* We should have milliseconds elapsed. */
-    REQUIRE(std::string::npos != strProfile.find("ms"));
-#endif /* defined(CPU_PROFILE_ENABLED) */
+        REQUIRE(true == profilerValid.StartProfiling("two"));
+        REQUIRE(true == profilerValid.StopProfiling());
+        REQUIRE(true == profilerValid.StartProfiling("two"));
+        REQUIRE(true == profilerValid.StopProfiling());
 
-    /* Abuse should fail: */
-    REQUIRE(false == profilerValid.StopProfiling());  /* We need to start it first. */
-    REQUIRE(true == profilerValid.StartProfiling());  /* Should be able to start it fine. */
-    REQUIRE(false == profilerValid.StartProfiling()); /* Can't restart it without resetting. */
-    profilerValid.Reset();                            /* Reset. */
-    REQUIRE(true == profilerValid.StartProfiling());  /* Can start it again now. */
-    REQUIRE(true == profilerValid.StopProfiling());   /* Can start it again now. */
-}
+        std::vector<arm::app::ProfileResult> results;
+        profilerValid.GetAllResultsAndReset(results);
+        REQUIRE(results.size() == 2);
+        REQUIRE(results[0].name == "one");
+        REQUIRE(results[0].samplesNum == 1);
+        REQUIRE(results[1].name == "two");
+        REQUIRE(results[1].samplesNum == 2);
+    }
+
+#if defined (CPU_PROFILE_ENABLED)
+    SECTION("Test CPU profiler") {
+
+        arm::app::Profiler profilerCPU{&platform, "test cpu"};
+        std::vector<arm::app::ProfileResult> results;
+        profilerCPU.StartProfiling();
+        profilerCPU.StopProfiling();
+        profilerCPU.GetAllResultsAndReset(results);
+        REQUIRE(results.size() == 1);
+        bool foundTime = false;
+        bool foundCPU_ACTIVE = false;
+        for(arm::app::Statistics& stat: results[0].data) {
+
+            if (!foundTime) {
+                foundTime = stat.name == "Time";
+            }
+
+            if (!foundCPU_ACTIVE) {
+                foundCPU_ACTIVE = stat.name == "CPU ACTIVE";
+            }
+
+        }
+        REQUIRE(foundTime);
+        REQUIRE(foundCPU_ACTIVE);
+    }
+#endif /* defined (CPU_PROFILE_ENABLED) */
+}
\ No newline at end of file
diff --git a/tests/use_case/img_class/ImgClassificationUCTest.cc b/tests/use_case/img_class/ImgClassificationUCTest.cc
index abfcc44..b989415 100644
--- a/tests/use_case/img_class/ImgClassificationUCTest.cc
+++ b/tests/use_case/img_class/ImgClassificationUCTest.cc
@@ -53,7 +53,7 @@
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
-    arm::app::MobileNetModel model;    
+    arm::app::MobileNetModel model;
 
     /* Load the model. */
     REQUIRE(model.Init());
@@ -61,6 +61,8 @@
     /* Instantiate application context. */
     arm::app::ApplicationContext caseContext;
 
+    arm::app::Profiler profiler{&platform, "img_class"};
+    caseContext.Set<arm::app::Profiler&>("profiler", profiler);
     caseContext.Set<hal_platform&>("platform", platform);
     caseContext.Set<arm::app::Model&>("model", model);
     caseContext.Set<uint32_t>("imgIndex", 0);
@@ -99,6 +101,8 @@
     /* Instantiate application context. */
     arm::app::ApplicationContext caseContext;
 
+    arm::app::Profiler profiler{&platform, "img_class"};
+    caseContext.Set<arm::app::Profiler&>("profiler", profiler);
     caseContext.Set<hal_platform&>("platform", platform);
     caseContext.Set<arm::app::Model&>("model", model);
     caseContext.Set<uint32_t>("imgIndex", 0);
diff --git a/tests/use_case/kws/KWSHandlerTest.cc b/tests/use_case/kws/KWSHandlerTest.cc
index dee2f6f..50e5a83 100644
--- a/tests/use_case/kws/KWSHandlerTest.cc
+++ b/tests/use_case/kws/KWSHandlerTest.cc
@@ -60,6 +60,9 @@
 
     /* Instantiate application context. */
     arm::app::ApplicationContext caseContext;
+
+    arm::app::Profiler profiler{&platform, "kws"};
+    caseContext.Set<arm::app::Profiler&>("profiler", profiler);
     caseContext.Set<hal_platform&>("platform", platform);
     caseContext.Set<arm::app::Model&>("model", model);
     caseContext.Set<int>("frameLength", g_FrameLength);  /* 640 sample length for DSCNN. */
@@ -137,6 +140,8 @@
     /* Instantiate application context. */
     arm::app::ApplicationContext caseContext;
 
+    arm::app::Profiler profiler{&platform, "kws"};
+    caseContext.Set<arm::app::Profiler&>("profiler", profiler);
     caseContext.Set<hal_platform&>("platform", platform);
     caseContext.Set<arm::app::Model&>("model", model);
     caseContext.Set<uint32_t>("clipIndex", 0);