IVGCVSW-7235 Errors from LoadNetwork are being ignored in ArmNNExecutor.

In ArmNNExecutor::ArmNNExecutor the call to m_Runtime->LoadNetwork was
ignoring the Status result and continuing to execute with a failed
network. In addition throwing an exception from the constructor resulted
in a segmentation fault.

* Modify IExecutor to allow the constructor to mark itself as failed.
* Modify ArmNNExecutor to mark itself as failed when LoadNetwork returns
  an error.
* Modify ExecuteNetwork to check the value of m_constructionFailed.

Signed-off-by: Colm Donelan <colm.donelan@arm.com>
Change-Id: Idf222cb2b66e1051875dc67046734f2b00b288d1
diff --git a/tests/ExecuteNetwork/ArmNNExecutor.cpp b/tests/ExecuteNetwork/ArmNNExecutor.cpp
index d1892f9..1e409e8 100644
--- a/tests/ExecuteNetwork/ArmNNExecutor.cpp
+++ b/tests/ExecuteNetwork/ArmNNExecutor.cpp
@@ -28,8 +28,6 @@
     m_IOInfo = GetIOInfo(optNet.get());
     SetupInputsAndOutputs();
 
-    std::string errorMsg;
-
     armnn::ProfilingDetailsMethod profilingDetailsMethod = ProfilingDetailsMethod::Undefined;
     if (params.m_OutputDetailsOnlyToStdOut)
     {
@@ -46,7 +44,18 @@
                                          params.m_EnableProfiling,
                                          profilingDetailsMethod};
 
-    m_Runtime->LoadNetwork(m_NetworkId, std::move(optNet), errorMsg, networkProperties);
+    std::string errorMsg;
+    Status status = m_Runtime->LoadNetwork(m_NetworkId, std::move(optNet), errorMsg, networkProperties);
+    if (status != Status::Success)
+    {
+        std::string message("Failed to create Arm NN Executor: ");
+        message.append(errorMsg);
+        // Throwing an exception at this point in the constructor causes lots of problems. We'll instead mark this
+        // executor as not constructed.
+        ARMNN_LOG(fatal) << message;
+        m_constructionFailed = true;
+        return;
+    }
 
     if (m_Params.m_Iterations > 1)
     {
diff --git a/tests/ExecuteNetwork/ExecuteNetwork.cpp b/tests/ExecuteNetwork/ExecuteNetwork.cpp
index e9ebd0d..c6c8cc0 100644
--- a/tests/ExecuteNetwork/ExecuteNetwork.cpp
+++ b/tests/ExecuteNetwork/ExecuteNetwork.cpp
@@ -55,13 +55,22 @@
     }
 
     std::vector<const void*> outputResults;
-
-    auto executor = BuildExecutor(programOptions);
-    if (!executor)
+    std::unique_ptr<IExecutor> executor;
+    try
     {
+        executor = BuildExecutor(programOptions);
+        if (executor->m_constructionFailed)
+        {
+            return EXIT_FAILURE;
+        }
+    }
+    catch (const std::exception& e)
+    {
+        ARMNN_LOG(fatal) << e.what();
         return EXIT_FAILURE;
     }
 
+
     executor->PrintNetworkInfo();
     outputResults = executor->Execute();
 
diff --git a/tests/ExecuteNetwork/IExecutor.hpp b/tests/ExecuteNetwork/IExecutor.hpp
index 4ed6cbd..21ec904 100644
--- a/tests/ExecuteNetwork/IExecutor.hpp
+++ b/tests/ExecuteNetwork/IExecutor.hpp
@@ -19,4 +19,5 @@
     /// Compare the output with the result of another IExecutor
     virtual void CompareAndPrintResult(std::vector<const void*> otherOutput) = 0;
     virtual ~IExecutor(){};
+    bool m_constructionFailed = false;
 };