bluetooth autotests: Add functions to log to DUT and peers

TEST=Tested bluetooth_AdapterQuickSanity on RPI/Fizz
BUG=b:146671469

Cq-Depend: chromium:1983359
Change-Id: I9d5982a993674e093e2546f5667c2b7dfdc3cbbc
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/1983360
Commit-Queue: Shijin Abraham <shijinabraham@google.com>
Tested-by: Shijin Abraham <shijinabraham@google.com>
Reviewed-by: Shijin Abraham <shijinabraham@google.com>
Reviewed-by: Daniel Winkler <danielwinkler@google.com>
diff --git a/client/cros/bluetooth/bluetooth_device_xmlrpc_server.py b/client/cros/bluetooth/bluetooth_device_xmlrpc_server.py
index 90f0f8a..1f661ec 100755
--- a/client/cros/bluetooth/bluetooth_device_xmlrpc_server.py
+++ b/client/cros/bluetooth/bluetooth_device_xmlrpc_server.py
@@ -13,6 +13,7 @@
 import logging
 import logging.handlers
 import os
+import subprocess
 
 import common
 from autotest_lib.client.bin import utils
@@ -214,6 +215,14 @@
                                dbus_interface=self.BLUEZ_DEBUG_LOG_IFACE)
         return
 
+    def log_message(self, msg):
+        """ log a message to /var/log/messages."""
+        try:
+            cmd = ['logger', msg]
+            subprocess.call(cmd)
+        except Exception as e:
+            logging.error("log_message %s failed with %s", cmd, str(e))
+
 
     @xmlrpc_server.dbus_safe(False)
     def start_bluetoothd(self):
diff --git a/client/cros/chameleon/chameleon.py b/client/cros/chameleon/chameleon.py
index 7f9d9d1..37bd6a1 100644
--- a/client/cros/chameleon/chameleon.py
+++ b/client/cros/chameleon/chameleon.py
@@ -338,6 +338,9 @@
         """
         self.host.get_file(CHAMELEOND_LOG_REMOTE_PATH, self._output_log_file)
 
+    def log_message(self, msg):
+        """Log a message in chameleond log and system log."""
+        self._chameleond_proxy.log_message(msg)
 
     def get_all_ports(self):
         """Gets all the ports on Chameleon board which are connected.
diff --git a/server/cros/bluetooth/bluetooth_adapter_quick_tests.py b/server/cros/bluetooth/bluetooth_adapter_quick_tests.py
index fe34dc5..e980ba0 100644
--- a/server/cros/bluetooth/bluetooth_adapter_quick_tests.py
+++ b/server/cros/bluetooth/bluetooth_adapter_quick_tests.py
@@ -203,6 +203,7 @@
             time.sleep(self.TEST_SLEEP_SECS)
             self._print_delimiter()
             logging.info('Starting test: %s', test_name)
+            self.log_message('Starting test: %s'% test_name)
 
     def quick_test_test_end(self):
         """Log and track the test results"""
@@ -235,6 +236,7 @@
             self.pkg_fail_count += 1
 
         logging.info(result_msg)
+        self.log_message(result_msg)
         self._print_delimiter()
         self.bat_tests_results.append(result_msg)
         self.pkg_tests_results.append(result_msg)
diff --git a/server/cros/bluetooth/bluetooth_adapter_tests.py b/server/cros/bluetooth/bluetooth_adapter_tests.py
index ac9ee00..bb2d4c5 100644
--- a/server/cros/bluetooth/bluetooth_adapter_tests.py
+++ b/server/cros/bluetooth/bluetooth_adapter_tests.py
@@ -834,6 +834,11 @@
         self.bluetooth_facade.set_debug_log_levels(level, level, level, level)
 
 
+    def log_message(self, msg):
+        """ Write a string to log."""
+        self.bluetooth_facade.log_message(msg)
+
+
     @_test_retry_and_log
     def test_bluetoothd_running(self):
         """Test that bluetoothd is running."""
diff --git a/server/cros/bluetooth/bluetooth_device.py b/server/cros/bluetooth/bluetooth_device.py
index 94929af..c85f914 100644
--- a/server/cros/bluetooth/bluetooth_device.py
+++ b/server/cros/bluetooth/bluetooth_device.py
@@ -5,6 +5,7 @@
 import base64
 import json
 import logging
+from datetime import datetime
 
 from autotest_lib.client.bin import utils
 from autotest_lib.client.cros import constants
@@ -65,6 +66,30 @@
         return self._proxy.set_debug_log_levels(dispatcher_vb, newblue_vb,
                                                 bluez_vb, kernel_vb)
 
+    def log_message(self, msg, dut=True, peer=True):
+        """ Log a message in DUT log and peer logs with timestamp.
+
+        @param msg: message to be logged.
+        @param dut: log message on DUT
+        @param peer: log message on peer devices
+        """
+        try:
+            # TODO(b/146671469) Implement logging to tester
+
+            date =  datetime.strftime(datetime.now(),"%Y:%m:%d %H:%M:%S:%f")
+            msg = "bluetooth autotest --- %s : %s ---" % (date, msg)
+            logging.debug("Broadcasting '%s'")
+
+            if dut:
+                self._proxy.log_message(msg)
+
+            if peer:
+                for chameleon in self.host.chameleon_list:
+                    chameleon.log_message(msg)
+        except Exception as e:
+            logging.error("Exception '%s' in log_message '%s'", str(e), msg)
+
+
 
     def start_bluetoothd(self):
         """start bluetoothd.