Chris Craik | ad0b04f | 2015-07-21 13:44:22 -0700 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | # Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | import contextlib |
| 7 | import unittest |
| 8 | |
| 9 | import agents.atrace_agent as atrace_agent |
| 10 | import systrace |
| 11 | import util |
| 12 | |
| 13 | DEVICE_SERIAL = 'AG8404EC0444AGC' |
| 14 | LIST_TMP_ARGS = ['ls', '/data/local/tmp'] |
| 15 | ATRACE_ARGS = ['atrace', '-z', '-t', '10'] |
| 16 | CATEGORIES = ['sched', 'gfx', 'view', 'wm'] |
| 17 | ADB_SHELL = ['adb', '-s', DEVICE_SERIAL, 'shell'] |
| 18 | |
| 19 | SYSTRACE_CMD = ['./systrace.py', '--time', '10', '-o', 'out.html', '-e', |
| 20 | DEVICE_SERIAL] + CATEGORIES |
| 21 | TRACE_CMD = (ADB_SHELL + ATRACE_ARGS + CATEGORIES + |
| 22 | [';', 'ps', '-t']) |
| 23 | |
| 24 | SYSTRACE_LIST_CATEGORIES_CMD = ['./systrace.py', '-e', DEVICE_SERIAL, '-l'] |
| 25 | TRACE_LIST_CATEGORIES_CMD = (ADB_SHELL + ['atrace', '--list_categories']) |
| 26 | |
| 27 | LEGACY_ATRACE_ARGS = ['atrace', '-z', '-t', '10', '-s'] |
| 28 | LEGACY_TRACE_CMD = (ADB_SHELL + LEGACY_ATRACE_ARGS + |
| 29 | [';', 'ps', '-t']) |
| 30 | |
| 31 | TEST_DIR = 'test_data/' |
| 32 | ATRACE_DATA = TEST_DIR + 'atrace_data' |
| 33 | ATRACE_DATA_RAW = TEST_DIR + 'atrace_data_raw' |
| 34 | ATRACE_DATA_STRIPPED = TEST_DIR + 'atrace_data_stripped' |
| 35 | ATRACE_DATA_THREAD_FIXED = TEST_DIR + 'atrace_data_thread_fixed' |
| 36 | ATRACE_DATA_WITH_THREAD_LIST = TEST_DIR + 'atrace_data_with_thread_list' |
| 37 | ATRACE_THREAD_NAMES = TEST_DIR + 'atrace_thread_names' |
| 38 | |
| 39 | |
| 40 | class UtilUnitTest(unittest.TestCase): |
| 41 | def test_construct_adb_shell_command(self): |
| 42 | command = util.construct_adb_shell_command(LIST_TMP_ARGS, None) |
| 43 | self.assertEqual(' '.join(command), 'adb shell ls /data/local/tmp') |
| 44 | |
| 45 | command = util.construct_adb_shell_command(LIST_TMP_ARGS, DEVICE_SERIAL) |
| 46 | self.assertEqual(' '.join(command), |
| 47 | 'adb -s AG8404EC0444AGC shell ls /data/local/tmp') |
| 48 | |
| 49 | command = util.construct_adb_shell_command(ATRACE_ARGS, DEVICE_SERIAL) |
| 50 | self.assertEqual(' '.join(command), |
| 51 | 'adb -s AG8404EC0444AGC shell atrace -z -t 10') |
| 52 | |
| 53 | |
| 54 | class AtraceAgentUnitTest(unittest.TestCase): |
| 55 | def test_construct_trace_command(self): |
| 56 | options, categories = systrace.parse_options(SYSTRACE_CMD) |
| 57 | agent = atrace_agent.AtraceAgent(options, categories) |
| 58 | tracer_args = agent._construct_trace_command() |
| 59 | self.assertEqual(' '.join(TRACE_CMD), ' '.join(tracer_args)) |
| 60 | self.assertEqual(True, agent.expect_trace()) |
| 61 | |
| 62 | def test_extract_thread_list(self): |
| 63 | with contextlib.nested(open(ATRACE_DATA_WITH_THREAD_LIST, 'r'), |
| 64 | open(ATRACE_DATA_RAW, 'r'), |
| 65 | open(ATRACE_THREAD_NAMES, 'r')) as (f1, f2, f3): |
| 66 | atrace_data_with_thread_list = f1.read() |
| 67 | atrace_data_raw = f2.read() |
| 68 | atrace_thread_names = f3.read() |
| 69 | |
| 70 | trace_data, thread_names = atrace_agent.extract_thread_list( |
| 71 | atrace_data_with_thread_list) |
| 72 | self.assertEqual(atrace_data_raw, trace_data) |
| 73 | self.assertEqual(atrace_thread_names, str(thread_names)) |
| 74 | |
| 75 | def test_strip_and_decompress_trace(self): |
| 76 | with contextlib.nested(open(ATRACE_DATA_RAW, 'r'), |
| 77 | open(ATRACE_DATA_STRIPPED, 'r')) as (f1, f2): |
| 78 | atrace_data_raw = f1.read() |
| 79 | atrace_data_stripped = f2.read() |
| 80 | |
| 81 | trace_data = atrace_agent.strip_and_decompress_trace(atrace_data_raw) |
| 82 | self.assertEqual(atrace_data_stripped, trace_data) |
| 83 | |
| 84 | def test_fix_thread_names(self): |
| 85 | with contextlib.nested( |
| 86 | open(ATRACE_DATA_STRIPPED, 'r'), |
| 87 | open(ATRACE_THREAD_NAMES, 'r'), |
| 88 | open(ATRACE_DATA_THREAD_FIXED, 'r')) as (f1, f2, f3): |
| 89 | atrace_data_stripped = f1.read() |
| 90 | atrace_thread_names = f2.read() |
| 91 | atrace_data_thread_fixed = f3.read() |
| 92 | thread_names = eval(atrace_thread_names) |
| 93 | |
| 94 | trace_data = atrace_agent.fix_thread_names( |
| 95 | atrace_data_stripped, thread_names) |
| 96 | self.assertEqual(atrace_data_thread_fixed, trace_data) |
| 97 | |
| 98 | def test_preprocess_trace_data(self): |
| 99 | with contextlib.nested(open(ATRACE_DATA_WITH_THREAD_LIST, 'r'), |
| 100 | open(ATRACE_DATA, 'r')) as (f1, f2): |
| 101 | atrace_data_with_thread_list = f1.read() |
| 102 | atrace_data = f2.read() |
| 103 | |
| 104 | options, categories = systrace.parse_options([]) |
| 105 | agent = atrace_agent.AtraceAgent(options, categories) |
| 106 | trace_data = agent._preprocess_trace_data(atrace_data_with_thread_list) |
| 107 | self.assertEqual(atrace_data, trace_data) |
| 108 | |
| 109 | def test_list_categories(self): |
| 110 | options, categories = systrace.parse_options(SYSTRACE_LIST_CATEGORIES_CMD) |
| 111 | agent = atrace_agent.AtraceAgent(options, categories) |
| 112 | tracer_args = agent._construct_trace_command() |
| 113 | self.assertEqual(' '.join(TRACE_LIST_CATEGORIES_CMD), ' '.join(tracer_args)) |
| 114 | self.assertEqual(False, agent.expect_trace()) |
| 115 | |
| 116 | class AtraceLegacyAgentUnitTest(unittest.TestCase): |
| 117 | def test_construct_trace_command(self): |
| 118 | options, categories = systrace.parse_options(SYSTRACE_CMD) |
| 119 | agent = atrace_agent.AtraceLegacyAgent(options, categories) |
| 120 | tracer_args = agent._construct_trace_command() |
| 121 | self.assertEqual(' '.join(LEGACY_TRACE_CMD), ' '.join(tracer_args)) |
| 122 | self.assertEqual(True, agent.expect_trace()) |
| 123 | |
| 124 | if __name__ == '__main__': |
| 125 | unittest.main() |