Unverified Commit 057a25cd authored by Kaushik Iska's avatar Kaushik Iska Committed by GitHub

[timeline] Sort timeline events before summarizing (#55771)

parent 958ab933
......@@ -34,12 +34,8 @@ class TimelineEvent {
json['ph'] as String,
json['pid'] as int,
json['tid'] as int,
json['dur'] != null
? Duration(microseconds: json['dur'] as int)
: null,
json['tdur'] != null
? Duration(microseconds: json['tdur'] as int)
: null,
json['dur'] != null ? Duration(microseconds: json['dur'] as int) : null,
json['tdur'] != null ? Duration(microseconds: json['tdur'] as int) : null,
json['ts'] as int,
json['tts'] as int,
json['args'] as Map<String, dynamic>,
......@@ -124,11 +120,32 @@ class TimelineEvent {
List<TimelineEvent> _parseEvents(Map<String, dynamic> json) {
final List<dynamic> jsonEvents = json['traceEvents'] as List<dynamic>;
if (jsonEvents == null)
if (jsonEvents == null) {
return null;
}
// TODO(vegorov): use instance method version of castFrom when it is available.
return Iterable.castFrom<dynamic, Map<String, dynamic>>(jsonEvents)
.map<TimelineEvent>((Map<String, dynamic> eventJson) => TimelineEvent(eventJson))
.toList();
final List<TimelineEvent> timelineEvents =
Iterable.castFrom<dynamic, Map<String, dynamic>>(jsonEvents)
.map<TimelineEvent>(
(Map<String, dynamic> eventJson) => TimelineEvent(eventJson))
.toList();
timelineEvents.sort((TimelineEvent e1, TimelineEvent e2) {
final int ts1 = e1.timestampMicros;
final int ts2 = e2.timestampMicros;
if (ts1 == null) {
if (ts2 == null) {
return 0;
} else {
return -1;
}
} else if (ts2 == null) {
return 1;
} else {
return ts1.compareTo(ts2);
}
});
return timelineEvents;
}
......@@ -32,7 +32,7 @@ void main() {
expect(timeline.events, hasLength(2));
final TimelineEvent e1 = timeline.events[0];
final TimelineEvent e1 = timeline.events[1];
expect(e1.name, 'test event');
expect(e1.category, 'test category');
expect(e1.phase, 'B');
......@@ -44,7 +44,7 @@ void main() {
expect(e1.threadTimestampMicros, 567);
expect(e1.arguments, <String, dynamic>{'arg1': true});
final TimelineEvent e2 = timeline.events[1];
final TimelineEvent e2 = timeline.events[0];
expect(e2.name, isNull);
expect(e2.category, isNull);
expect(e2.phase, isNull);
......@@ -56,5 +56,59 @@ void main() {
expect(e2.threadTimestampMicros, isNull);
expect(e2.arguments, isNull);
});
test('sorts JSON', () {
final Timeline timeline = Timeline.fromJson(<String, dynamic>{
'traceEvents': <Map<String, dynamic>>[
<String, dynamic>{
'name': 'test event 1',
'ts': 457,
},
<String, dynamic>{
'name': 'test event 2',
'ts': 456,
},
],
});
expect(timeline.events, hasLength(2));
expect(timeline.events[0].timestampMicros, equals(456));
expect(timeline.events[1].timestampMicros, equals(457));
expect(timeline.events[0].name, equals('test event 2'));
expect(timeline.events[1].name, equals('test event 1'));
});
test('sorts JSON nulls first', () {
final Timeline timeline = Timeline.fromJson(<String, dynamic>{
'traceEvents': <Map<String, dynamic>>[
<String, dynamic>{
'name': 'test event 0',
'ts': null,
},
<String, dynamic>{
'name': 'test event 1',
'ts': 457,
},
<String, dynamic>{
'name': 'test event 2',
'ts': 456,
},
<String, dynamic>{
'name': 'test event 3',
'ts': null,
},
],
});
expect(timeline.events, hasLength(4));
expect(timeline.events[0].timestampMicros, isNull);
expect(timeline.events[1].timestampMicros, isNull);
expect(timeline.events[2].timestampMicros, equals(456));
expect(timeline.events[3].timestampMicros, equals(457));
expect(timeline.events[0].name, equals('test event 0'));
expect(timeline.events[1].name, equals('test event 3'));
expect(timeline.events[2].name, equals('test event 2'));
expect(timeline.events[3].name, equals('test event 1'));
});
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment