diff --git a/Jenkinsfile b/Jenkinsfile index 67dd7cbcf3..e005a20499 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,6 +153,7 @@ pipeline { ["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"], ["test encoder", "python selfdrive/loggerd/tests/test_encoder.py"], ["test camerad", "python selfdrive/camerad/test/test_camerad.py"], + ["test logcatd", "python selfdrive/logcatd/tests/test_logcatd_android.py"], //["test updater", "python installer/updater/test_updater.py"], ]) } diff --git a/selfdrive/logcatd/logcatd_android.cc b/selfdrive/logcatd/logcatd_android.cc index 4387211864..fabd299e13 100644 --- a/selfdrive/logcatd/logcatd_android.cc +++ b/selfdrive/logcatd/logcatd_android.cc @@ -18,7 +18,7 @@ int main() { ExitHandler do_exit; // setup android logging - struct logger_list *logger_list = android_logger_list_alloc(ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 0, 0); + struct logger_list *logger_list = android_logger_list_alloc(ANDROID_LOG_RDONLY, 0, 0); assert(logger_list); struct logger *main_logger = android_logger_open(logger_list, LOG_ID_MAIN); assert(main_logger); diff --git a/selfdrive/logcatd/tests/test_logcatd_android.py b/selfdrive/logcatd/tests/test_logcatd_android.py new file mode 100755 index 0000000000..552cea5384 --- /dev/null +++ b/selfdrive/logcatd/tests/test_logcatd_android.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import os +import random +import string +import time +import unittest + +import cereal.messaging as messaging +from selfdrive.test.helpers import with_processes + +class TestLogcatdAndroid(unittest.TestCase): + + @with_processes(['logcatd']) + def test_log(self): + sock = messaging.sub_sock("androidLog", conflate=False) + + # make sure sockets are ready + time.sleep(1) + messaging.drain_sock(sock) + + # write some log messages + sent_msgs = {} + for _ in range(random.randint(5, 50)): + msg = ''.join([random.choice(string.ascii_letters) for _ in range(random.randrange(2, 200))]) + sent_msgs[msg] = ''.join([random.choice(string.ascii_letters) for _ in range(random.randrange(2, 20))]) + os.system(f"log -t {sent_msgs[msg]} {msg}") + + time.sleep(1) + msgs = messaging.drain_sock(sock) + for m in msgs: + self.assertTrue(m.valid) + self.assertLess(time.monotonic() - (m.logMonoTime / 1e9), 30) + + recv_msg = m.androidLog.message.strip() + if recv_msg not in sent_msgs: + continue + + self.assertEqual(m.androidLog.tag, sent_msgs[recv_msg]) + del sent_msgs[recv_msg] + + # ensure we received all the logs we sent + self.assertEqual(len(sent_msgs), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/selfdrive/test/test_manager.py b/selfdrive/test/test_manager.py index 6069736215..9a666e9673 100644 --- a/selfdrive/test/test_manager.py +++ b/selfdrive/test/test_manager.py @@ -38,12 +38,12 @@ class TestManager(unittest.TestCase): manager.manager_prepare() for p in ALL_PROCESSES: manager.start_managed_process(p) - + time.sleep(10) for p in reversed(ALL_PROCESSES): exit_code = manager.kill_managed_process(p, retry=False) - if not EON and (p == 'ui'or p == 'loggerd'): + if (not EON and p == 'ui') or (EON and p == 'logcatd'): # TODO: make Qt UI exit gracefully and fix OMX encoder exiting continue