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.name, c.id, c.ts, 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 "name","id","ts","value" 68 "ScreenState",0,1000,2.000000 69 "ScreenState",1,2000,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.name, s.id, s.ts, s.dur, s.name 110 FROM track t JOIN slice s ON s.track_id = t.id 111 WHERE t.name = 'DeviceStateChanged'; 112 """, 113 out=Csv(""" 114 "name","id","ts","dur","name" 115 "DeviceStateChanged",0,1000,0,"some_state_from_sysprops" 116 "DeviceStateChanged",1,3000,0,"some_state_from_atrace" 117 """)) 118 119 def test_binder_txn_sync_good(self): 120 return DiffTestBlueprint( 121 trace=Systrace( 122 """ client-521390 [005] ..... 137012.464739: binder_command: cmd=0x40406300 BC_TRANSACTION 123 client-521390 [005] ..... 137012.464741: binder_transaction: transaction=5149 dest_node=5143 dest_proc=521383 dest_thread=0 reply=0 flags=0x0 code=0x3 124 server-521383 [004] ..... 137012.464771: binder_transaction_received: transaction=5149 125 server-521383 [004] ..... 137012.464772: binder_return: cmd=0x80407202 BR_TRANSACTION 126 server-521383 [004] ..... 137012.464815: binder_command: cmd=0x40086303 BC_FREE_BUFFER 127 server-521383 [004] ..... 137012.464823: binder_command: cmd=0x40406301 BC_REPLY 128 server-521383 [004] ..... 137012.464826: binder_transaction: transaction=5150 dest_node=0 dest_proc=521390 dest_thread=521390 reply=1 flags=0x20 code=0x3 129 server-521383 [004] ..... 137012.464837: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 130 client-521390 [005] ..... 137012.464847: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 131 client-521390 [005] ..... 137012.464848: binder_transaction_received: transaction=5150 132 client-521390 [005] ..... 137012.464849: binder_return: cmd=0x80407203 BR_REPLY 133 """), 134 query=""" 135 SELECT 136 dur 137 FROM slice 138 ORDER BY dur; 139 """, 140 out=Csv(""" 141 "dur" 142 55000 143 107000 144 """)) 145 146 def test_binder_txn_sync_bad_request(self): 147 return DiffTestBlueprint( 148 trace=Systrace( 149 """ client-521349 [005] ..... 137004.281009: binder_command: cmd=0x40406300 BC_TRANSACTION 150 client-521349 [005] ..... 137004.281010: binder_transaction: transaction=5135 dest_node=5129 dest_proc=521347 dest_thread=0 reply=0 flags=0x0 code=0x3 151 client-521349 [005] ..... 137004.281410: binder_return: cmd=0x7211 BR_FAILED_REPLY 152 """), 153 query=""" 154 SELECT 155 dur 156 FROM slice 157 ORDER BY dur; 158 """, 159 out=Csv(""" 160 "dur" 161 400000 162 """)) 163 164 def test_binder_txn_sync_bad_reply(self): 165 return DiffTestBlueprint( 166 trace=Systrace( 167 """ client-521332 [007] ..... 136996.112660: binder_command: cmd=0x40406300 BC_TRANSACTION 168 client-521332 [007] ..... 136996.112662: binder_transaction: transaction=5120 dest_node=5114 dest_proc=521330 dest_thread=0 reply=0 flags=0x0 code=0x3 169 server-521330 [000] ..... 136996.112714: binder_transaction_received: transaction=5120 170 server-521330 [000] ..... 136996.112715: binder_return: cmd=0x80407202 BR_TRANSACTION 171 server-521330 [000] ..... 136996.112752: binder_command: cmd=0x40086303 BC_FREE_BUFFER 172 server-521330 [000] ..... 136996.112758: binder_command: cmd=0x40406301 BC_REPLY 173 server-521330 [000] ..... 136996.112760: binder_transaction: transaction=5121 dest_node=0 dest_proc=521332 dest_thread=521332 reply=1 flags=0x20 code=0x3 174 server-521330 [000] ..... 136996.113163: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 175 client-521332 [007] ..... 136996.113201: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 176 client-521332 [007] ..... 136996.113201: binder_return: cmd=0x7211 BR_FAILED_REPLY 177 """), 178 query=""" 179 SELECT 180 dur 181 FROM slice 182 ORDER BY dur; 183 """, 184 out=Csv(""" 185 "dur" 186 46000 187 539000 188 """)) 189 190 def test_binder_txn_oneway_good(self): 191 return DiffTestBlueprint( 192 trace=Systrace( 193 """ client-521406 [003] ..... 137020.679833: binder_command: cmd=0x40406300 BC_TRANSACTION 194 client-521406 [003] ..... 137020.679834: binder_transaction: transaction=5161 dest_node=5155 dest_proc=521404 dest_thread=0 reply=0 flags=0x1 code=0x3 195 client-521406 [003] ..... 137020.679843: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE 196 server-521404 [006] ..... 137020.679890: binder_transaction_received: transaction=5161 197 server-521404 [006] ..... 137020.679890: binder_return: cmd=0x80407202 BR_TRANSACTION 198 """), 199 query=""" 200 SELECT 201 dur 202 FROM slice 203 ORDER BY dur; 204 """, 205 out=Csv(""" 206 "dur" 207 0 208 0 209 """)) 210 211 # Tests when counter_tack.machine_id is not null. 212 def test_android_system_property_counter_machine_id(self): 213 return DiffTestBlueprint( 214 trace=TextProto(r""" 215 packet { 216 timestamp: 1000 217 android_system_property { 218 values { 219 name: "debug.tracing.screen_state" 220 value: "2" 221 } 222 values { 223 name: "debug.tracing.device_state" 224 value: "some_state_from_sysprops" 225 } 226 } 227 machine_id: 1001 228 } 229 packet { 230 ftrace_events { 231 cpu: 1 232 event { 233 timestamp: 2000 234 pid: 1 235 print { 236 buf: "C|1000|ScreenState|1\n" 237 } 238 } 239 event { 240 timestamp: 3000 241 pid: 1 242 print { 243 buf: "N|1000|DeviceStateChanged|some_state_from_atrace\n" 244 } 245 } 246 } 247 machine_id: 1001 248 } 249 """), 250 query=""" 251 SELECT t.name, c.id, c.ts, c.value 252 FROM counter_track t JOIN counter c ON t.id = c.track_id 253 WHERE name = 'ScreenState' 254 AND t.machine_id IS NOT NULL; 255 """, 256 out=Csv(""" 257 "name","id","ts","value" 258 "ScreenState",0,1000,2.000000 259 "ScreenState",1,2000,1.000000 260 """)) 261