<!DOCTYPE html>
<!--
@license
Copyright (C) 2016 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<meta charset="utf-8">
<title>gr-reporting</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>

<test-fixture id="basic">
  <template>
    <gr-reporting></gr-reporting>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-reporting.js';
suite('gr-reporting tests', () => {
  let element;
  let sandbox;
  let clock;
  let fakePerformance;

  const NOW_TIME = 100;

  setup(() => {
    sandbox = sinon.sandbox.create();
    clock = sinon.useFakeTimers(NOW_TIME);
    element = fixture('basic');
    element._baselines = Object.assign({}, GrReporting.STARTUP_TIMERS);
    fakePerformance = {
      navigationStart: 1,
      loadEventEnd: 2,
    };
    fakePerformance.toJSON = () => fakePerformance;
    sinon.stub(element, 'performanceTiming',
        {get() { return fakePerformance; }});
    sandbox.stub(element, 'reporter');
  });

  teardown(() => {
    sandbox.restore();
    clock.restore();
  });

  test('appStarted', () => {
    sandbox.stub(element, 'now').returns(42);
    element.appStarted();
    assert.isTrue(
        element.reporter.calledWithMatch(
            'timing-report', 'UI Latency', 'App Started', 42
        ));
    assert.isTrue(
        element.reporter.calledWithExactly(
            'timing-report', 'UI Latency', 'NavResTime - loadEventEnd',
            fakePerformance.loadEventEnd - fakePerformance.navigationStart,
            undefined, true)
    );
  });

  test('WebComponentsReady', () => {
    sandbox.stub(element, 'now').returns(42);
    element.timeEnd('WebComponentsReady');
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'WebComponentsReady', 42
    ));
  });

  test('beforeLocationChanged', () => {
    element._baselines['garbage'] = 'monster';
    sandbox.stub(element, 'time');
    element.beforeLocationChanged();
    assert.isTrue(element.time.calledWithExactly('DashboardDisplayed'));
    assert.isTrue(element.time.calledWithExactly('ChangeDisplayed'));
    assert.isTrue(element.time.calledWithExactly('ChangeFullyLoaded'));
    assert.isTrue(element.time.calledWithExactly('DiffViewDisplayed'));
    assert.isTrue(element.time.calledWithExactly('FileListDisplayed'));
    assert.isFalse(element._baselines.hasOwnProperty('garbage'));
  });

  test('changeDisplayed', () => {
    sandbox.spy(element, 'timeEnd');
    element.changeDisplayed();
    assert.isFalse(element.timeEnd.calledWith('ChangeDisplayed'));
    assert.isTrue(element.timeEnd.calledWith('StartupChangeDisplayed'));
    element.changeDisplayed();
    assert.isTrue(element.timeEnd.calledWith('ChangeDisplayed'));
  });

  test('changeFullyLoaded', () => {
    sandbox.spy(element, 'timeEnd');
    element.changeFullyLoaded();
    assert.isFalse(
        element.timeEnd.calledWithExactly('ChangeFullyLoaded'));
    assert.isTrue(
        element.timeEnd.calledWithExactly('StartupChangeFullyLoaded'));
    element.changeFullyLoaded();
    assert.isTrue(element.timeEnd.calledWithExactly('ChangeFullyLoaded'));
  });

  test('diffViewDisplayed', () => {
    sandbox.spy(element, 'timeEnd');
    element.diffViewDisplayed();
    assert.isFalse(element.timeEnd.calledWith('DiffViewDisplayed'));
    assert.isTrue(element.timeEnd.calledWith('StartupDiffViewDisplayed'));
    element.diffViewDisplayed();
    assert.isTrue(element.timeEnd.calledWith('DiffViewDisplayed'));
  });

  test('fileListDisplayed', () => {
    sandbox.spy(element, 'timeEnd');
    element.fileListDisplayed();
    assert.isFalse(
        element.timeEnd.calledWithExactly('FileListDisplayed'));
    assert.isTrue(
        element.timeEnd.calledWithExactly('StartupFileListDisplayed'));
    element.fileListDisplayed();
    assert.isTrue(element.timeEnd.calledWithExactly('FileListDisplayed'));
  });

  test('dashboardDisplayed', () => {
    sandbox.spy(element, 'timeEnd');
    element.dashboardDisplayed();
    assert.isFalse(element.timeEnd.calledWith('DashboardDisplayed'));
    assert.isTrue(element.timeEnd.calledWith('StartupDashboardDisplayed'));
    element.dashboardDisplayed();
    assert.isTrue(element.timeEnd.calledWith('DashboardDisplayed'));
  });

  test('dashboardDisplayed details', () => {
    sandbox.spy(element, 'timeEnd');
    sandbox.stub(window, 'performance', {
      memory: {
        usedJSHeapSize: 1024 * 1024,
      },
      measure: () => {},
    });
    sandbox.stub(element, 'now').returns(42);
    element.reportRpcTiming('/changes/*~*/comments', 500);
    element.dashboardDisplayed();
    assert.isTrue(
        element.timeEnd.calledWithExactly('StartupDashboardDisplayed',
            {rpcList: [
              {
                anonymizedUrl: '/changes/*~*/comments',
                elapsed: 500,
              },
            ],
            screenSize: {
              width: window.screen.width,
              height: window.screen.height,
            },
            viewport: {
              width: document.documentElement.clientWidth,
              height: document.documentElement.clientHeight,
            },
            usedJSHeapSizeMb: 1,
            }
        ));
  });

  test('time and timeEnd', () => {
    const nowStub = sandbox.stub(element, 'now').returns(0);
    element.time('foo');
    nowStub.returns(1);
    element.time('bar');
    nowStub.returns(2);
    element.timeEnd('bar');
    nowStub.returns(3);
    element.timeEnd('foo');
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'foo', 3
    ));
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'bar', 1
    ));
  });

  test('timer object', () => {
    const nowStub = sandbox.stub(element, 'now').returns(100);
    const timer = element.getTimer('foo-bar');
    nowStub.returns(150);
    timer.end();
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'foo-bar', 50));
  });

  test('timer object double call', () => {
    const timer = element.getTimer('foo-bar');
    timer.end();
    assert.isTrue(element.reporter.calledOnce);
    assert.throws(() => {
      timer.end();
    }, 'Timer for "foo-bar" already ended.');
  });

  test('timer object maximum', () => {
    const nowStub = sandbox.stub(element, 'now').returns(100);
    const timer = element.getTimer('foo-bar').withMaximum(100);
    nowStub.returns(150);
    timer.end();
    assert.isTrue(element.reporter.calledOnce);

    timer.reset();
    nowStub.returns(260);
    timer.end();
    assert.isTrue(element.reporter.calledOnce);
  });

  test('recordDraftInteraction', () => {
    const key = 'TimeBetweenDraftActions';
    const nowStub = sandbox.stub(element, 'now').returns(100);
    const timingStub = sandbox.stub(element, '_reportTiming');
    element.recordDraftInteraction();
    assert.isFalse(timingStub.called);

    nowStub.returns(200);
    element.recordDraftInteraction();
    assert.isTrue(timingStub.calledOnce);
    assert.equal(timingStub.lastCall.args[0], key);
    assert.equal(timingStub.lastCall.args[1], 100);

    nowStub.returns(350);
    element.recordDraftInteraction();
    assert.isTrue(timingStub.calledTwice);
    assert.equal(timingStub.lastCall.args[0], key);
    assert.equal(timingStub.lastCall.args[1], 150);

    nowStub.returns(370 + 2 * 60 * 1000);
    element.recordDraftInteraction();
    assert.isFalse(timingStub.calledThrice);
  });

  test('timeEndWithAverage', () => {
    const nowStub = sandbox.stub(element, 'now').returns(0);
    nowStub.returns(1000);
    element.time('foo');
    nowStub.returns(1100);
    element.timeEndWithAverage('foo', 'bar', 10);
    assert.isTrue(element.reporter.calledTwice);
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'foo', 100));
    assert.isTrue(element.reporter.calledWithMatch(
        'timing-report', 'UI Latency', 'bar', 10));
  });

  test('reportExtension', () => {
    element.reportExtension('foo');
    assert.isTrue(element.reporter.calledWithExactly(
        'lifecycle', 'Extension detected', 'foo'
    ));
  });

  test('reportInteraction', () => {
    element.reporter.restore();
    sandbox.spy(element, '_reportEvent');
    element.pluginsLoaded(); // so we don't cache
    element.reportInteraction('button-click', {name: 'sendReply'});
    assert.isTrue(element._reportEvent.getCall(2).calledWithMatch(
        {
          type: 'interaction',
          name: 'button-click',
          eventDetails: JSON.stringify({name: 'sendReply'}),
        }
    ));
  });

  test('report start time', () => {
    element.reporter.restore();
    sandbox.stub(element, 'now').returns(42);
    sandbox.spy(element, '_reportEvent');
    const dispatchStub = sandbox.spy(document, 'dispatchEvent');
    element.pluginsLoaded();
    element.time('timeAction');
    element.timeEnd('timeAction');
    assert.isTrue(element._reportEvent.getCall(2).calledWithMatch(
        {
          type: 'timing-report',
          category: 'UI Latency',
          name: 'timeAction',
          value: 0,
          eventStart: 42,
        }
    ));
    assert.equal(dispatchStub.getCall(2).args[0].detail.eventStart, 42);
  });

  suite('plugins', () => {
    setup(() => {
      element.reporter.restore();
      sandbox.stub(element, '_reportEvent');
    });

    test('pluginsLoaded reports time', () => {
      sandbox.stub(element, 'now').returns(42);
      element.pluginsLoaded();
      assert.isTrue(element._reportEvent.calledWithMatch(
          {
            type: 'timing-report',
            category: 'UI Latency',
            name: 'PluginsLoaded',
            value: 42,
          }
      ));
    });

    test('pluginsLoaded reports plugins', () => {
      element.pluginsLoaded(['foo', 'bar']);
      assert.isTrue(element._reportEvent.calledWithMatch(
          {
            type: 'lifecycle',
            category: 'Plugins installed',
            eventDetails: JSON.stringify({pluginsList: ['foo', 'bar']}),
          }
      ));
    });

    test('caches reports if plugins are not loaded', () => {
      element.timeEnd('foo');
      assert.isFalse(element._reportEvent.called);
    });

    test('reports if plugins are loaded', () => {
      element.pluginsLoaded();
      assert.isTrue(element._reportEvent.called);
    });

    test('reports if metrics plugin xyz is loaded', () => {
      element.pluginLoaded('metrics-xyz');
      assert.isTrue(element._reportEvent.called);
    });

    test('reports cached events preserving order', () => {
      element.time('foo');
      element.time('bar');
      element.timeEnd('foo');
      element.pluginsLoaded();
      element.timeEnd('bar');
      assert.isTrue(element._reportEvent.getCall(0).calledWithMatch(
          {type: 'timing-report', category: 'UI Latency', name: 'foo'}
      ));
      assert.isTrue(element._reportEvent.getCall(1).calledWithMatch(
          {type: 'timing-report', category: 'UI Latency',
            name: 'PluginsLoaded'}
      ));
      assert.isTrue(element._reportEvent.getCall(2).calledWithMatch(
          {type: 'lifecycle', category: 'Plugins installed'}
      ));
      assert.isTrue(element._reportEvent.getCall(3).calledWithMatch(
          {type: 'timing-report', category: 'UI Latency', name: 'bar'}
      ));
    });
  });

  test('search', () => {
    element.locationChanged('_handleSomeRoute');
    assert.isTrue(element.reporter.calledWithExactly(
        'nav-report', 'Location Changed', 'Page', '_handleSomeRoute'));
  });

  suite('exception logging', () => {
    let fakeWindow;
    let reporter;

    const emulateThrow = function(msg, url, line, column, error) {
      return fakeWindow.onerror(msg, url, line, column, error);
    };

    setup(() => {
      reporter = sandbox.stub(GrReporting.prototype, 'reporter');
      fakeWindow = {
        handlers: {},
        addEventListener(type, handler) {
          this.handlers[type] = handler;
        },
      };
      sandbox.stub(console, 'error');
      window.GrReporting._catchErrors(fakeWindow);
    });

    test('is reported', () => {
      const error = new Error('bar');
      error.stack = undefined;
      emulateThrow('bar', 'http://url', 4, 2, error);
      assert.isTrue(reporter.calledWith('error', 'exception', 'bar'));
      const payload = reporter.lastCall.args[3];
      assert.deepEqual(payload, {
        url: 'http://url',
        line: 4,
        column: 2,
        error,
      });
    });

    test('is reported with 3 lines of stack', () => {
      const error = new Error('bar');
      emulateThrow('bar', 'http://url', 4, 2, error);
      const expectedStack = error.stack.split('\n').slice(0, 3)
          .join('\n');
      assert.isTrue(reporter.calledWith('error', 'exception',
          expectedStack));
    });

    test('prevent default event handler', () => {
      assert.isTrue(emulateThrow());
    });

    test('unhandled rejection', () => {
      fakeWindow.handlers['unhandledrejection']({
        reason: {
          message: 'bar',
        },
      });
      assert.isTrue(reporter.calledWith('error', 'exception', 'bar'));
    });
  });
});
</script>
