• 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
18from python.generators.diff_tests.testing import DiffTestBlueprint, TraceInjector
19from python.generators.diff_tests.testing import TestSuite
20
21
22class Viz(TestSuite):
23  chronological_trace = TextProto(r"""
24        packet {
25          track_descriptor {
26            uuid: 1
27            name: "Root Chronological"
28            child_ordering: 2
29          }
30        }
31        packet {
32          track_descriptor {
33            uuid: 11
34            name: "A"
35            parent_uuid: 1
36          }
37        }
38        packet {
39          timestamp: 220
40          trusted_packet_sequence_id: 3903809
41          track_event {
42            type: TYPE_SLICE_BEGIN
43            track_uuid: 11
44            name: "A1"
45          }
46        }
47        packet {
48          timestamp: 230
49          trusted_packet_sequence_id: 3903809
50          track_event {
51            type: TYPE_SLICE_END
52            track_uuid: 11
53          }
54        }
55        packet {
56          track_descriptor {
57            uuid: 12
58            name: "B"
59            parent_uuid: 1
60          }
61        }
62        packet {
63          timestamp: 210
64          trusted_packet_sequence_id: 3903809
65          track_event {
66            type: TYPE_SLICE_BEGIN
67            track_uuid: 12
68            name: "B"
69          }
70        }
71        packet {
72          timestamp: 240
73          trusted_packet_sequence_id: 3903809
74          track_event {
75            type: TYPE_SLICE_END
76            track_uuid: 12
77          }
78        }
79        """)
80
81  explicit_trace = TextProto(r"""
82        packet {
83          track_descriptor {
84            uuid: 2
85            name: "Root Explicit"
86            child_ordering: 3
87          }
88        }
89        packet {
90          track_descriptor {
91            uuid: 110
92            name: "B"
93            parent_uuid: 2
94            sibling_order_rank: 1
95          }
96        }
97        packet {
98          track_descriptor {
99            uuid: 120
100            name: "A"
101            parent_uuid: 2
102            sibling_order_rank: 100
103          }
104        }
105        packet {
106          track_descriptor {
107            uuid: 130
108            name: "C"
109            parent_uuid: 2
110            sibling_order_rank: -100
111          }
112        }
113        packet {
114          timestamp: 220
115          trusted_packet_sequence_id: 3903809
116          track_event {
117            type: TYPE_SLICE_BEGIN
118            track_uuid: 110
119            name: "1"
120          }
121        }
122        packet {
123          timestamp: 230
124          trusted_packet_sequence_id: 3903809
125          track_event {
126            type: TYPE_SLICE_END
127            track_uuid: 110
128          }
129        }
130        packet {
131          timestamp: 230
132          trusted_packet_sequence_id: 3903809
133          track_event {
134            type: TYPE_SLICE_BEGIN
135            track_uuid: 120
136            name: "2"
137          }
138        }
139        packet {
140          timestamp: 240
141          trusted_packet_sequence_id: 3903809
142          track_event {
143            type: TYPE_SLICE_END
144            track_uuid: 120
145          }
146        }
147        packet {
148          timestamp: 225
149          trusted_packet_sequence_id: 3903809
150          track_event {
151            type: TYPE_SLICE_BEGIN
152            track_uuid: 130
153            name: "3"
154          }
155        }
156        packet {
157          timestamp: 235
158          trusted_packet_sequence_id: 3903809
159          track_event {
160            type: TYPE_SLICE_END
161            track_uuid: 130
162          }
163        }
164          """)
165
166  lexicographic_trace = TextProto(r"""
167        packet {
168          track_descriptor {
169            uuid: 3
170            name: "Root Lexicographic"
171            child_ordering: 1
172          }
173        }
174        packet {
175          track_descriptor {
176            uuid: 1100
177            name: "B"
178            parent_uuid: 3
179          }
180        }
181        packet {
182          track_descriptor {
183            uuid: 1200
184            name: "A"
185            parent_uuid: 3
186          }
187        }
188        packet {
189          track_descriptor {
190            uuid: 1300
191            name: "C"
192            parent_uuid: 3
193          }
194        }
195        packet {
196          timestamp: 220
197          trusted_packet_sequence_id: 3903809
198          track_event {
199            type: TYPE_SLICE_BEGIN
200            track_uuid: 1100
201            name: "A1"
202          }
203        }
204        packet {
205          timestamp: 230
206          trusted_packet_sequence_id: 3903809
207          track_event {
208            type: TYPE_SLICE_END
209            track_uuid: 1100
210          }
211        }
212        packet {
213          timestamp: 210
214          trusted_packet_sequence_id: 3903809
215          track_event {
216            type: TYPE_SLICE_BEGIN
217            track_uuid: 1200
218            name: "B1"
219          }
220        }
221        packet {
222          timestamp: 300
223          trusted_packet_sequence_id: 3903809
224          track_event {
225            type: TYPE_SLICE_END
226            track_uuid: 1200
227          }
228        }
229        packet {
230          timestamp: 350
231          trusted_packet_sequence_id: 3903809
232          track_event {
233            type: TYPE_SLICE_BEGIN
234            track_uuid: 1300
235            name: "C1"
236          }
237        }
238        packet {
239          timestamp: 400
240          trusted_packet_sequence_id: 3903809
241          track_event {
242            type: TYPE_SLICE_END
243            track_uuid: 1300
244          }
245        }
246        """)
247
248  all_ordering_trace = TextProto(f"""{chronological_trace.contents}
249      {explicit_trace.contents}
250      {lexicographic_trace.contents}""")
251
252  def test_track_event_tracks_chronological(self):
253    return DiffTestBlueprint(
254        trace=self.chronological_trace,
255        query="""
256        SELECT
257          id,
258          parent_id,
259          EXTRACT_ARG(source_arg_set_id, 'child_ordering') AS ordering,
260          EXTRACT_ARG(source_arg_set_id, 'sibling_order_rank') AS rank
261        FROM track;
262        """,
263        out=Csv("""
264        "id","parent_id","ordering","rank"
265        0,"[NULL]","chronological","[NULL]"
266        1,0,"[NULL]","[NULL]"
267        2,0,"[NULL]","[NULL]"
268        """))
269
270  def test_all_tracks_ordered_chronological(self):
271    return DiffTestBlueprint(
272        trace=self.chronological_trace,
273        query="""
274        INCLUDE PERFETTO MODULE viz.summary.track_event;
275        SELECT cast_int!(track_ids) as id, order_id
276        FROM _track_event_tracks_ordered_groups
277        ORDER BY track_ids;
278        """,
279        out=Csv("""
280        "id","order_id"
281        0,1
282        1,2
283        2,1
284        """))
285
286  def test_track_event_tracks_explicit(self):
287    return DiffTestBlueprint(
288        trace=self.explicit_trace,
289        query="""
290        SELECT
291          id,
292          parent_id,
293          EXTRACT_ARG(source_arg_set_id, 'child_ordering') AS ordering,
294          EXTRACT_ARG(source_arg_set_id, 'sibling_order_rank') AS rank
295        FROM track;
296        """,
297        out=Csv("""
298        "id","parent_id","ordering","rank"
299        0,"[NULL]","explicit","[NULL]"
300        1,0,"[NULL]",1
301        2,0,"[NULL]",100
302        3,0,"[NULL]",-100
303        """))
304
305  def test_all_tracks_ordered_explicit(self):
306    return DiffTestBlueprint(
307        trace=self.explicit_trace,
308        query="""
309        INCLUDE PERFETTO MODULE viz.summary.track_event;
310        SELECT cast_int!(track_ids) as id, order_id
311        FROM _track_event_tracks_ordered_groups
312        ORDER BY id;
313        """,
314        out=Csv("""
315        "id","order_id"
316        0,1
317        1,2
318        2,3
319        3,1
320        """))
321
322  def test_track_event_tracks_lexicographic(self):
323    return DiffTestBlueprint(
324        trace=self.lexicographic_trace,
325        query="""
326        SELECT
327          id,
328          parent_id,
329          name,
330          EXTRACT_ARG(source_arg_set_id, 'child_ordering') AS ordering,
331          EXTRACT_ARG(source_arg_set_id, 'sibling_order_rank') AS rank
332        FROM track;
333        """,
334        out=Csv("""
335        "id","parent_id","name","ordering","rank"
336        0,"[NULL]","Root Lexicographic","lexicographic","[NULL]"
337        1,0,"B","[NULL]","[NULL]"
338        2,0,"A","[NULL]","[NULL]"
339        3,0,"C","[NULL]","[NULL]"
340        """))
341
342  def test_all_tracks_ordered_lexicographic(self):
343    return DiffTestBlueprint(
344        trace=self.lexicographic_trace,
345        query="""
346        INCLUDE PERFETTO MODULE viz.summary.track_event;
347        SELECT cast_int!(track_ids) as id, order_id
348        FROM _track_event_tracks_ordered_groups
349        ORDER BY id;
350        """,
351        out=Csv("""
352        "id","order_id"
353        0,1
354        1,2
355        2,1
356        3,3
357        """))
358
359  def test_track_event_tracks_all_orderings(self):
360    return DiffTestBlueprint(
361        trace=self.all_ordering_trace,
362        query="""
363        SELECT
364          id,
365          parent_id,
366          name,
367          EXTRACT_ARG(source_arg_set_id, 'child_ordering') AS ordering,
368          EXTRACT_ARG(source_arg_set_id, 'sibling_order_rank') AS rank
369        FROM track
370        ORDER BY parent_id, id;
371        """,
372        out=Csv("""
373        "id","parent_id","name","ordering","rank"
374        0,"[NULL]","Root Chronological","chronological","[NULL]"
375        3,"[NULL]","Root Lexicographic","lexicographic","[NULL]"
376        5,"[NULL]","Root Explicit","explicit","[NULL]"
377        1,0,"A","[NULL]","[NULL]"
378        2,0,"B","[NULL]","[NULL]"
379        4,3,"A","[NULL]","[NULL]"
380        7,3,"B","[NULL]","[NULL]"
381        10,3,"C","[NULL]","[NULL]"
382        6,5,"B","[NULL]",1
383        8,5,"C","[NULL]",-100
384        9,5,"A","[NULL]",100
385        """))
386
387  def test_all_tracks_ordered_all_ordering(self):
388    return DiffTestBlueprint(
389        trace=self.all_ordering_trace,
390        query="""
391        INCLUDE PERFETTO MODULE viz.summary.track_event;
392        SELECT cast_int!(track_ids) as id, parent_id, order_id
393        FROM _track_event_tracks_ordered_groups
394        ORDER BY parent_id, id
395        """,
396        out=Csv("""
397        "id","parent_id","order_id"
398        0,"[NULL]",1
399        3,"[NULL]",3
400        5,"[NULL]",2
401        1,0,2
402        2,0,1
403        4,3,1
404        7,3,2
405        10,3,3
406        6,5,2
407        8,5,1
408        9,5,3
409        """))
410
411  def test_sanity_ordering_tracks(self):
412    return DiffTestBlueprint(
413        trace=Path('track_event_tracks_ordering.textproto'),
414        query="""
415        SELECT
416          id,
417          parent_id,
418          name,
419          EXTRACT_ARG(source_arg_set_id, 'child_ordering') AS ordering,
420          EXTRACT_ARG(source_arg_set_id, 'sibling_order_rank') AS rank
421        FROM track
422        ORDER BY parent_id, id;
423        """,
424        out=Csv("""
425          "id","parent_id","name","ordering","rank"
426          0,"[NULL]","explicit_parent","explicit",-10
427          4,"[NULL]","chronological_parent","chronological","[NULL]"
428          9,"[NULL]","lexicographic_parent","lexicographic","[NULL]"
429          1,0,"explicit_child:no z-index","[NULL]","[NULL]"
430          2,0,"explicit_child:5 z-index","[NULL]",5
431          3,0,"explicit_child:-5 z-index","[NULL]",-5
432          8,0,"explicit_child:-5 z-index","[NULL]",-5
433          5,4,"chrono","[NULL]","[NULL]"
434          6,4,"chrono2","[NULL]","[NULL]"
435          7,4,"chrono1","[NULL]","[NULL]"
436          10,9,"[NULL]","[NULL]","[NULL]"
437          11,9,"a","[NULL]","[NULL]"
438          12,9,"b","[NULL]","[NULL]"
439          13,9,"ab","[NULL]","[NULL]"
440        """))
441
442  def test_sanity_ordering(self):
443    return DiffTestBlueprint(
444        trace=Path('track_event_tracks_ordering.textproto'),
445        query="""
446        INCLUDE PERFETTO MODULE viz.summary.track_event;
447        SELECT cast_int!(track_ids) as id, order_id
448        FROM _track_event_tracks_ordered_groups
449        ORDER BY id;
450        """,
451        out=Csv("""
452        "id","order_id"
453        0,2
454        1,3
455        2,4
456        3,1
457        4,1
458        5,1
459        6,2
460        7,3
461        9,3
462        10,1
463        11,2
464        12,4
465        13,3
466        """))
467