OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <set> |
5 #include <string> | 6 #include <string> |
6 | 7 |
7 #include "base/time/time.h" | 8 #include "base/time/time.h" |
8 #include "base/trace_event/trace_event_argument.h" | 9 #include "base/trace_event/trace_event_argument.h" |
9 #include "base/values.h" | 10 #include "base/values.h" |
10 #include "cc/debug/frame_timing_tracker.h" | 11 #include "cc/debug/frame_timing_tracker.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
12 | 13 |
13 namespace cc { | 14 namespace cc { |
14 namespace { | 15 namespace { |
15 | 16 |
16 static std::string ToString( | 17 std::string CompositeToString( |
17 scoped_ptr<FrameTimingTracker::CompositeTimingSet> timingset) { | 18 scoped_ptr<FrameTimingTracker::CompositeTimingSet> timingset) { |
18 scoped_refptr<base::trace_event::TracedValue> value = | 19 scoped_refptr<base::trace_event::TracedValue> value = |
19 new base::trace_event::TracedValue(); | 20 new base::trace_event::TracedValue(); |
20 value->BeginArray("values"); | 21 value->BeginArray("values"); |
21 for (const auto& it : *timingset) { | 22 std::set<int> rect_ids; |
| 23 for (const auto& pair : *timingset) |
| 24 rect_ids.insert(pair.first); |
| 25 |
| 26 for (const auto& rect_id : rect_ids) { |
| 27 auto& events = (*timingset)[rect_id]; |
22 value->BeginDictionary(); | 28 value->BeginDictionary(); |
23 value->SetInteger("rect_id", it.first); | 29 value->SetInteger("rect_id", rect_id); |
24 value->BeginArray("events"); | 30 value->BeginArray("events"); |
25 for (const auto& event : it.second) { | 31 for (const auto& event : events) { |
26 value->BeginDictionary(); | 32 value->BeginDictionary(); |
27 value->SetInteger("frame_id", event.frame_id); | 33 value->SetInteger("frame_id", event.frame_id); |
28 value->SetInteger("timestamp", event.timestamp.ToInternalValue()); | 34 value->SetInteger("timestamp", event.timestamp.ToInternalValue()); |
29 value->EndDictionary(); | 35 value->EndDictionary(); |
| 36 } |
| 37 value->EndArray(); |
| 38 value->EndDictionary(); |
| 39 } |
| 40 value->EndArray(); |
| 41 return value->ToString(); |
| 42 } |
| 43 |
| 44 std::string MainFrameToString( |
| 45 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> timingset) { |
| 46 scoped_refptr<base::trace_event::TracedValue> value = |
| 47 new base::trace_event::TracedValue(); |
| 48 value->BeginArray("values"); |
| 49 std::set<int> rect_ids; |
| 50 for (const auto& pair : *timingset) |
| 51 rect_ids.insert(pair.first); |
| 52 |
| 53 for (const auto& rect_id : rect_ids) { |
| 54 auto& events = (*timingset)[rect_id]; |
| 55 value->BeginDictionary(); |
| 56 value->SetInteger("rect_id", rect_id); |
| 57 value->BeginArray("events"); |
| 58 for (const auto& event : events) { |
| 59 value->BeginDictionary(); |
| 60 value->SetInteger("end_time", event.end_time.ToInternalValue()); |
| 61 value->SetInteger("frame_id", event.frame_id); |
| 62 value->SetInteger("timestamp", event.timestamp.ToInternalValue()); |
| 63 value->EndDictionary(); |
30 } | 64 } |
31 value->EndArray(); | 65 value->EndArray(); |
32 value->EndDictionary(); | 66 value->EndDictionary(); |
33 } | 67 } |
34 value->EndArray(); | 68 value->EndArray(); |
35 return value->ToString(); | 69 return value->ToString(); |
36 } | 70 } |
37 | 71 |
38 TEST(FrameTimingTrackerTest, DefaultTrackerIsEmpty) { | 72 TEST(FrameTimingTrackerTest, DefaultTrackerIsEmpty) { |
39 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); | 73 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
40 EXPECT_EQ("{\"values\":[]}", ToString(tracker->GroupCountsByRectId())); | 74 EXPECT_EQ("{\"values\":[]}", |
| 75 CompositeToString(tracker->GroupCompositeCountsByRectId())); |
| 76 EXPECT_EQ("{\"values\":[]}", |
| 77 MainFrameToString(tracker->GroupMainFrameCountsByRectId())); |
41 } | 78 } |
42 | 79 |
43 TEST(FrameTimingTrackerTest, NoFrameIdsIsEmpty) { | 80 TEST(FrameTimingTrackerTest, NoFrameIdsIsEmpty) { |
44 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); | 81 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
45 std::vector<std::pair<int, int64_t>> ids; | 82 std::vector<std::pair<int, int64_t>> ids; |
46 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); | 83 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); |
47 EXPECT_EQ("{\"values\":[]}", ToString(tracker->GroupCountsByRectId())); | 84 EXPECT_EQ("{\"values\":[]}", |
| 85 CompositeToString(tracker->GroupCompositeCountsByRectId())); |
| 86 } |
| 87 |
| 88 TEST(FrameTimingTrackerTest, NoRectIdsYieldsNoMainFrameEvents) { |
| 89 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
| 90 tracker->SaveMainFrameTimeStamps(std::vector<int64_t>(), |
| 91 base::TimeTicks::FromInternalValue(100), |
| 92 base::TimeTicks::FromInternalValue(110), 1); |
| 93 EXPECT_EQ("{\"values\":[]}", |
| 94 MainFrameToString(tracker->GroupMainFrameCountsByRectId())); |
48 } | 95 } |
49 | 96 |
50 TEST(FrameTimingTrackerTest, OneFrameId) { | 97 TEST(FrameTimingTrackerTest, OneFrameId) { |
51 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); | 98 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
52 std::vector<std::pair<int, int64_t>> ids; | 99 std::vector<std::pair<int, int64_t>> ids; |
53 ids.push_back(std::make_pair(1, 2)); | 100 ids.push_back(std::make_pair(1, 2)); |
54 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); | 101 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); |
55 EXPECT_EQ( | 102 EXPECT_EQ( |
56 "{\"values\":[{\"events\":[" | 103 "{\"values\":[{\"events\":[" |
57 "{\"frame_id\":1,\"timestamp\":100}],\"rect_id\":2}]}", | 104 "{\"frame_id\":1,\"timestamp\":100}],\"rect_id\":2}]}", |
58 ToString(tracker->GroupCountsByRectId())); | 105 CompositeToString(tracker->GroupCompositeCountsByRectId())); |
| 106 } |
| 107 |
| 108 TEST(FrameTimingTrackerTest, OneMainFrameRect) { |
| 109 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
| 110 std::vector<int64_t> rect_ids; |
| 111 rect_ids.push_back(1); |
| 112 tracker->SaveMainFrameTimeStamps(rect_ids, |
| 113 base::TimeTicks::FromInternalValue(100), |
| 114 base::TimeTicks::FromInternalValue(110), 2); |
| 115 EXPECT_EQ( |
| 116 "{\"values\":[{\"events\":[" |
| 117 "{\"end_time\":110,\"frame_id\":2,\"timestamp\":100}],\"rect_id\":1}]}", |
| 118 MainFrameToString(tracker->GroupMainFrameCountsByRectId())); |
59 } | 119 } |
60 | 120 |
61 TEST(FrameTimingTrackerTest, UnsortedTimestampsIds) { | 121 TEST(FrameTimingTrackerTest, UnsortedTimestampsIds) { |
62 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); | 122 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
63 std::vector<std::pair<int, int64_t>> ids; | 123 std::vector<std::pair<int, int64_t>> ids; |
64 ids.push_back(std::make_pair(1, 2)); | 124 ids.push_back(std::make_pair(1, 2)); |
65 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(200), ids); | 125 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(200), ids); |
66 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(400), ids); | 126 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(400), ids); |
67 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); | 127 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids); |
68 EXPECT_EQ( | 128 EXPECT_EQ( |
69 "{\"values\":[{\"events\":[" | 129 "{\"values\":[{\"events\":[" |
70 "{\"frame_id\":1,\"timestamp\":100}," | 130 "{\"frame_id\":1,\"timestamp\":100}," |
71 "{\"frame_id\":1,\"timestamp\":200}," | 131 "{\"frame_id\":1,\"timestamp\":200}," |
72 "{\"frame_id\":1,\"timestamp\":400}],\"rect_id\":2}]}", | 132 "{\"frame_id\":1,\"timestamp\":400}],\"rect_id\":2}]}", |
73 ToString(tracker->GroupCountsByRectId())); | 133 CompositeToString(tracker->GroupCompositeCountsByRectId())); |
| 134 } |
| 135 |
| 136 TEST(FrameTimingTrackerTest, MainFrameUnsortedTimestamps) { |
| 137 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
| 138 std::vector<int64_t> rect_ids; |
| 139 rect_ids.push_back(2); |
| 140 tracker->SaveMainFrameTimeStamps(rect_ids, |
| 141 base::TimeTicks::FromInternalValue(200), |
| 142 base::TimeTicks::FromInternalValue(280), 1); |
| 143 tracker->SaveMainFrameTimeStamps(rect_ids, |
| 144 base::TimeTicks::FromInternalValue(400), |
| 145 base::TimeTicks::FromInternalValue(470), 1); |
| 146 tracker->SaveMainFrameTimeStamps(rect_ids, |
| 147 base::TimeTicks::FromInternalValue(100), |
| 148 base::TimeTicks::FromInternalValue(160), 1); |
| 149 EXPECT_EQ( |
| 150 "{\"values\":[{\"events\":[" |
| 151 "{\"end_time\":160,\"frame_id\":1,\"timestamp\":100}," |
| 152 "{\"end_time\":280,\"frame_id\":1,\"timestamp\":200}," |
| 153 "{\"end_time\":470,\"frame_id\":1,\"timestamp\":400}],\"rect_id\":2}]}", |
| 154 MainFrameToString(tracker->GroupMainFrameCountsByRectId())); |
74 } | 155 } |
75 | 156 |
76 TEST(FrameTimingTrackerTest, MultipleFrameIds) { | 157 TEST(FrameTimingTrackerTest, MultipleFrameIds) { |
77 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); | 158 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
78 | 159 |
79 std::vector<std::pair<int, int64_t>> ids200; | 160 std::vector<std::pair<int, int64_t>> ids200; |
80 ids200.push_back(std::make_pair(1, 2)); | 161 ids200.push_back(std::make_pair(1, 2)); |
81 ids200.push_back(std::make_pair(1, 3)); | 162 ids200.push_back(std::make_pair(1, 3)); |
82 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(200), ids200); | 163 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(200), ids200); |
83 | 164 |
84 std::vector<std::pair<int, int64_t>> ids400; | 165 std::vector<std::pair<int, int64_t>> ids400; |
85 ids400.push_back(std::make_pair(2, 2)); | 166 ids400.push_back(std::make_pair(2, 2)); |
86 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(400), ids400); | 167 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(400), ids400); |
87 | 168 |
88 std::vector<std::pair<int, int64_t>> ids100; | 169 std::vector<std::pair<int, int64_t>> ids100; |
89 ids100.push_back(std::make_pair(3, 2)); | 170 ids100.push_back(std::make_pair(3, 2)); |
90 ids100.push_back(std::make_pair(2, 3)); | 171 ids100.push_back(std::make_pair(2, 3)); |
91 ids100.push_back(std::make_pair(3, 4)); | 172 ids100.push_back(std::make_pair(3, 4)); |
92 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids100); | 173 tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids100); |
93 | 174 |
94 std::string result = ToString(tracker->GroupCountsByRectId()); | 175 EXPECT_EQ( |
| 176 "{\"values\":[{\"events\":[" |
| 177 "{\"frame_id\":3,\"timestamp\":100}," |
| 178 "{\"frame_id\":1,\"timestamp\":200}," |
| 179 "{\"frame_id\":2,\"timestamp\":400}],\"rect_id\":2}," |
| 180 "{\"events\":[" |
| 181 "{\"frame_id\":2,\"timestamp\":100}," |
| 182 "{\"frame_id\":1,\"timestamp\":200}],\"rect_id\":3}," |
| 183 "{\"events\":[" |
| 184 "{\"frame_id\":3,\"timestamp\":100}],\"rect_id\":4}" |
| 185 "]}", |
| 186 CompositeToString(tracker->GroupCompositeCountsByRectId())); |
| 187 } |
95 | 188 |
96 EXPECT_EQ(strlen( | 189 TEST(FrameTimingTrackerTest, MultipleMainFrameEvents) { |
97 "{\"values\":[{\"events\":[" | 190 scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create()); |
98 "{\"frame_id\":3,\"timestamp\":100}," | 191 |
99 "{\"frame_id\":1,\"timestamp\":200}," | 192 std::vector<int64_t> rect_ids200; |
100 "{\"frame_id\":2,\"timestamp\":400}],\"rect_id\":2}," | 193 rect_ids200.push_back(2); |
101 "{\"events\":[" | 194 rect_ids200.push_back(3); |
102 "{\"frame_id\":2,\"timestamp\":100}," | 195 tracker->SaveMainFrameTimeStamps(rect_ids200, |
103 "{\"frame_id\":1,\"timestamp\":200}],\"rect_id\":3}," | 196 base::TimeTicks::FromInternalValue(200), |
104 "{\"events\":[" | 197 base::TimeTicks::FromInternalValue(220), 1); |
105 "{\"frame_id\":3,\"timestamp\":100}],\"rect_id\":4}" | 198 |
106 "]}"), | 199 std::vector<int64_t> rect_ids400; |
107 result.size()); | 200 rect_ids400.push_back(2); |
108 EXPECT_NE(std::string::npos, | 201 tracker->SaveMainFrameTimeStamps(rect_ids400, |
109 result.find( | 202 base::TimeTicks::FromInternalValue(400), |
110 "{\"frame_id\":3,\"timestamp\":100}," | 203 base::TimeTicks::FromInternalValue(440), 2); |
111 "{\"frame_id\":1,\"timestamp\":200}," | 204 |
112 "{\"frame_id\":2,\"timestamp\":400}],\"rect_id\":2}")); | 205 std::vector<int64_t> rect_ids100; |
113 EXPECT_NE(std::string::npos, | 206 rect_ids100.push_back(2); |
114 result.find( | 207 rect_ids100.push_back(3); |
115 "{\"events\":[" | 208 rect_ids100.push_back(4); |
116 "{\"frame_id\":2,\"timestamp\":100}," | 209 tracker->SaveMainFrameTimeStamps(rect_ids100, |
117 "{\"frame_id\":1,\"timestamp\":200}],\"rect_id\":3}")); | 210 base::TimeTicks::FromInternalValue(100), |
118 EXPECT_NE(std::string::npos, | 211 base::TimeTicks::FromInternalValue(110), 3); |
119 result.find( | 212 |
120 "{\"events\":[" | 213 EXPECT_EQ( |
121 "{\"frame_id\":3,\"timestamp\":100}],\"rect_id\":4}")); | 214 "{\"values\":[{\"events\":[" |
| 215 "{\"end_time\":110,\"frame_id\":3,\"timestamp\":100}," |
| 216 "{\"end_time\":220,\"frame_id\":1,\"timestamp\":200}," |
| 217 "{\"end_time\":440,\"frame_id\":2,\"timestamp\":400}],\"rect_id\":2}," |
| 218 "{\"events\":[" |
| 219 "{\"end_time\":110,\"frame_id\":3,\"timestamp\":100}," |
| 220 "{\"end_time\":220,\"frame_id\":1,\"timestamp\":200}],\"rect_id\":3}," |
| 221 "{\"events\":[" |
| 222 "{\"end_time\":110,\"frame_id\":3,\"timestamp\":100}],\"rect_id\":4}" |
| 223 "]}", |
| 224 MainFrameToString(tracker->GroupMainFrameCountsByRectId())); |
122 } | 225 } |
123 | 226 |
124 } // namespace | 227 } // namespace |
125 } // namespace cc | 228 } // namespace cc |
OLD | NEW |