• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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