1#!/usr/bin/env python3 2# Copyright (C) 2023 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License a 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16from python.generators.diff_tests.testing import Path, DataPath, Metric, Systrace 17from python.generators.diff_tests.testing import Csv, Json, TextProto, BinaryProto 18from python.generators.diff_tests.testing import DiffTestBlueprint, TraceInjector 19from python.generators.diff_tests.testing import TestSuite 20from python.generators.diff_tests.testing import PrintProfileProto 21 22 23class AndroidParser(TestSuite): 24 25 def test_android_system_property_counter(self): 26 return DiffTestBlueprint( 27 trace=TextProto(r""" 28 packet { 29 timestamp: 1000 30 android_system_property { 31 values { 32 name: "debug.tracing.screen_state" 33 value: "2" 34 } 35 values { 36 name: "debug.tracing.device_state" 37 value: "some_state_from_sysprops" 38 } 39 } 40 } 41 packet { 42 ftrace_events { 43 cpu: 1 44 event { 45 timestamp: 2000 46 pid: 1 47 print { 48 buf: "C|1000|ScreenState|1\n" 49 } 50 } 51 event { 52 timestamp: 3000 53 pid: 1 54 print { 55 buf: "N|1000|DeviceStateChanged|some_state_from_atrace\n" 56 } 57 } 58 } 59 } 60 """), 61 query=""" 62 SELECT t.type, t.name, c.id, c.ts, c.type, c.value 63 FROM counter_track t JOIN counter c ON t.id = c.track_id 64 WHERE name = 'ScreenState'; 65 """, 66 out=Csv(""" 67 "type","name","id","ts","type","value" 68 "counter_track","ScreenState",0,1000,"counter",2.000000 69 "counter_track","ScreenState",1,2000,"counter",1.000000 70 """)) 71 72 def test_android_system_property_slice(self): 73 return DiffTestBlueprint( 74 trace=TextProto(r""" 75 packet { 76 timestamp: 1000 77 android_system_property { 78 values { 79 name: "debug.tracing.screen_state" 80 value: "2" 81 } 82 values { 83 name: "debug.tracing.device_state" 84 value: "some_state_from_sysprops" 85 } 86 } 87 } 88 packet { 89 ftrace_events { 90 cpu: 1 91 event { 92 timestamp: 2000 93 pid: 1 94 print { 95 buf: "C|1000|ScreenState|1\n" 96 } 97 } 98 event { 99 timestamp: 3000 100 pid: 1 101 print { 102 buf: "N|1000|DeviceStateChanged|some_state_from_atrace\n" 103 } 104 } 105 } 106 } 107 """), 108 query=""" 109 SELECT t.type, t.name, s.id, s.ts, s.dur, s.type, s.name 110 FROM track t JOIN slice s ON s.track_id = t.id 111 WHERE t.name = 'DeviceStateChanged'; 112 """, 113 out=Path('android_system_property_slice.out')) 114 115 def test_binder_txn_sync_good(self): 116 return DiffTestBlueprint( 117 trace=Systrace( 118 """ client-521390 [005] ..... 137012.464739: binder_command: cmd=0x40406300 BC_TRANSACTION 119 client-521390 [005] ..... 137012.464741: binder_transaction: transaction=5149 dest_node=5143 dest_proc=521383 dest_thread=0 reply=0 flags=0x0 code=0x3 120 server-521383 [004] ..... 137012.464771: binder_transaction_received: transaction=5149 121 server-521383 [004] ..... 137012.464772: binder_return: cmd=0x80407202 BR_TRANSACTION 122 server-521383 [004] ..... 137012.464815: binder_command: cmd=0x40086303 BC_FREE_BUFFER 123 server-521383 [004] ..... 137012.464823: binder_command: cmd=0x40406301 BC_REPLY 124 server-521383 [004] ..... 137012.464826: binder_transaction: transaction=5150 dest_node=0 dest_proc=521390 dest_thread=521390 reply=1 flags=0x20 code=0x3 125 server-521383 [004] ..... 137012.464837: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 126 client-521390 [005] ..... 137012.464847: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 127 client-521390 [005] ..... 137012.464848: binder_transaction_received: transaction=5150 128 client-521390 [005] ..... 137012.464849: binder_return: cmd=0x80407203 BR_REPLY 129 """), 130 query=""" 131 SELECT 132 dur 133 FROM slice 134 ORDER BY dur; 135 """, 136 out=Csv(""" 137 "dur" 138 55000 139 107000 140 """)) 141 142 def test_binder_txn_sync_bad_request(self): 143 return DiffTestBlueprint( 144 trace=Systrace( 145 """ client-521349 [005] ..... 137004.281009: binder_command: cmd=0x40406300 BC_TRANSACTION 146 client-521349 [005] ..... 137004.281010: binder_transaction: transaction=5135 dest_node=5129 dest_proc=521347 dest_thread=0 reply=0 flags=0x0 code=0x3 147 client-521349 [005] ..... 137004.281410: binder_return: cmd=0x7211 BR_FAILED_REPLY 148 """), 149 query=""" 150 SELECT 151 dur 152 FROM slice 153 ORDER BY dur; 154 """, 155 out=Csv(""" 156 "dur" 157 400000 158 """)) 159 160 def test_binder_txn_sync_bad_reply(self): 161 return DiffTestBlueprint( 162 trace=Systrace( 163 """ client-521332 [007] ..... 136996.112660: binder_command: cmd=0x40406300 BC_TRANSACTION 164 client-521332 [007] ..... 136996.112662: binder_transaction: transaction=5120 dest_node=5114 dest_proc=521330 dest_thread=0 reply=0 flags=0x0 code=0x3 165 server-521330 [000] ..... 136996.112714: binder_transaction_received: transaction=5120 166 server-521330 [000] ..... 136996.112715: binder_return: cmd=0x80407202 BR_TRANSACTION 167 server-521330 [000] ..... 136996.112752: binder_command: cmd=0x40086303 BC_FREE_BUFFER 168 server-521330 [000] ..... 136996.112758: binder_command: cmd=0x40406301 BC_REPLY 169 server-521330 [000] ..... 136996.112760: binder_transaction: transaction=5121 dest_node=0 dest_proc=521332 dest_thread=521332 reply=1 flags=0x20 code=0x3 170 server-521330 [000] ..... 136996.113163: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 171 client-521332 [007] ..... 136996.113201: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 172 client-521332 [007] ..... 136996.113201: binder_return: cmd=0x7211 BR_FAILED_REPLY 173 """), 174 query=""" 175 SELECT 176 dur 177 FROM slice 178 ORDER BY dur; 179 """, 180 out=Csv(""" 181 "dur" 182 46000 183 539000 184 """)) 185 186 def test_binder_txn_oneway_good(self): 187 return DiffTestBlueprint( 188 trace=Systrace( 189 """ client-521406 [003] ..... 137020.679833: binder_command: cmd=0x40406300 BC_TRANSACTION 190 client-521406 [003] ..... 137020.679834: binder_transaction: transaction=5161 dest_node=5155 dest_proc=521404 dest_thread=0 reply=0 flags=0x1 code=0x3 191 client-521406 [003] ..... 137020.679843: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 192 server-521404 [006] ..... 137020.679890: binder_transaction_received: transaction=5161 193 server-521404 [006] ..... 137020.679890: binder_return: cmd=0x80407202 BR_TRANSACTION 194 """), 195 query=""" 196 SELECT 197 dur 198 FROM slice 199 ORDER BY dur; 200 """, 201 out=Csv(""" 202 "dur" 203 0 204 0 205 """)) 206 207 # Tests when counter_tack.machine_id is not null. 208 def test_android_system_property_counter_machine_id(self): 209 return DiffTestBlueprint( 210 trace=TextProto(r""" 211 packet { 212 timestamp: 1000 213 android_system_property { 214 values { 215 name: "debug.tracing.screen_state" 216 value: "2" 217 } 218 values { 219 name: "debug.tracing.device_state" 220 value: "some_state_from_sysprops" 221 } 222 } 223 machine_id: 1001 224 } 225 packet { 226 ftrace_events { 227 cpu: 1 228 event { 229 timestamp: 2000 230 pid: 1 231 print { 232 buf: "C|1000|ScreenState|1\n" 233 } 234 } 235 event { 236 timestamp: 3000 237 pid: 1 238 print { 239 buf: "N|1000|DeviceStateChanged|some_state_from_atrace\n" 240 } 241 } 242 } 243 machine_id: 1001 244 } 245 """), 246 query=""" 247 SELECT t.type, t.name, c.id, c.ts, c.type, c.value 248 FROM counter_track t JOIN counter c ON t.id = c.track_id 249 WHERE name = 'ScreenState' 250 AND t.machine_id IS NOT NULL; 251 """, 252 out=Csv(""" 253 "type","name","id","ts","type","value" 254 "counter_track","ScreenState",0,1000,"counter",2.000000 255 "counter_track","ScreenState",1,2000,"counter",1.000000 256 """)) 257