Add logging RPC caller

To help debug PSA API tests, a simple logging RPC caller has been
added that can be stacked on top of another rpc_caller to log
call requests and responses.  The logging_caller has been
integrated into the psa-api-test deployment.  Logging may
be enabled using '-l' command line switch.

Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: Ib71d9fb2d6efbd2b5f513dd62b47109aab7ef55d
diff --git a/deployments/psa-api-test/arch_test_runner.c b/deployments/psa-api-test/arch_test_runner.c
index 90ca304..43ca703 100644
--- a/deployments/psa-api-test/arch_test_runner.c
+++ b/deployments/psa-api-test/arch_test_runner.c
@@ -5,20 +5,43 @@
  */
 
 #include <stdint.h>
+#include <stdbool.h>
 #include <stdio.h>
+#include <string.h>
 #include <service_locator.h>
+#include <rpc/common/logging/logging_caller.h>
 #include "service_under_test.h"
 
 int32_t val_entry(void);
 
+static bool option_selected(const char *option_switch, int argc, char *argv[])
+{
+    bool selected = false;
+
+    for (int i = 1; (i < argc) && !selected; ++i) {
+
+        selected = (strcmp(argv[i], option_switch) == 0);
+    }
+
+    return selected;
+}
+
 int main(int argc, char *argv[])
 {
     int rval = -1;
+    struct logging_caller *selected_call_logger = NULL;
+    struct logging_caller call_logger;
 
+    logging_caller_init(&call_logger, stdout);
     service_locator_init();
 
-    rval = locate_service_under_test();
+    /* Check command line options */
+    if (option_selected("-l", argc, argv)) selected_call_logger = &call_logger;
 
+    /* Locate service under test */
+    rval = locate_service_under_test(selected_call_logger);
+
+    /* Run tests */
     if (!rval) {
 
         rval = val_entry();
@@ -30,5 +53,7 @@
         printf("Failed to locate service under test.  Error code: %d\n", rval);
     }
 
+    logging_caller_deinit(&call_logger);
+
     return rval;
 }
diff --git a/deployments/psa-api-test/crypto/crypto_locator.c b/deployments/psa-api-test/crypto/crypto_locator.c
index 8571b23..609c525 100644
--- a/deployments/psa-api-test/crypto/crypto_locator.c
+++ b/deployments/psa-api-test/crypto/crypto_locator.c
@@ -14,8 +14,7 @@
 static rpc_session_handle session_handle = NULL;
 static struct service_context *crypto_service_context = NULL;
 
-
-int locate_service_under_test(void)
+int locate_service_under_test(struct logging_caller *call_logger)
 {
 	int status = -1;
 
@@ -33,7 +32,15 @@
 
 			if (session_handle) {
 
-				psa_crypto_client_init(caller);
+				if (call_logger) {
+
+					psa_crypto_client_init(logging_caller_attach(call_logger, caller));
+				}
+				else {
+
+					psa_crypto_client_init(caller);
+				}
+
 				status = 0;
 			}
 			else {
diff --git a/deployments/psa-api-test/psa-api-test.cmake b/deployments/psa-api-test/psa-api-test.cmake
index 357abd1..a1262c2 100644
--- a/deployments/psa-api-test/psa-api-test.cmake
+++ b/deployments/psa-api-test/psa-api-test.cmake
@@ -28,6 +28,8 @@
 	COMPONENTS
 		"components/common/tlv"
 		"components/service/common/include"
+		"components/rpc/common/caller"
+		"components/rpc/common/logging"
 )
 
 target_sources(psa-api-test PRIVATE
diff --git a/deployments/psa-api-test/service_under_test.h b/deployments/psa-api-test/service_under_test.h
index 85dc81f..29f99f7 100644
--- a/deployments/psa-api-test/service_under_test.h
+++ b/deployments/psa-api-test/service_under_test.h
@@ -7,6 +7,8 @@
 #ifndef SERVICE_UNDER_TEST_H
 #define SERVICE_UNDER_TEST_H
 
+#include <rpc/common/logging/logging_caller.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -17,7 +19,7 @@
  * associate an RPC Caller with the singleton PSA API client used by
  * the API tests.
  */
-int locate_service_under_test(void);
+int locate_service_under_test(struct logging_caller *call_logger);
 
 /**
  * Reliquish the RPC session when the test run is complete.