// 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 * as SDK from '../../core/sdk/sdk.js';
import { renderElementIntoDOM } from '../../testing/DOMHelpers.js';
import { describeWithRealConnection } from '../../testing/RealConnection.js';
import * as Timeline from './timeline.js';
describeWithRealConnection('TimelineController', () => {
    it('calls the callback methods on the client in the expected order', async function () {
        // The test needs at least 0.5s to have progress events be sent. Set a higher timeout to avoid flakiness.
        if (this.timeout() !== 0) {
            this.timeout(5_000);
        }
        const stubs = {
            recordingProgress: sinon.stub(),
            loadingStarted: sinon.stub(),
            processingStarted: sinon.stub(),
            loadingProgress: sinon.stub(),
            loadingComplete: sinon.stub().callsFake(function (_collectedEvents) { }),
        };
        const client = {
            recordingProgress(usage) {
                stubs.recordingProgress(usage);
            },
            loadingStarted() {
                stubs.loadingStarted();
            },
            processingStarted() {
                stubs.processingStarted();
            },
            loadingProgress() {
                stubs.loadingProgress();
            },
            async loadingComplete(collectedEvents) {
                stubs.loadingComplete(collectedEvents);
            },
            loadingCompleteForTest() { },
        };
        const primaryPage = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
        if (!primaryPage) {
            throw new Error('Could not find primary page');
        }
        const root = SDK.TargetManager.TargetManager.instance().rootTarget();
        if (!root) {
            throw new Error('Could not find root target');
        }
        const controller = new Timeline.TimelineController.TimelineController(root, primaryPage, client);
        class TestTracingComponent extends HTMLElement {
            connectedCallback() {
                const newDiv = document.createElement('div');
                newDiv.innerHTML = 'testing';
                this.appendChild(newDiv);
            }
        }
        customElements.define('test-tracing-component', TestTracingComponent);
        const component = new TestTracingComponent();
        // Start a recording and inject the test component to trigger some trace events.
        await controller.startRecording({});
        renderElementIntoDOM(component);
        // Run the test for at least 0.5s to have progress events be sent.
        await new Promise(resolve => setTimeout(resolve, 1500));
        await controller.stopRecording();
        assert.strictEqual(stubs.processingStarted.callCount, 1);
        // Depending on the speed of the machine you might get more than 1 progress
        // call, hence we assert that there is at least one.
        assert.isAtLeast(stubs.recordingProgress.callCount, 1);
        assert.strictEqual(stubs.loadingStarted.callCount, 1);
        assert.isAtLeast(stubs.loadingProgress.callCount, 1);
        assert.strictEqual(stubs.loadingComplete.callCount, 1);
        const [collectedEvents] = stubs.loadingComplete.getCall(0)
            .args;
        // Ensure we collected events during tracing.
        assert.isTrue(collectedEvents.length > 0);
    });
});
//# sourceMappingURL=TimelineController.test.js.map