// Copyright 2017 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.

(async function() {
  TestRunner.addResult(`Tests that dataReceived is called on NetworkDispatcher for all incoming data.\n`);
  await TestRunner.loadModule('network_test_runner');
  await TestRunner.showPanel('network');
  await TestRunner.evaluateInPagePromise(`
      function loadIFrame()
      {
          var iframe = document.createElement("iframe");
          iframe.setAttribute("src", "resources/resource.php?size=50000");
          document.body.appendChild(iframe);
      }
  `);

  TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'responseReceived', responseReceived);
  TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'loadingFailed', loadingFailed);
  TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'loadingFinished', loadingFinished);
  TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'dataReceived', dataReceived);
  TestRunner.evaluateInPage('loadIFrame()');

  var encodedBytesReceived = 0;
  function responseReceived(requestId, loaderId, time, resourceType, response, frameId) {
    var request = SDK.NetworkLog.instance().requestByManagerAndId(TestRunner.networkManager, requestId);
    if (/resource\.php/.exec(request.url())) {
      TestRunner.addResult('Received response.');
      encodedBytesReceived += response.encodedDataLength;
    }
  }

  function loadingFinished(requestId, finishTime, encodedDataLength) {
    var request = SDK.NetworkLog.instance().requestByManagerAndId(TestRunner.networkManager, requestId);
    if (/resource\.php/.exec(request.url())) {
      TestRunner.assertEquals(encodedBytesReceived, encodedDataLength, 'Data length mismatch');
      TestRunner.addResult('SUCCESS');
      TestRunner.completeTest();
    }
  }

  function loadingFailed(requestId, time, localizedDescription, canceled) {
    var request = SDK.NetworkLog.instance().requestByManagerAndId(TestRunner.networkManager, requestId);
    if (/resource\.php/.exec(request.url())) {
      TestRunner.addResult('Loading failed!');
      TestRunner.completeTest();
    }
  }

  function dataReceived(requestId, time, dataLength, encodedDataLength) {
    TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'dataReceived', dataReceived);
    var request = SDK.NetworkLog.instance().requestByManagerAndId(TestRunner.networkManager, requestId);
    if (/resource\.php/.exec(request.url()))
      encodedBytesReceived += encodedDataLength;
  }
})();
