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 17from python.generators.diff_tests.testing import Csv, Json, TextProto, BinaryProto 18from python.generators.diff_tests.testing import DiffTestBlueprint 19from python.generators.diff_tests.testing import TestSuite 20from google.protobuf import text_format 21 22 23class Slices(TestSuite): 24 25 def test_thread_slice(self): 26 return DiffTestBlueprint( 27 trace=Path('trace.py'), 28 query=""" 29 INCLUDE PERFETTO MODULE slices.with_context; 30 31 SELECT name, ts, dur, depth, thread_name, tid, process_name, pid 32 FROM thread_slice; 33 """, 34 out=Csv(""" 35 "name","ts","dur","depth","thread_name","tid","process_name","pid" 36 "ThreadSlice",5,8,0,"Thread",5,"Process",3 37 "NestedThreadSlice",6,1,1,"Thread",5,"Process",3 38 """)) 39 40 def test_process_slice(self): 41 return DiffTestBlueprint( 42 trace=Path('trace.py'), 43 query=""" 44 INCLUDE PERFETTO MODULE slices.with_context; 45 46 SELECT name, ts, dur, depth, process_name, pid 47 FROM process_slice; 48 """, 49 out=Csv(""" 50 "name","ts","dur","depth","process_name","pid" 51 "ProcessSlice",3,4,0,"Process",3 52 """)) 53 54 def test_thread_or_process_slice(self): 55 return DiffTestBlueprint( 56 trace=Path('trace.py'), 57 query=""" 58 INCLUDE PERFETTO MODULE slices.with_context; 59 60 SELECT name, ts, dur, depth, thread_name, tid, process_name, pid 61 FROM thread_or_process_slice 62 ORDER BY ts; 63 """, 64 out=Csv(""" 65 "name","ts","dur","depth","thread_name","tid","process_name","pid" 66 "ProcessSlice",3,4,0,"[NULL]","[NULL]","Process",3 67 "ThreadSlice",5,8,0,"Thread",5,"Process",3 68 "NestedThreadSlice",6,1,1,"Thread",5,"Process",3 69 """)) 70 71 # Ancestor / descendant wrappers. 72 73 def test_slice_ancestor_and_self(self): 74 return DiffTestBlueprint( 75 trace=Path('trace.py'), 76 query=""" 77 INCLUDE PERFETTO MODULE slices.hierarchy; 78 79 SELECT name, ts, dur, depth 80 FROM _slice_ancestor_and_self( 81 (SELECT id FROM slice WHERE name = 'NestedThreadSlice') 82 ); 83 """, 84 out=Csv(""" 85 "name","ts","dur","depth" 86 "NestedThreadSlice",6,1,1 87 "ThreadSlice",5,8,0 88 """)) 89 90 def test_slice_descendant_and_self(self): 91 return DiffTestBlueprint( 92 trace=Path('trace.py'), 93 query=""" 94 INCLUDE PERFETTO MODULE slices.hierarchy; 95 96 SELECT name, ts, dur, depth 97 FROM _slice_descendant_and_self( 98 (SELECT id FROM slice WHERE name = 'ThreadSlice') 99 ); 100 """, 101 out=Csv(""" 102 "name","ts","dur","depth" 103 "ThreadSlice",5,8,0 104 "NestedThreadSlice",6,1,1 105 """)) 106 107 def test_slice_remove_nulls_and_reparent(self): 108 return DiffTestBlueprint( 109 trace=Path('trace.py'), 110 query=""" 111 INCLUDE PERFETTO MODULE slices.hierarchy; 112 113 SELECT id, parent_id, name, depth 114 FROM _slice_remove_nulls_and_reparent!( 115 (SELECT id, parent_id, depth, IIF(name = 'ProcessSlice', NULL, name) AS name 116 FROM slice), 117 name 118 ) LIMIT 10; 119 """, 120 out=Csv(""" 121 "id","parent_id","name","depth" 122 0,"[NULL]","AsyncSlice",0 123 2,"[NULL]","ThreadSlice",0 124 3,2,"NestedThreadSlice",0 125 """)) 126 127 # Common functions 128 129 def test_slice_flattened(self): 130 return DiffTestBlueprint( 131 trace=DataPath('chrome_input_with_frame_view.pftrace'), 132 query=""" 133 INCLUDE PERFETTO MODULE slices.flat_slices; 134 135 SELECT e.name, e.ts, e.dur, e.depth 136 FROM _slice_flattened e 137 JOIN thread_track ON e.track_id = thread_track.id 138 JOIN thread USING(utid) 139 WHERE thread.tid = 30196 140 ORDER BY ts 141 LIMIT 10; 142 """, 143 out=Csv(""" 144 "name","ts","dur","depth" 145 "EventForwarder::OnTouchEvent",1035865509936036,211000,0 146 "GestureProvider::OnTouchEvent",1035865510147036,87000,1 147 "EventForwarder::OnTouchEvent",1035865510234036,48000,0 148 "RenderWidgetHostImpl::ForwardTouchEvent",1035865510282036,41000,1 149 "LatencyInfo.Flow",1035865510323036,8000,2 150 "RenderWidgetHostImpl::ForwardTouchEvent",1035865510331036,16000,1 151 "PassthroughTouchEventQueue::QueueEvent",1035865510347036,30000,2 152 "InputRouterImpl::FilterAndSendWebInputEvent",1035865510377036,8000,3 153 "LatencyInfo.Flow",1035865510385036,126000,4 154 "RenderWidgetHostImpl::UserInputStarted",1035865510511036,7000,5 155 """)) 156 157 def test_thread_slice_cpu_time(self): 158 return DiffTestBlueprint( 159 trace=DataPath('example_android_trace_30s.pb'), 160 query=""" 161 INCLUDE PERFETTO MODULE slices.cpu_time; 162 163 SELECT id, cpu_time 164 FROM thread_slice_cpu_time 165 LIMIT 10; 166 """, 167 out=Csv(""" 168 "id","cpu_time" 169 0,178646 170 1,119740 171 2,58073 172 3,98698 173 4,121979 174 5,45000 175 6,35104 176 7,33333 177 8,46926 178 9,17865 179 """)) 180 181 def test_thread_slice_time_in_state(self): 182 return DiffTestBlueprint( 183 trace=DataPath('example_android_trace_30s.pb'), 184 query=""" 185 INCLUDE PERFETTO MODULE slices.time_in_state; 186 187 SELECT id, name, state, io_wait, blocked_function, dur 188 FROM thread_slice_time_in_state 189 LIMIT 10; 190 """, 191 out=Csv(""" 192 "id","name","state","io_wait","blocked_function","dur" 193 0,"Deoptimization JIT inline cache","Running","[NULL]","[NULL]",178646 194 1,"Deoptimization JIT inline cache","Running","[NULL]","[NULL]",119740 195 2,"Lock contention on thread list lock (owner tid: 0)","Running","[NULL]","[NULL]",58073 196 3,"Lock contention on thread list lock (owner tid: 0)","Running","[NULL]","[NULL]",98698 197 3,"Lock contention on thread list lock (owner tid: 0)","S","[NULL]","[NULL]",56302 198 4,"monitor contention with owner InputReader (1421) at void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int)(PowerManagerService.java:1018) waiters=0 blocking from void com.android.server.power.PowerManagerService.handleSandman()(PowerManagerService.java:2280)","Running","[NULL]","[NULL]",121979 199 4,"monitor contention with owner InputReader (1421) at void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int)(PowerManagerService.java:1018) waiters=0 blocking from void com.android.server.power.PowerManagerService.handleSandman()(PowerManagerService.java:2280)","S","[NULL]","[NULL]",51198 200 5,"monitor contention with owner main (1204) at void com.android.server.am.ActivityManagerService.onWakefulnessChanged(int)(ActivityManagerService.java:7244) waiters=0 blocking from void com.android.server.am.ActivityManagerService$3.handleMessage(android.os.Message)(ActivityManagerService.java:1704)","Running","[NULL]","[NULL]",45000 201 5,"monitor contention with owner main (1204) at void com.android.server.am.ActivityManagerService.onWakefulnessChanged(int)(ActivityManagerService.java:7244) waiters=0 blocking from void com.android.server.am.ActivityManagerService$3.handleMessage(android.os.Message)(ActivityManagerService.java:1704)","S","[NULL]","[NULL]",20164377 202 6,"monitor contention with owner main (1204) at void com.android.server.am.ActivityManagerService.onWakefulnessChanged(int)(ActivityManagerService.java:7244) waiters=1 blocking from com.android.server.wm.ActivityTaskManagerInternal$SleepToken com.android.server.am.ActivityTaskManagerService.acquireSleepToken(java.lang.String, int)(ActivityTaskManagerService.java:5048)","Running","[NULL]","[NULL]",35104 203 """)) 204