UNPKG

chrome-devtools-frontend

Version:
101 lines (88 loc) 3.58 kB
// Copyright 2023 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import {createTarget} from '../../testing/EnvironmentHelpers.js'; import { describeWithMockConnection, setMockConnectionResponseHandler, } from '../../testing/MockConnection.js'; import {makeInstantEvent} from '../../testing/TraceHelpers.js'; import * as Trace from '../trace/trace.js'; class FakeClient implements Trace.TracingManager.TracingManagerClient { traceEventsCollected(_events: Trace.Types.Events.Event[]): void { } tracingComplete(): void { } tracingBufferUsage(_usage: number): void { } eventsRetrievalProgress(_progress: number): void { } } const fakeEvents = [ makeInstantEvent('test-event-1', 1), makeInstantEvent('test-event-2', 2), ]; describeWithMockConnection('TracingManager', () => { beforeEach(() => { setMockConnectionResponseHandler('Tracing.start', () => { return {}; }); setMockConnectionResponseHandler('Tracing.end', () => { return {}; }); }); it('sends bufferUsage to the client', async () => { const target = createTarget(); const manager = new Trace.TracingManager.TracingManager(target); const client = new FakeClient(); const bufferUsageSpy = sinon.spy(client, 'tracingBufferUsage'); await manager.start(client, 'devtools-timeline'); manager.bufferUsage(10); sinon.assert.calledWith(bufferUsageSpy, 10); }); it('sends events to the client when they are collected and updates the client with progress', async () => { const target = createTarget(); const manager = new Trace.TracingManager.TracingManager(target); const client = new FakeClient(); const eventsRetrievalProgressSpy = sinon.spy(client, 'eventsRetrievalProgress'); const eventsCollectedSpy = sinon.spy(client, 'traceEventsCollected'); await manager.start(client, 'devtools-timeline'); manager.bufferUsage(0); manager.eventsCollected(fakeEvents); sinon.assert.calledWith(eventsCollectedSpy, fakeEvents); assert.approximately(0.15, eventsRetrievalProgressSpy.args[0][0], 0.01); }); it('notifies the client when tracing is complete', async () => { const target = createTarget(); const manager = new Trace.TracingManager.TracingManager(target); const client = new FakeClient(); const tracingCompleteSpy = sinon.spy(client, 'tracingComplete'); await manager.start(client, 'devtools-timeline'); manager.bufferUsage(0); manager.eventsCollected(fakeEvents); manager.tracingComplete(); sinon.assert.calledOnce(tracingCompleteSpy); }); it('errors if tracing is started twice', async () => { const target = createTarget(); const manager = new Trace.TracingManager.TracingManager(target); const client = new FakeClient(); await manager.start(client, 'devtools-timeline'); // The assert.throws() helper does not work with async/await, hence the manual try catch let didThrow = false; try { await manager.start(client, 'devtools-timeline'); } catch (error) { didThrow = true; assert.strictEqual(error.message, 'Tracing is already started'); } assert.isTrue(didThrow, 'Test did not throw an error as expected.'); }); it('errors if you try to stop when tracing is not active', async () => { const target = createTarget(); const manager = new Trace.TracingManager.TracingManager(target); assert.throws(() => { manager.stop(); }, /Tracing is not started/); }); });