| Index: build/android/devil/android/logcat_monitor_test.py
|
| diff --git a/build/android/devil/android/logcat_monitor_test.py b/build/android/devil/android/logcat_monitor_test.py
|
| index 61985607b399f45cea450c392f8b7596c167ab3f..00e1dd8e199b6aeafd9562032a004bceb4a7aa6e 100755
|
| --- a/build/android/devil/android/logcat_monitor_test.py
|
| +++ b/build/android/devil/android/logcat_monitor_test.py
|
| @@ -5,7 +5,9 @@
|
|
|
| # pylint: disable=protected-access
|
|
|
| +import contextlib
|
| import itertools
|
| +import threading
|
| import unittest
|
|
|
| from devil import devil_env
|
| @@ -16,30 +18,74 @@ with devil_env.SysPath(devil_env.config.LocalPath('pymock')):
|
| import mock # pylint: disable=import-error
|
|
|
|
|
| -def _CreateTestLog(raw_logcat=None):
|
| +def _CreateTestLog(raw_logcat):
|
| test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
|
| - test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat))
|
| + test_adb.Logcat = mock.Mock(return_value=raw_logcat)
|
| test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
|
| return test_log
|
|
|
| +@contextlib.contextmanager
|
| +def _RunWaitForAsync(monitor, success_regex, failure_regex, output):
|
| + """Helper to let you run WaitFor asyncronously.
|
| +
|
| + Args:
|
| + monitor: Logcat monitor to run |WaitFor|.
|
| + success_regex: success_regex to be passed forward to |WaitFor|.
|
| + failure_regex: failure_regex to be passed forward to |WaitFor|.
|
| + output: Return value of |WaitFor| will be stored in output[0].
|
| + """
|
| + def wait_for(success_regex, failure_regex, output):
|
| + output[0] = monitor.WaitFor(success_regex, failure_regex)
|
| + wait_for_thread = threading.Thread(
|
| + target=wait_for, args=[success_regex, failure_regex, output])
|
| + wait_for_thread.start()
|
| + yield
|
| + wait_for_thread.join()
|
| +
|
| +def _WaitForHelper(monitor, success_regex, failure_regex, output):
|
| + """Helper to let you run WaitFor.
|
| +
|
| + Args:
|
| + monitor: Logcat monitor to run |WaitFor|.
|
| + success_regex: success_regex to be passed forward to |WaitFor|.
|
| + failure_regex: failure_regex to be passed forward to |WaitFor|.
|
| + output: Return value of |WaitFor| will be stored in output[0].
|
| + """
|
| + output[0] = monitor.WaitFor(success_regex, failure_regex)
|
| +
|
|
|
| class LogcatMonitorTest(unittest.TestCase):
|
|
|
| _TEST_THREADTIME_LOGCAT_DATA = [
|
| - '01-01 01:02:03.456 7890 0987 V LogcatMonitorTest: '
|
| - 'verbose logcat monitor test message 1',
|
| - '01-01 01:02:03.457 8901 1098 D LogcatMonitorTest: '
|
| - 'debug logcat monitor test message 2',
|
| - '01-01 01:02:03.458 9012 2109 I LogcatMonitorTest: '
|
| - 'info logcat monitor test message 3',
|
| - '01-01 01:02:03.459 0123 3210 W LogcatMonitorTest: '
|
| - 'warning logcat monitor test message 4',
|
| - '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: '
|
| - 'error logcat monitor test message 5',
|
| - '01-01 01:02:03.461 2345 5432 F LogcatMonitorTest: '
|
| - 'fatal logcat monitor test message 6',
|
| - '01-01 01:02:03.462 3456 6543 D LogcatMonitorTest: '
|
| - 'ignore me',]
|
| + '01-01 00:00:00.000 7890 0987 V LogcatMonitorTest: '
|
| + 'verbose logcat monitor test message 1\n'
|
| + '02-01 00:00:00.000 8901 1098 D LogcatMonitorTest: '
|
| + 'debug logcat monitor test message 2\n'
|
| + '03-01 00:00:00.000 9012 2109 I LogcatMonitorTest: '
|
| + 'info logcat monitor test message 3\n'
|
| + '04-01 00:00:00.000 0123 3210 W LogcatMonitorTest: '
|
| + 'warning logcat monitor test message 4\n'
|
| + '05-01 00:00:00.000 1234 4321 E LogcatMonitorTest: '
|
| + 'error logcat monitor test message 5\n'
|
| + '06-01 00:00:00.000 3456 6543 D LogcatMonitorTest: '
|
| + 'ignore me\n']
|
| + _TEST_THREADTIME_WAITFOR_DATA = [
|
| + '01-01 00:00:00.000 7890 0987 V LogcatMonitorTest: '
|
| + 'fatal logcat monitor test message 1\n']
|
| +
|
| + def setUp(self):
|
| + self.called_wait_for = False
|
| +
|
| + def logcat_test_data(self):
|
| + """Helper function that yields sample logcat output for tests."""
|
| + for data in self._TEST_THREADTIME_LOGCAT_DATA:
|
| + yield data
|
| + while True:
|
| + if self.called_wait_for:
|
| + for data in self._TEST_THREADTIME_WAITFOR_DATA:
|
| + yield data
|
| + else:
|
| + yield ''
|
|
|
| def assertIterEqual(self, expected_iter, actual_iter):
|
| for expected, actual in itertools.izip_longest(expected_iter, actual_iter):
|
| @@ -60,27 +106,55 @@ class LogcatMonitorTest(unittest.TestCase):
|
| with self.assertRaises(StopIteration):
|
| next(expected_iter)
|
|
|
| + @mock.patch('time.sleep', mock.Mock())
|
| def testWaitFor_success(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| - actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| +
|
| + wait_for_output = [None]
|
| + wait_for_thread = threading.Thread(
|
| + target=_WaitForHelper,
|
| + args=[test_log, r'.*(fatal|error) logcat monitor.*',
|
| + None, wait_for_output])
|
| + wait_for_thread.start()
|
| + # Setting this causes the output returned by |logcat_test_data| to change.
|
| + self.called_wait_for = True
|
| + wait_for_thread.join()
|
| +
|
| + actual_match = wait_for_output[0]
|
| + test_log.Stop()
|
| self.assertTrue(actual_match)
|
| self.assertEqual(
|
| - '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: '
|
| - 'error logcat monitor test message 5',
|
| + '01-01 00:00:00.000 7890 0987 V LogcatMonitorTest: '
|
| + 'fatal logcat monitor test message 1',
|
| actual_match.group(0))
|
| - self.assertEqual('error', actual_match.group(1))
|
| + self.assertEqual('fatal', actual_match.group(1))
|
|
|
| + @mock.patch('time.sleep', mock.Mock())
|
| def testWaitFor_failure(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| - actual_match = test_log.WaitFor(
|
| - r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*')
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| +
|
| + wait_for_output = [None]
|
| + wait_for_thread = threading.Thread(
|
| + target=_WaitForHelper,
|
| + args=[test_log, r'.*My Success Regex.*',
|
| + r'.*(fatal|error) logcat monitor.*', wait_for_output])
|
| + wait_for_thread.start()
|
| + # Setting this causes the output returned by |logcat_test_data| to change.
|
| + self.called_wait_for = True
|
| + wait_for_thread.join()
|
| +
|
| + actual_match = wait_for_output[0]
|
| + test_log.Stop()
|
| self.assertIsNone(actual_match)
|
|
|
| def testFindAll_defaults(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| expected_results = [
|
| ('7890', '0987', 'V', 'LogcatMonitorTest',
|
| 'verbose logcat monitor test message 1'),
|
| @@ -91,42 +165,48 @@ class LogcatMonitorTest(unittest.TestCase):
|
| ('0123', '3210', 'W', 'LogcatMonitorTest',
|
| 'warning logcat monitor test message 4'),
|
| ('1234', '4321', 'E', 'LogcatMonitorTest',
|
| - 'error logcat monitor test message 5'),
|
| - ('2345', '5432', 'F', 'LogcatMonitorTest',
|
| - 'fatal logcat monitor test message 6')]
|
| + 'error logcat monitor test message 5')]
|
| actual_results = test_log.FindAll(r'\S* logcat monitor test message \d')
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
| def testFindAll_defaults_miss(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| expected_results = []
|
| actual_results = test_log.FindAll(r'\S* nothing should match this \d')
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
| def testFindAll_filterProcId(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| actual_results = test_log.FindAll(
|
| r'\S* logcat monitor test message \d', proc_id=1234)
|
| expected_results = [
|
| ('1234', '4321', 'E', 'LogcatMonitorTest',
|
| 'error logcat monitor test message 5')]
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
| def testFindAll_filterThreadId(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| actual_results = test_log.FindAll(
|
| r'\S* logcat monitor test message \d', thread_id=2109)
|
| expected_results = [
|
| ('9012', '2109', 'I', 'LogcatMonitorTest',
|
| 'info logcat monitor test message 3')]
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
| def testFindAll_filterLogLevel(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| actual_results = test_log.FindAll(
|
| r'\S* logcat monitor test message \d', log_level=r'[DW]')
|
| expected_results = [
|
| @@ -135,10 +215,12 @@ class LogcatMonitorTest(unittest.TestCase):
|
| ('0123', '3210', 'W', 'LogcatMonitorTest',
|
| 'warning logcat monitor test message 4'),]
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
| def testFindAll_filterComponent(self):
|
| test_log = _CreateTestLog(
|
| - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
|
| + raw_logcat=self.logcat_test_data())
|
| + test_log.Start()
|
| actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest')
|
| expected_results = [
|
| ('7890', '0987', 'V', 'LogcatMonitorTest',
|
| @@ -151,11 +233,10 @@ class LogcatMonitorTest(unittest.TestCase):
|
| 'warning logcat monitor test message 4'),
|
| ('1234', '4321', 'E', 'LogcatMonitorTest',
|
| 'error logcat monitor test message 5'),
|
| - ('2345', '5432', 'F', 'LogcatMonitorTest',
|
| - 'fatal logcat monitor test message 6'),
|
| ('3456', '6543', 'D', 'LogcatMonitorTest',
|
| 'ignore me'),]
|
| self.assertIterEqual(iter(expected_results), actual_results)
|
| + test_log.Stop()
|
|
|
|
|
| if __name__ == '__main__':
|
|
|