blob: 7318ea7a970f7d951d5588f4b623361e82e1d3cb [file] [log] [blame]
// Copyright 2007 The Closure Library Authors. All Rights Reserved.
//
// 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.
goog.provide('goog.net.iframeXhrTest');
goog.setTestOnly('goog.net.iframeXhrTest');
goog.require('goog.Timer');
goog.require('goog.debug.Console');
goog.require('goog.debug.LogManager');
goog.require('goog.debug.Logger');
goog.require('goog.events');
goog.require('goog.net.IframeIo');
goog.require('goog.net.XhrIo');
goog.require('goog.testing.AsyncTestCase');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
var c = new goog.debug.Console;
c.setCapturing(true);
goog.debug.LogManager.getRoot().setLevel(goog.debug.Logger.Level.ALL);
// Can't use exportSymbol if we want JsUnit support
top.GG_iframeFn = goog.net.IframeIo.handleIncrementalData;
// Make the dispose time short enough that it will cause the bug to appear
goog.net.IframeIo.IFRAME_DISPOSE_DELAY_MS = 0;
var fileName = 'iframe_xhr_test_response.html';
var iframeio;
// Create an async test case
var testCase = new goog.testing.AsyncTestCase(document.title);
testCase.stepTimeout = 4 * 1000;
testCase.resultCount = 0;
testCase.xhrCount = 0;
testCase.error = null;
/**
* Set up the iframe io and request the test response page.
* @this {goog.testing.AsyncTestCase}
*/
testCase.setUpPage = function() {
testCase.waitForAsync('setUpPage');
iframeio = new goog.net.IframeIo();
goog.events.listen(
iframeio, 'incrementaldata', this.onIframeData, false, this);
goog.events.listen(
iframeio, 'ready', this.onIframeReady, false, this);
iframeio.send(fileName);
};
/** Disposes the iframe object. */
testCase.tearDownPage = function() {
iframeio.dispose();
};
/**
* Handles the packets received from the Iframe incremental results.
* @this {goog.testing.AsyncTestCase}
*/
testCase.onIframeData = function(e) {
this.log('Data received : ' + e.data);
this.resultCount++;
goog.net.XhrIo.send(fileName, goog.bind(this.onXhrData, this));
};
/**
* Handles the iframe becoming ready.
* @this {goog.testing.AsyncTestCase}
*/
testCase.onIframeReady = function(e) {
this.log('Iframe ready');
var me = this;
goog.net.XhrIo.send(fileName, goog.bind(this.onXhrData, this));
};
/**
* Handles the response from an Xhr request.
* @this {goog.testing.AsyncTestCase}
*/
testCase.onXhrData = function(e) {
this.xhrCount++;
// We access status directly so that XhrLite doesn't mask the error that
// would be thrown in FF if this worked correctly.
try {
this.log('Xhr Received: ' + e.target.xhr_.status);
} catch (e) {
this.log('ERROR: ' + e.message);
this.error = e;
}
if (this.xhrCount == 4 && this.resultCount == 3) {
// Wait for the async iframe disposal to fire.
this.log('Test set up finished, waiting 500ms for iframe disposal');
goog.Timer.callOnce(goog.bind(this.continueTesting, this), 0);
}
};
/** The main test function that validates the results were as expected. */
testCase.addNewTest('testResults', function() {
assertEquals('There should be 3 data packets', 3, this.resultCount);
// 3 results + 1 ready
assertEquals('There should be 4 XHR results', 4, this.xhrCount);
if (this.error) {
throw this.error;
}
assertEquals('There should be no iframes left', 0,
document.getElementsByTagName('iframe').length);
});
/** This test only runs on GECKO browsers. */
if (goog.userAgent.GECKO) {
/** Used by the JsUnit test runner. */
var testXhrMonitorWorksForIframeIoRequests = function() {
testCase.reset();
testCase.cycleTests();
};
}
// Standalone Closure Test Runner.
if (goog.userAgent.GECKO) {
G_testRunner.initialize(testCase);
} else {
G_testRunner.setStrict(false);
}