aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html1311
1 files changed, 0 insertions, 1311 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html b/contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html
deleted file mode 100644
index 1fc0c5e..0000000
--- a/contexts/data/lib/closure-library/closure/goog/net/browserchannel_test.html
+++ /dev/null
@@ -1,1311 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-Copyright 2009 The Closure Library Authors. All Rights Reserved.
-
-Use of this source code is governed by the Apache License, Version 2.0.
-See the COPYING file for details.
--->
-<!--
--->
-<head>
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<title>Closure Unit Tests - goog.net.BrowserChannel</title>
-<script src="../base.js"></script>
-<script>
- goog.require('goog.Timer');
- goog.require('goog.dom');
- goog.require('goog.functions');
- goog.require('goog.json');
- goog.require('goog.net.BrowserChannel');
- goog.require('goog.net.ChannelRequest');
- goog.require('goog.net.tmpnetwork');
- goog.require('goog.string.StringBuffer');
- goog.require('goog.structs.Map');
- goog.require('goog.testing.MockClock');
- goog.require('goog.testing.PropertyReplacer');
- goog.require('goog.testing.recordFunction');
- goog.require('goog.testing.asserts');
- goog.require('goog.testing.jsunit');
-</script>
-</head>
-<body>
-<script>
-
-/**
- * Delay between a network failure and the next network request.
- */
-var RETRY_TIME = 1000;
-
-/**
- * A really long time - used to make sure no more timeouts will fire.
- */
-var ALL_DAY_MS = 1000 * 60 * 60 * 24;
-
-var stubs = new goog.testing.PropertyReplacer();
-
-var browserChannel;
-var deliveredMaps;
-var handler;
-var mockClock;
-var gotError;
-var numStatEvents;
-var lastStatEvent;
-var numTimingEvents;
-var lastPostSize;
-var lastPostRtt;
-var lastPostRetryCount;
-
-// Set to true to see the channel debug output in the browser window.
-var debug = false;
-// Debug message to print out when debug is true.
-var debugMessage = '';
-
-function debugToWindow(message) {
- if (debug) {
- debugMessage += message + '<br>';
- goog.dom.getElement('debug').innerHTML = debugMessage;
- }
-}
-
-
-/**
- * Stubs goog.net.tmpnetwork to always time out. It maintains the
- * contract given by goog.net.tmpnetwork.testGoogleCom, but always
- * times out (calling callback(false)).
- *
- * stubTmpnetwork should be called in tests that require it before
- * a call to testGoogleCom happens. It is reset at tearDown.
- */
-function stubTmpnetwork() {
- stubs.set(goog.net.tmpnetwork, 'testLoadImage',
- function(url, timeout, callback) {
- goog.Timer.callOnce(goog.partial(callback, false), timeout);
- });
-}
-
-
-/**
- * Mock ChannelRequest.
- * @constructor
- */
-var MockChannelRequest = function(channel, channelDebug, opt_sessionId,
- opt_requestId, opt_retryId) {
- this.channel_ = channel;
- this.channelDebug_ = channelDebug;
- this.sessionId_ = opt_sessionId;
- this.requestId_ = opt_requestId;
- this.successful_ = true;
- this.lastError_ = null;
- this.lastStatusCode_ = 200;
-
- // For debugging, keep track of whether this is a back or forward channel.
- this.isBack = !!(opt_requestId == 'rpc');
- this.isForward = !this.isBack;
-};
-
-MockChannelRequest.prototype.postData_ = null;
-
-MockChannelRequest.prototype.requestStartTime_ = null;
-
-MockChannelRequest.prototype.setExtraHeaders = function(extraHeaders) {};
-
-MockChannelRequest.prototype.setTimeout = function(timeout) {};
-
-MockChannelRequest.prototype.setReadyStateChangeThrottle =
- function(throttle) {};
-
-MockChannelRequest.prototype.xmlHttpPost = function(uri, postData,
- decodeChunks) {
- this.channelDebug_.debug('---> POST: ' + uri + ', ' + postData + ', ' +
- decodeChunks);
- this.postData_ = postData;
- this.requestStartTime_ = goog.now()
-};
-
-MockChannelRequest.prototype.xmlHttpGet = function(uri, decodeChunks,
- opt_noClose) {
- this.channelDebug_.debug('<--- GET: ' + uri + ', ' + decodeChunks + ', ' +
- opt_noClose);
- this.requestStartTime_ = goog.now()
-};
-
-MockChannelRequest.prototype.tridentGet = function(uri, usingSecondaryDomain) {
- this.channelDebug_.debug('<---GET (T): ' + uri);
- this.requestStartTime_ = goog.now()
-};
-
-MockChannelRequest.prototype.sendUsingImgTag = function(uri) {
- this.requestStartTime_ = goog.now()
-};
-
-MockChannelRequest.prototype.cancel = function() {
- this.successful_ = false;
-};
-
-MockChannelRequest.prototype.getSuccess = function() {
- return this.successful_;
-};
-
-MockChannelRequest.prototype.getLastError = function() {
- return this.lastError_;
-};
-
-MockChannelRequest.prototype.getLastStatusCode = function() {
- return this.lastStatusCode_;
-};
-
-MockChannelRequest.prototype.getSessionId = function() {
- return this.sessionId_;
-};
-
-MockChannelRequest.prototype.getRequestId = function() {
- return this.requestId_;
-};
-
-MockChannelRequest.prototype.getPostData = function() {
- return this.postData_;
-};
-
-MockChannelRequest.prototype.getRequestStartTime = function() {
- return this.requestStartTime_;
-};
-
-
-function setUpPage() {
- // Use our MockChannelRequests instead of the real ones.
- goog.net.BrowserChannel.createChannelRequest = function(
- channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {
- return new MockChannelRequest(
- channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId);
- };
-
- // Mock out the stat notification code.
- goog.net.BrowserChannel.notifyStatEvent = function(stat) {
- numStatEvents++;
- lastStatEvent = stat;
- };
-
- goog.net.BrowserChannel.notifyTimingEvent = function(size, rtt, retries) {
- numTimingEvents++;
- lastPostSize = size;
- lastPostRtt = rtt;
- lastPostRetryCount = retries;
- };
-}
-
-
-function setUp() {
- numTimingEvents = 0;
- lastPostSize = null;
- lastPostRtt = null;
- lastPostRetryCount = null;
-
- mockClock = new goog.testing.MockClock(true);
- browserChannel = new goog.net.BrowserChannel('1');
- gotError = false;
-
- handler = new goog.net.BrowserChannel.Handler();
- handler.channelOpened = function() {};
- handler.channelError = function(channel, error) {
- gotError = true;
- };
- handler.channelSuccess = function(channel, maps) {
- deliveredMaps = goog.array.clone(maps);
- };
- handler.channelClosed = function(
- channel, opt_pendingMaps, opt_undeliveredMaps) {
- // Mock out the handler, and let it set a formatted user readable string
- // of the undelivered maps which we can use when verifying our assertions.
- if (opt_pendingMaps) {
- this.pendingMapsString = formatArrayOfMaps(opt_pendingMaps);
- }
- if (opt_undeliveredMaps) {
- this.undeliveredMapsString = formatArrayOfMaps(opt_undeliveredMaps);
- }
- };
- handler.channelHandleMultipleArrays = function() {};
- handler.channelHandleArray = function() {};
-
- browserChannel.setHandler(handler);
-
- // Provide a predictable retry time for testing.
- browserChannel.getRetryTime_ = function(retryCount) {
- return RETRY_TIME;
- };
-
- var channelDebug = new goog.net.ChannelDebug();
- channelDebug.debug = function(message) {
- debugToWindow(message);
- };
- browserChannel.setChannelDebug(channelDebug);
-
- numStatEvents = 0;
- lastStatEvent = null;
-}
-
-
-function tearDown() {
- mockClock.dispose();
- stubs.reset();
- debugToWindow('<hr>');
-}
-
-
-/**
- * Helper function to return a formatted string representing an array of maps.
- */
-function formatArrayOfMaps(arrayOfMaps) {
- var result = [];
- for (var i = 0; i < arrayOfMaps.length; i++) {
- var map = arrayOfMaps[i];
- var keys = map.map.getKeys();
- for (var j = 0; j < keys.length; j++) {
- var tmp = keys[j] + ':' + map.map.get(keys[j]) + (map.context ?
- ':' + map.context : '');
- result.push(tmp);
- }
- }
- return result.join(', ');
-}
-
-
-function testFormatArrayOfMaps() {
- // This function is used in a non-trivial test, so let's verify that it works.
- var map1 = new goog.structs.Map();
- map1.set('k1', 'v1');
- map1.set('k2', 'v2');
- var map2 = new goog.structs.Map();
- map2.set('k3', 'v3');
- var map3 = new goog.structs.Map();
- map3.set('k4', 'v4');
- map3.set('k5', 'v5');
- map3.set('k6', 'v6');
-
- // One map.
- var a = [];
- a.push(new goog.net.BrowserChannel.QueuedMap(0, map1));
- assertEquals('k1:v1, k2:v2',
- formatArrayOfMaps(a));
-
- // Many maps.
- var b = [];
- b.push(new goog.net.BrowserChannel.QueuedMap(0, map1));
- b.push(new goog.net.BrowserChannel.QueuedMap(0, map2));
- b.push(new goog.net.BrowserChannel.QueuedMap(0, map3));
- assertEquals('k1:v1, k2:v2, k3:v3, k4:v4, k5:v5, k6:v6',
- formatArrayOfMaps(b));
-
- // One map with a context.
- var c = [];
- c.push(new goog.net.BrowserChannel.QueuedMap(0, map1, 'c1'));
- assertEquals('k1:v1:c1, k2:v2:c1',
- formatArrayOfMaps(c));
-}
-
-
-function connectForwardChannel(
- opt_serverVersion, opt_hostPrefix, opt_uriPrefix) {
- var uriPrefix = opt_uriPrefix || '';
- browserChannel.connect(uriPrefix + '/test', uriPrefix + '/bind', null);
- mockClock.tick(0);
- completeTestConnection();
- completeForwardChannel(opt_serverVersion, opt_hostPrefix);
-}
-
-
-function connect(opt_serverVersion, opt_hostPrefix, opt_uriPrefix) {
- connectForwardChannel(opt_serverVersion, opt_hostPrefix, opt_uriPrefix);
- completeBackChannel();
-}
-
-
-function disconnect() {
- browserChannel.disconnect();
- mockClock.tick(0);
-}
-
-
-function completeTestConnection() {
- completeForwardTestConnection();
- completeBackTestConnection();
- assertEquals(goog.net.BrowserChannel.State.OPENING,
- browserChannel.getState());
-}
-
-
-function completeForwardTestConnection() {
- browserChannel.connectionTest_.onRequestData(
- browserChannel.connectionTest_,
- '["b"]');
- browserChannel.connectionTest_.onRequestComplete(
- browserChannel.connectionTest_);
- mockClock.tick(0);
-}
-
-
-function completeBackTestConnection() {
- browserChannel.connectionTest_.onRequestData(
- browserChannel.connectionTest_,
- '11111');
- mockClock.tick(0);
-}
-
-
-function completeForwardChannel(opt_serverVersion, opt_hostPrefix) {
- var responseData = '[[0,["c","1234567890ABCDEF",' +
- (opt_hostPrefix ? '"' + opt_hostPrefix + '"' : 'null') +
- (opt_serverVersion ? ',' + opt_serverVersion : '') +
- ']]]';
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- responseData);
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function completeBackChannel() {
- browserChannel.onRequestData(
- browserChannel.backChannelRequest_,
- '[[1,["foo"]]]');
- browserChannel.onRequestComplete(
- browserChannel.backChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function responseVersion7() {
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- goog.net.BrowserChannel.MAGIC_RESPONSE_COOKIE);
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-function responseNoBackchannel(lastArrayIdSentFromServer, outstandingDataSize) {
- responseData = goog.json.serialize(
- [0, lastArrayIdSentFromServer, outstandingDataSize]);
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- responseData);
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-function response(lastArrayIdSentFromServer, outstandingDataSize) {
- responseData = goog.json.serialize(
- [1, lastArrayIdSentFromServer, outstandingDataSize]);
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- responseData
- );
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function receive(data) {
- browserChannel.onRequestData(
- browserChannel.backChannelRequest_,
- '[[1,' + data + ']]');
- browserChannel.onRequestComplete(
- browserChannel.backChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function responseTimeout() {
- browserChannel.forwardChannelRequest_lastError_ =
- goog.net.ChannelRequest.Error.TIMEOUT;
- browserChannel.forwardChannelRequest_.successful_ = false;
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function responseRequestFailed(opt_statusCode) {
- browserChannel.forwardChannelRequest_.lastError_ =
- goog.net.ChannelRequest.Error.STATUS;
- browserChannel.forwardChannelRequest_.lastStatusCode_ =
- opt_statusCode || 503;
- browserChannel.forwardChannelRequest_.successful_ = false;
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function responseUnknownSessionId() {
- browserChannel.forwardChannelRequest_.lastError_ =
- goog.net.ChannelRequest.Error.UNKNOWN_SESSION_ID;
- browserChannel.forwardChannelRequest_.successful_ = false;
- browserChannel.onRequestComplete(
- browserChannel.forwardChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function responseActiveXBlocked() {
- browserChannel.backChannelRequest_.lastError_ =
- goog.net.ChannelRequest.Error.ACTIVE_X_BLOCKED;
- browserChannel.backChannelRequest_.successful_ = false;
- browserChannel.onRequestComplete(
- browserChannel.backChannelRequest_);
- mockClock.tick(0);
-}
-
-
-function sendMap(key, value, opt_context) {
- var map = new goog.structs.Map();
- map.set(key, value);
- browserChannel.sendMap(map, opt_context);
- mockClock.tick(0);
-}
-
-
-function hasForwardChannel() {
- return !!browserChannel.forwardChannelRequest_;
-}
-
-
-function hasBackChannel() {
- return !!browserChannel.backChannelRequest_;
-}
-
-
-function hasDeadBackChannelTimer() {
- return goog.isDefAndNotNull(browserChannel.deadBackChannelTimerId_);
-};
-
-
-function assertHasForwardChannel() {
- assertTrue('Forward channel missing.', hasForwardChannel());
-}
-
-
-function assertHasBackChannel() {
- assertTrue('Back channel missing.', hasBackChannel());
-}
-
-
-function testConnect() {
- connect();
- assertEquals(goog.net.BrowserChannel.State.OPENED,
- browserChannel.getState());
- // If the server specifies no version, the client assumes 6
- assertEquals(6, browserChannel.channelVersion_);
- assertFalse(browserChannel.isBuffered());
-}
-
-function testConnect_backChannelEstablished() {
- connect();
- assertHasBackChannel();
-}
-
-function testConnect_withServerHostPrefix() {
- connect(undefined, 'serverHostPrefix');
- assertEquals('serverHostPrefix', browserChannel.hostPrefix_);
-}
-
-function testConnect_withClientHostPrefix() {
- handler.correctHostPrefix = function(hostPrefix) {
- return 'clientHostPrefix';
- }
- connect();
- assertEquals('clientHostPrefix', browserChannel.hostPrefix_);
-}
-
-function testConnect_overrideServerHostPrefix() {
- handler.correctHostPrefix = function(hostPrefix) {
- return 'clientHostPrefix';
- }
- connect(undefined, 'serverHostPrefix');
- assertEquals('clientHostPrefix', browserChannel.hostPrefix_);
-}
-
-function testConnect_withServerVersion() {
- connect(8);
- assertEquals(8, browserChannel.channelVersion_);
-}
-
-function testConnect_notOkToMakeRequestForTest() {
- handler.okToMakeRequest =
- goog.functions.constant(goog.net.BrowserChannel.Error.NETWORK);
- browserChannel.connect('/test', '/bind', null);
- mockClock.tick(0);
- assertEquals(goog.net.BrowserChannel.State.CLOSED, browserChannel.getState());
-}
-
-function testConnect_notOkToMakeRequestForBind() {
- browserChannel.connect('/test', '/bind', null);
- mockClock.tick(0);
- completeTestConnection();
- handler.okToMakeRequest =
- goog.functions.constant(goog.net.BrowserChannel.Error.NETWORK);
- completeForwardChannel();
- assertEquals(goog.net.BrowserChannel.State.CLOSED, browserChannel.getState());
-}
-
-
-function testSendMap() {
- connect();
- assertEquals(1, numTimingEvents);
- sendMap('foo', 'bar');
- responseVersion7();
- assertEquals(2, numTimingEvents);
- assertEquals('foo:bar', formatArrayOfMaps(deliveredMaps));
-}
-
-
-function testSendMap_twice() {
- connect();
- sendMap('foo1', 'bar1');
- responseVersion7();
- assertEquals('foo1:bar1', formatArrayOfMaps(deliveredMaps));
- sendMap('foo2', 'bar2');
- responseVersion7();
- assertEquals('foo2:bar2', formatArrayOfMaps(deliveredMaps));
-}
-
-
-function testSendMap_andReceive() {
- connect();
- sendMap('foo', 'bar');
- responseVersion7();
- receive('["the server reply"]');
-}
-
-
-function testReceive() {
- connect();
- receive('["message from server"]');
- assertHasBackChannel();
-}
-
-
-function testReceive_twice() {
- connect();
- receive('["message one from server"]');
- receive('["message two from server"]');
- assertHasBackChannel();
-}
-
-
-function testReceive_andSendMap() {
- connect();
- receive('["the server reply"]');
- sendMap('foo', 'bar');
- responseVersion7();
- assertHasBackChannel();
-}
-
-
-function testBackChannelRemainsEstablished_afterSingleSendMap() {
- connect();
-
- sendMap('foo', 'bar');
- responseVersion7();
- receive('["ack"]');
-
- assertHasBackChannel();
-}
-
-
-function testBackChannelRemainsEstablished_afterDoubleSendMap() {
- connect();
-
- sendMap('foo1', 'bar1');
- sendMap('foo2', 'bar2');
- responseVersion7();
- receive('["ack"]');
-
- // This assertion would fail prior to CL 13302660.
- assertHasBackChannel();
-}
-
-
-function testTimingEvent(){
- connect();
- assertEquals(1, numTimingEvents);
- sendMap('', '');
- assertEquals(1, numTimingEvents);
- mockClock.tick(20);
- var expSize = browserChannel.forwardChannelRequest_.getPostData().length;
- responseVersion7();
-
- assertEquals(2, numTimingEvents);
- assertEquals(expSize, lastPostSize);
- assertEquals(20, lastPostRtt);
- assertEquals(0, lastPostRetryCount);
-
- sendMap('abcdefg', '123456');
- expSize = browserChannel.forwardChannelRequest_.getPostData().length;
- responseTimeout();
- assertEquals(2, numTimingEvents);
- mockClock.tick(RETRY_TIME + 1);
- responseVersion7();
- assertEquals(3, numTimingEvents);
- assertEquals(expSize, lastPostSize);
- assertEquals(1, lastPostRetryCount);
- assertEquals(1, lastPostRtt);
-
-}
-
-
-/**
- * Make sure that dropping the forward channel retry limit below the retry count
- * reports an error, and prevents another request from firing.
- */
-function testSetFailFastWhileWaitingForRetry() {
- stubTmpnetwork();
-
- connect();
- assertEquals(1, numTimingEvents);
-
- sendMap('foo', 'bar');
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
-
- // Watchdog timeout.
- responseTimeout();
- assertNotNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
-
- // Almost finish the between-retry timeout.
- mockClock.tick(RETRY_TIME - 1);
- assertNotNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
-
- // Setting max retries to 0 should cancel the timer and raise an error.
- browserChannel.setFailFast(true);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
-
- assertTrue(gotError);
- assertEquals(0, deliveredMaps.length);
- // We get the error immediately before starting to ping google.com.
- // Simulate that timing out. We should get a network error in addition to the
- // initial failure.
- gotError = false;
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
- assertTrue('No error after tmpnetwork ping timed out.', gotError);
-
- // Make sure no more retry timers are firing.
- mockClock.tick(ALL_DAY_MS);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
- assertEquals(1, numTimingEvents);
-}
-
-
-/**
- * Make sure that dropping the forward channel retry limit below the retry count
- * reports an error, and prevents another request from firing.
- */
-function testSetFailFastWhileRetryXhrIsInFlight() {
- stubTmpnetwork();
-
- connect();
- assertEquals(1, numTimingEvents);
-
- sendMap('foo', 'bar');
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
-
- // Watchdog timeout.
- responseTimeout();
- assertNotNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
-
- // Wait for the between-retry timeout.
- mockClock.tick(RETRY_TIME);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(1, browserChannel.forwardChannelRetryCount_);
-
- // Simulate a second watchdog timeout.
- responseTimeout();
- assertNotNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(2, browserChannel.forwardChannelRetryCount_);
-
- // Wait for another between-retry timeout.
- mockClock.tick(RETRY_TIME);
- // Now the third req is in flight.
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(2, browserChannel.forwardChannelRetryCount_);
-
- // Set fail fast, killing the request
- browserChannel.setFailFast(true);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(2, browserChannel.forwardChannelRetryCount_);
-
- assertTrue(gotError);
- // We get the error immediately before starting to ping google.com.
- // Simulate that timing out. We should get a network error in addition to the
- gotError = false;
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
- assertTrue('No error after tmpnetwork ping timed out.', gotError);
-
- // Make sure no more retry timers are firing.
- mockClock.tick(ALL_DAY_MS);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(2, browserChannel.forwardChannelRetryCount_);
- assertEquals(1, numTimingEvents);
-}
-
-
-/**
- * Makes sure that setting fail fast while not retrying doesn't cause a failure.
- */
-function testSetFailFastAtRetryCount() {
- stubTmpnetwork();
-
- connect();
- assertEquals(1, numTimingEvents);
-
- sendMap('foo', 'bar');
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
-
- // Set fail fast.
- browserChannel.setFailFast(true);
- // Request should still be alive.
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNotNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
-
- // Watchdog timeout. Now we should get an error.
- responseTimeout();
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
-
- assertTrue(gotError);
- // We get the error immediately before starting to ping google.com.
- // Simulate that timing out. We should get a network error in addition to the
- // initial failure.
- gotError = false;
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
- assertTrue('No error after tmpnetwork ping timed out.', gotError);
-
- // Make sure no more retry timers are firing.
- mockClock.tick(ALL_DAY_MS);
- assertNull(browserChannel.forwardChannelTimerId_);
- assertNull(browserChannel.forwardChannelRequest_);
- assertEquals(0, browserChannel.forwardChannelRetryCount_);
- assertEquals(1, numTimingEvents);
-}
-
-
-function testRequestFailedClosesChannel() {
- stubTmpnetwork();
-
- connect();
- assertEquals(1, numTimingEvents);
-
- sendMap('foo', 'bar');
- responseRequestFailed();
-
- assertEquals('Should be closed immediately after request failed.',
- goog.net.BrowserChannel.State.CLOSED, browserChannel.getState());
-
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
-
- assertEquals('Should remain closed after the ping timeout.',
- goog.net.BrowserChannel.State.CLOSED, browserChannel.getState());
- assertEquals(1, numTimingEvents);
-}
-
-
-function testStatEventReportedOnlyOnce() {
- stubTmpnetwork();
-
- connect();
- sendMap('foo', 'bar');
- numStatEvents = 0;
- lastStatEvent = null;
- responseUnknownSessionId();
-
- assertEquals(1, numStatEvents);
- assertEquals(goog.net.BrowserChannel.Stat.ERROR_OTHER, lastStatEvent);
-
- numStatEvents = 0;
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
- assertEquals('No new stat events should be reported.', 0, numStatEvents);
-}
-
-
-function testActiveXBlockedEventReportedOnlyOnce() {
- stubTmpnetwork();
-
- connectForwardChannel();
- numStatEvents = 0;
- lastStatEvent = null;
- responseActiveXBlocked();
-
- assertEquals(1, numStatEvents);
- assertEquals(goog.net.BrowserChannel.Stat.ERROR_OTHER, lastStatEvent);
-
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
- assertEquals('No new stat events should be reported.', 1, numStatEvents);
-}
-
-
-function testStatEventReportedOnlyOnce_onNetworkUp() {
- stubTmpnetwork();
-
- connect();
- sendMap('foo', 'bar');
- numStatEvents = 0;
- lastStatEvent = null;
- responseRequestFailed();
-
- assertEquals('No stat event should be reported before we know the reason.',
- 0, numStatEvents);
-
- // Let the ping time out.
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
-
- // Assert we report the correct stat event.
- assertEquals(1, numStatEvents);
- assertEquals(goog.net.BrowserChannel.Stat.ERROR_NETWORK, lastStatEvent);
-}
-
-
-function testStatEventReportedOnlyOnce_onNetworkDown() {
- stubTmpnetwork();
-
- connect();
- sendMap('foo', 'bar');
- numStatEvents = 0;
- lastStatEvent = null;
- responseRequestFailed();
-
- assertEquals('No stat event should be reported before we know the reason.',
- 0, numStatEvents);
-
- // Wait half the ping timeout period, and then fake the network being up.
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT / 2);
- browserChannel.testGoogleComCallback_(true);
-
- // Assert we report the correct stat event.
- assertEquals(1, numStatEvents);
- assertEquals(goog.net.BrowserChannel.Stat.ERROR_OTHER, lastStatEvent);
-}
-
-
-function testOutgoingMapsAwaitsResponse() {
- connect();
- assertEquals(0, browserChannel.outgoingMaps_.length);
-
- sendMap('foo1', 'bar');
- assertEquals(0, browserChannel.outgoingMaps_.length);
- sendMap('foo2', 'bar');
- assertEquals(1, browserChannel.outgoingMaps_.length);
- sendMap('foo3', 'bar');
- assertEquals(2, browserChannel.outgoingMaps_.length);
- sendMap('foo4', 'bar');
- assertEquals(3, browserChannel.outgoingMaps_.length);
-
- responseVersion7();
- // Now the forward channel request is completed and a new started, so all maps
- // are dequeued from the array of outgoing maps into this new forward request.
- assertEquals(0, browserChannel.outgoingMaps_.length);
-}
-
-
-function testUndeliveredMaps_doesNotNotifyWhenSuccessful() {
- handler.channelClosed = function(
- channel, opt_pendingMaps, opt_undeliveredMaps) {
- if (opt_pendingMaps || opt_undeliveredMaps) {
- fail('No pending or undelivered maps should be reported.');
- }
- };
-
- connect();
- sendMap('foo1', 'bar1');
- responseVersion7();
- sendMap('foo2', 'bar2');
- responseVersion7();
- disconnect();
-}
-
-
-function testUndeliveredMaps_doesNotNotifyIfNothingWasSent() {
- handler.channelClosed = function(
- channel, opt_pendingMaps, opt_undeliveredMaps) {
- if (opt_pendingMaps || opt_undeliveredMaps) {
- fail('No pending or undelivered maps should be reported.');
- }
- };
-
- connect();
- mockClock.tick(ALL_DAY_MS);
- disconnect();
-}
-
-
-function testUndeliveredMaps_clearsPendingMapsAfterNotifying() {
- connect();
- sendMap('foo1', 'bar1');
- sendMap('foo2', 'bar2');
- sendMap('foo3', 'bar3');
-
- assertEquals(1, browserChannel.pendingMaps_.length);
- assertEquals(2, browserChannel.outgoingMaps_.length);
-
- disconnect();
-
- assertEquals(0, browserChannel.pendingMaps_.length);
- assertEquals(0, browserChannel.outgoingMaps_.length);
-}
-
-
-function testUndeliveredMaps_notifiesWithContext() {
- connect();
-
- // First send two messages that succeed.
- sendMap('foo1', 'bar1', 'context1');
- responseVersion7();
- sendMap('foo2', 'bar2', 'context2');
- responseVersion7();
-
- // Pretend the server hangs and no longer responds.
- sendMap('foo3', 'bar3', 'context3');
- sendMap('foo4', 'bar4', 'context4');
- sendMap('foo5', 'bar5', 'context5');
-
- // Give up.
- disconnect();
-
- // Assert that we are informed of any undelivered messages; both about
- // #3 that was sent but which we don't know if the server received, and
- // #4 and #5 which remain in the outgoing maps and have not yet been sent.
- assertEquals('foo3:bar3:context3', handler.pendingMapsString);
- assertEquals('foo4:bar4:context4, foo5:bar5:context5',
- handler.undeliveredMapsString);
-}
-
-
-function testUndeliveredMaps_serviceUnavailable() {
- // Send a few maps, and let one fail.
- connect();
- sendMap('foo1', 'bar1');
- responseVersion7();
- sendMap('foo2', 'bar2');
- responseRequestFailed();
-
- // After a failure, the channel should be closed.
- disconnect();
-
- assertEquals('foo2:bar2', handler.pendingMapsString);
- assertEquals('', handler.undeliveredMapsString);
-}
-
-
-function testUndeliveredMaps_onPingTimeout() {
- stubTmpnetwork();
-
- connect();
-
- // Send a message.
- sendMap('foo1', 'bar1');
-
- // Fake REQUEST_FAILED, triggering a ping to check the network.
- responseRequestFailed();
-
- // Let the ping time out, unsuccessfully.
- mockClock.tick(goog.net.tmpnetwork.GOOGLECOM_TIMEOUT);
-
- // Assert channel is closed.
- assertEquals(goog.net.BrowserChannel.State.CLOSED,
- browserChannel.getState());
-
- // Assert that the handler is notified about the undelivered messages.
- assertEquals('foo1:bar1', handler.pendingMapsString);
- assertEquals('', handler.undeliveredMapsString);
-}
-
-
-function testResponseNoBackchannelPostNotBeforeBackchannel() {
- connect(8);
- sendMap('foo1', 'bar1');
-
- mockClock.tick(10);
- assertFalse(browserChannel.backChannelRequest_.getRequestStartTime() <
- browserChannel.forwardChannelRequest_.getRequestStartTime());
- responseNoBackchannel();
- assertNotEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_MISSING,
- lastStatEvent);
-}
-
-
-function testResponseNoBackchannel() {
- connect(8);
- sendMap('foo1', 'bar1');
- response(-1, 0);
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE + 1);
- sendMap('foo2', 'bar2');
- assertTrue(browserChannel.backChannelRequest_.getRequestStartTime() +
- goog.net.BrowserChannel.RTT_ESTIMATE <
- browserChannel.forwardChannelRequest_.getRequestStartTime());
- responseNoBackchannel();
- assertEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_MISSING, lastStatEvent);
-}
-
-
-function testResponseNoBackchannelWithNoBackchannel() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertNull(browserChannel.backChannelTimerId_);
- browserChannel.backChannelRequest_.cancel();
- browserChannel.backChannelRequest_ = null;
- responseNoBackchannel();
- assertEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_MISSING, lastStatEvent);
-}
-
-
-function testResponseNoBackchannelWithStartTimer() {
- connect(8);
- sendMap('foo1', 'bar1');
-
- browserChannel.backChannelRequest_.cancel();
- browserChannel.backChannelRequest_ = null;
- browserChannel.backChannelTimerId_ = 123;
- responseNoBackchannel();
- assertNotEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_MISSING,
- lastStatEvent);
-}
-
-
-function testResponseWithNoArraySent() {
- connect(8);
- sendMap('foo1', 'bar1');
-
- // Send a response as if the server hasn't sent down an array.
- response(-1, 0);
-
- // POST response with an array ID lower than our last received is OK.
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-}
-
-
-function testResponseWithArraysMissing() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-
- // Send a response as if the server has sent down seven arrays.
- response(7, 111);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE * 2);
- assertEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD, lastStatEvent);
-}
-
-
-function testMultipleResponsesWithArraysMissing() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-
- // Send a response as if the server has sent down seven arrays.
- response(7, 111);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- sendMap('foo2', 'bar2');
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE);
- response(8, 119);
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE);
- // The original timer should still fire.
- assertEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD, lastStatEvent);
-}
-
-
-function testOnlyRetryOnceBasedOnResponse() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-
- // Send a response as if the server has sent down seven arrays.
- response(7, 111);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- assertTrue(hasDeadBackChannelTimer());
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE * 2);
- assertEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD, lastStatEvent);
- assertEquals(1, browserChannel.backChannelRetryCount_);
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE);
- sendMap('foo2', 'bar2');
- assertFalse(hasDeadBackChannelTimer());
- response(8, 119);
- assertFalse(hasDeadBackChannelTimer());
-}
-
-
-function testResponseWithArraysMissingAndLiveChannel() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-
- // Send a response as if the server has sent down seven arrays.
- response(7, 111);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE);
- assertTrue(hasDeadBackChannelTimer());
- receive('["ack"]');
- assertFalse(hasDeadBackChannelTimer());
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE);
- assertNotEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD, lastStatEvent);
-}
-
-
-function testResponseWithBigOutstandingData() {
- connect(8);
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
-
- // Send a response as if the server has sent down seven arrays and 50kbytes.
- response(7, 50000);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- assertFalse(hasDeadBackChannelTimer());
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE * 2);
- assertNotEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD,
- lastStatEvent);
-}
-
-
-function testResponseInBufferedMode() {
- connect(8);
- browserChannel.useChunked_ = false;
- sendMap('foo1', 'bar1');
- assertEquals(-1, browserChannel.lastPostResponseArrayId_);
- response(7, 111);
-
- assertEquals(1, browserChannel.lastArrayId_);
- assertEquals(7, browserChannel.lastPostResponseArrayId_);
- assertFalse(hasDeadBackChannelTimer());
- mockClock.tick(goog.net.BrowserChannel.RTT_ESTIMATE * 2);
- assertNotEquals(goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD,
- lastStatEvent);
-}
-
-
-function testResponseWithGarbage() {
- connect(8);
- sendMap('foo1', 'bar1');
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- 'garbage'
- );
- assertEquals(goog.net.BrowserChannel.State.CLOSED,
- browserChannel.getState());
-}
-
-
-function testResponseWithGarbageInArray() {
- connect(8);
- sendMap('foo1', 'bar1');
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- '["garbage"]'
- );
- assertEquals(goog.net.BrowserChannel.State.CLOSED,
- browserChannel.getState());
-}
-
-
-function testResponseWithEvilData() {
- connect(8);
- sendMap('foo1', 'bar1');
- browserChannel.onRequestData(
- browserChannel.forwardChannelRequest_,
- goog.net.BrowserChannel.LAST_ARRAY_ID_RESPONSE_PREFIX +
- '=<script>evil()\<\/script>&' +
- goog.net.BrowserChannel.OUTSTANDING_DATA_RESPONSE_PREFIX +
- '=<script>moreEvil()\<\/script>');
- assertEquals(goog.net.BrowserChannel.State.CLOSED,
- browserChannel.getState());
-}
-
-
-function testPathAbsolute() {
- connect(8, undefined, '/talkgadget');
- assertEquals(browserChannel.backChannelUri_.getDomain(),
- window.location.hostname);
- assertEquals(browserChannel.forwardChannelUri_.getDomain(),
- window.location.hostname);
-}
-
-
-function testPathRelative() {
- connect(8, undefined, 'talkgadget');
- assertEquals(browserChannel.backChannelUri_.getDomain(),
- window.location.hostname);
- assertEquals(browserChannel.forwardChannelUri_.getDomain(),
- window.location.hostname);
-}
-
-
-function testPathWithHost() {
- connect(8, undefined, 'https://example.com');
- assertEquals(browserChannel.backChannelUri_.getScheme(), 'https');
- assertEquals(browserChannel.backChannelUri_.getDomain(), 'example.com');
- assertEquals(browserChannel.forwardChannelUri_.getScheme(), 'https');
- assertEquals(browserChannel.forwardChannelUri_.getDomain(), 'example.com');
-}
-
-function testSetParser() {
- var recordUnsafeParse = goog.testing.recordFunction(
- goog.json.unsafeParse);
- var parser = {};
- parser.parse = recordUnsafeParse;
- browserChannel.setParser(parser);
-
- connect();
- assertEquals(3, recordUnsafeParse.getCallCount());
-
- var call3 = recordUnsafeParse.popLastCall();
- var call2 = recordUnsafeParse.popLastCall();
- var call1 = recordUnsafeParse.popLastCall();
-
- assertEquals(1, call1.getArguments().length);
- assertEquals('["b"]', call1.getArgument(0));
-
- assertEquals(1, call2.getArguments().length);
- assertEquals('[[0,["c","1234567890ABCDEF",null]]]', call2.getArgument(0));
-
- assertEquals(1, call3.getArguments().length);
- assertEquals('[[1,["foo"]]]', call3.getArgument(0));
-}
-
-</script>
-<div id="debug" style="font-size: small"></div>
-</body>
-</html>