| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 <!-- | |
| 3 Copyright (c) 2015 The Chromium Authors. All rights reserved. | |
| 4 Use of this source code is governed by a BSD-style license that can be | |
| 5 found in the LICENSE file. | |
| 6 --> | |
| 7 | |
| 8 <link rel="import" | |
| 9 href="/perf_insights/timeline_based_measurement/rendering_frame.html"> | |
| 10 | |
| 11 <link rel="import" href="/tracing/base/range.html"> | |
| 12 <link rel="import" href="/tracing/base/statistics.html"> | |
| 13 <link rel="import" href="/tracing/core/test_utils.html"> | |
| 14 <link rel="import" href="/tracing/extras/chrome/cc/constants.html"> | |
| 15 <link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html"> | |
| 16 <link rel="import" href="/tracing/model/model.html"> | |
| 17 | |
| 18 <script> | |
| 19 'use strict'; | |
| 20 | |
| 21 tr.b.unittest.testSuite(function() { | |
| 22 | |
| 23 var ThreadSlice = tr.model.ThreadSlice; | |
| 24 var RenderingFrame = pi.tbm.RenderingFrame; | |
| 25 var SEND_BEGIN_FRAME_EVENT = tr.e.cc.constants.SEND_BEGIN_FRAME_EVENT; | |
| 26 var BEGIN_MAIN_FRAME_EVENT = tr.e.cc.constants.BEGIN_MAIN_FRAME_EVENT; | |
| 27 var Range = tr.b.Range; | |
| 28 | |
| 29 function RenderingFrameTestData() { | |
| 30 this.beginFrameId_ = 0; | |
| 31 this.events_ = []; | |
| 32 this.rendererProcess_ = (new tr.Model()).getOrCreateProcess(1); | |
| 33 this.mainThread_ = this.rendererProcess_.getOrCreateThread(11); | |
| 34 this.compositorThread_ = this.rendererProcess_.getOrCreateThread(12); | |
| 35 } | |
| 36 | |
| 37 RenderingFrameTestData.prototype = { | |
| 38 get events() { | |
| 39 return this.events_; | |
| 40 }, | |
| 41 | |
| 42 get rendererProcess() { | |
| 43 return this.rendererProcess_; | |
| 44 }, | |
| 45 | |
| 46 get compositorThread() { | |
| 47 return this.compositorThread_; | |
| 48 }, | |
| 49 | |
| 50 addSendEvent: function(opt_ts, opt_duration) { | |
| 51 if (opt_ts === undefined) | |
| 52 opt_ts = 0; | |
| 53 if (opt_duration === undefined) | |
| 54 opt_duration = 1; | |
| 55 this.beginFrameId_ += 1; | |
| 56 var event = this.createEvent_( | |
| 57 SEND_BEGIN_FRAME_EVENT, opt_ts, opt_duration); | |
| 58 this.compositorThread_.sliceGroup.pushSlice(event); | |
| 59 }, | |
| 60 | |
| 61 addBeginMainFrameEvent: function(opt_ts, opt_duration) { | |
| 62 if (opt_ts === undefined) | |
| 63 opt_ts = 0; | |
| 64 if (opt_duration === undefined) | |
| 65 opt_duration = 1; | |
| 66 var event = this.createEvent_( | |
| 67 BEGIN_MAIN_FRAME_EVENT, opt_ts, opt_duration); | |
| 68 this.mainThread_.sliceGroup.pushSlice(event); | |
| 69 }, | |
| 70 | |
| 71 updateBounds: function() { | |
| 72 this.rendererProcess_.updateBounds(); | |
| 73 }, | |
| 74 | |
| 75 createEvent_: function(eventTitle, ts, duration) { | |
| 76 var event = new ThreadSlice('cc,benchmark', eventTitle, 0, ts, { | |
| 77 'begin_frame_id': this.beginFrameId_ | |
| 78 }, duration); | |
| 79 this.events_.push(event); | |
| 80 return event; | |
| 81 } | |
| 82 }; | |
| 83 | |
| 84 function generateTimelineRange(opt_start, opt_end) { | |
| 85 if (opt_start === undefined) | |
| 86 opt_start = 0; | |
| 87 if (opt_end === undefined) | |
| 88 opt_end = 100; | |
| 89 var timelineRange = new tr.b.Range(); | |
| 90 timelineRange.min = opt_start; | |
| 91 timelineRange.max = opt_end; | |
| 92 return timelineRange; | |
| 93 } | |
| 94 | |
| 95 test('renderingFrameConstruction', function() { | |
| 96 var r = new RenderingFrameTestData(); | |
| 97 r.addSendEvent(10); | |
| 98 r.addBeginMainFrameEvent(20); | |
| 99 r.updateBounds(); | |
| 100 var frames = RenderingFrame.getFrameEventsInsideRange( | |
| 101 r.rendererProcess, Range.fromExplicitRange(0, 30)); | |
| 102 assert.equal(1, frames.length); | |
| 103 assert.equal(10, frames[0].queueDuration); | |
| 104 }); | |
| 105 | |
| 106 test('renderingFrame_missingSendBeginFrameEvents', function() { | |
| 107 var r = new RenderingFrameTestData(); | |
| 108 r.addBeginMainFrameEvent(10); | |
| 109 r.updateBounds(); | |
| 110 var frames = RenderingFrame.getFrameEventsInsideRange( | |
| 111 r.rendererProcess, Range.fromExplicitRange(0, 30)); | |
| 112 assert.equal(0, frames.length); | |
| 113 }); | |
| 114 | |
| 115 test('renderingFrame_duplicateSendBeginFrameEvents', function() { | |
| 116 var r = new RenderingFrameTestData(); | |
| 117 r.addSendEvent(10); | |
| 118 r.addBeginMainFrameEvent(20); | |
| 119 var begin_frame_id = r.events[0].args['begin_frame_id']; | |
| 120 r.compositorThread.sliceGroup.pushSlice(new ThreadSlice( | |
| 121 'cc,benchmark', SEND_BEGIN_FRAME_EVENT, 0, 30, | |
| 122 {'begin_frame_id': begin_frame_id}, 0)); | |
| 123 r.updateBounds(); | |
| 124 var frames = RenderingFrame.getFrameEventsInsideRange( | |
| 125 r.rendererProcess, Range.fromExplicitRange(0, 30)); | |
| 126 assert.equal(0, frames.length); | |
| 127 }); | |
| 128 | |
| 129 test('renderingFrame_missingBeginMainFrameEvents', function() { | |
| 130 var r = new RenderingFrameTestData(); | |
| 131 r.addSendEvent(10); | |
| 132 r.updateBounds(); | |
| 133 var frames = RenderingFrame.getFrameEventsInsideRange( | |
| 134 r.rendererProcess, Range.fromExplicitRange(0, 30)); | |
| 135 assert.equal(0, frames.length); | |
| 136 }); | |
| 137 | |
| 138 test('renderingFrame_duplicateBeginMainFrameEvents', function() { | |
| 139 var r = new RenderingFrameTestData(); | |
| 140 r.addSendEvent(10); | |
| 141 r.addBeginMainFrameEvent(20); | |
| 142 r.addBeginMainFrameEvent(30); | |
| 143 r.addBeginMainFrameEvent(40); | |
| 144 r.updateBounds(); | |
| 145 | |
| 146 var frames = RenderingFrame.getFrameEventsInsideRange( | |
| 147 r.rendererProcess, Range.fromExplicitRange(0, 30)); | |
| 148 assert.equal(1, frames.length); | |
| 149 assert.equal(30, frames[0].queueDuration); | |
| 150 }); | |
| 151 | |
| 152 test('renderingFrame_frameEventMissingBeginFrameId', function() { | |
| 153 var model = new tr.Model(); | |
| 154 var process = model.getOrCreateProcess(1); | |
| 155 var main_thread = process.getOrCreateThread(11); | |
| 156 var model_range = {}; | |
| 157 | |
| 158 // Create an event without the begin_frame_id argument | |
| 159 var event = new ThreadSlice( | |
| 160 'cc,benchmark', BEGIN_MAIN_FRAME_EVENT, 0, 0.0); | |
| 161 main_thread.sliceGroup.pushSlice(event); | |
| 162 process.updateBounds(); | |
| 163 try { | |
| 164 RenderingFrame.getFrameEventsInsideRange(process, model_range); | |
| 165 assert.isFalse(true, 'Exception should have been thrown'); | |
| 166 } catch (err) { | |
| 167 assert.equal(true, true); | |
| 168 } | |
| 169 }); | |
| 170 | |
| 171 /** | |
| 172 * Test a basic sequenece, with expected frame queueing delays A and B. | |
| 173 * | |
| 174 * |----A----| |--B--| | |
| 175 * Main: [1] [1] [2] | |
| 176 * | |
| 177 * Compositor: [1] [2] | |
| 178 **/ | |
| 179 test('renderingFrame_getFrameEventsInsideRange', function() { | |
| 180 var r = new RenderingFrameTestData(); | |
| 181 r.addSendEvent(10); | |
| 182 r.addBeginMainFrameEvent(20); | |
| 183 r.addBeginMainFrameEvent(30); | |
| 184 r.addSendEvent(40); | |
| 185 r.addBeginMainFrameEvent(50); | |
| 186 r.updateBounds(); | |
| 187 | |
| 188 var timelineRange = generateTimelineRange(); | |
| 189 var frameEvents = RenderingFrame.getFrameEventsInsideRange( | |
| 190 r.rendererProcess, timelineRange); | |
| 191 | |
| 192 assert.equal(2, frameEvents.length); | |
| 193 assert.equal(20, frameEvents[0].queueDuration); | |
| 194 assert.equal(10, frameEvents[1].queueDuration); | |
| 195 }); | |
| 196 | |
| 197 /** | |
| 198 * Test a sequenece missing an initial SendBeginFrame. | |
| 199 * | |
| 200 * Only one frame should be returned, with expected frame queueing delay A. | |
| 201 * |--A--| | |
| 202 * Main: [0] [0] [2] | |
| 203 * | |
| 204 * Compositor: [2] | |
| 205 **/ | |
| 206 test('renderingFrame_frameEventsMissingDataNotIncluded', function() { | |
| 207 var r = new RenderingFrameTestData(); | |
| 208 r.addBeginMainFrameEvent(20); | |
| 209 r.addBeginMainFrameEvent(30); | |
| 210 r.addSendEvent(40); | |
| 211 r.addBeginMainFrameEvent(50); | |
| 212 r.updateBounds(); | |
| 213 | |
| 214 var timelineRange = generateTimelineRange(); | |
| 215 var frameEvents = RenderingFrame.getFrameEventsInsideRange( | |
| 216 r.rendererProcess, timelineRange); | |
| 217 | |
| 218 assert.equal(1, frameEvents.length); | |
| 219 assert.equal(10, frameEvents[0].queueDuration); | |
| 220 }); | |
| 221 | |
| 222 }); | |
| 223 </script> | |
| OLD | NEW |