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