sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
284 lines (243 loc) • 10.1 kB
HTML
<html>
<!--
Copyright 2010 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>
<title>
Closure Unit Tests - goog.messaging.BufferedChannel
</title>
<script src="../base.js"></script>
<script>
goog.require('goog.debug.Console');
goog.require('goog.dom');
goog.require('goog.events.Event');
goog.require('goog.log');
goog.require('goog.messaging.BufferedChannel');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.MockControl');
goog.require('goog.testing.async.MockControl');
goog.require('goog.testing.jsunit');
goog.require('goog.testing.messaging.MockMessageChannel');
</script>
</head>
<body>
<script>
if (goog.global.console) new goog.debug.Console().setCapturing(true);
var clock = new goog.testing.MockClock();
var messages = [
{serviceName: 'firstService', payload: 'firstPayload'},
{serviceName: 'secondService', payload: 'secondPayload'}
];
var mockControl = new goog.testing.MockControl();
var asyncMockControl = new goog.testing.async.MockControl(mockControl);
function setUpPage() {
var logger = goog.log.getLogger('goog.messaging');
logger.setLevel(goog.log.Level.ALL);
goog.log.addHandler(logger, function(logRecord) {
var msg = goog.dom.createDom('div');
msg.innerHTML = logRecord.getMessage();
goog.dom.appendChild(goog.dom.getElement('debug-div'), msg);
});
}
function setUp() {
clock.install();
}
function tearDown() {
clock.uninstall();
mockControl.$tearDown();
}
function assertMessageArraysEqual(ma1, ma2) {
assertEquals('message array lengths differ', ma1.length, ma2.length);
for (var i = 0; i < ma1.length; i++) {
assertEquals(
'message array serviceNames differ',
ma1[i].serviceName, ma2[i].serviceName);
assertEquals(
'message array payloads differ',
ma1[i].payload, ma2[i].payload);
}
}
function testDelegationToWrappedChannel() {
var mockChannel = new goog.testing.messaging.MockMessageChannel(mockControl);
var channel = new goog.messaging.BufferedChannel(mockChannel);
channel.registerDefaultService(
asyncMockControl.asyncAssertEquals(
'default service should be delegated',
'defaultServiceName', 'default service payload'));
channel.registerService(
'normalServiceName',
asyncMockControl.asyncAssertEquals(
'normal service should be delegated',
'normal service payload'));
mockChannel.send(
goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':message',
'payload');
mockControl.$replayAll();
channel.peerReady_ = true; // Prevent buffering so we delegate send calls.
mockChannel.receive(
goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':defaultServiceName',
'default service payload');
mockChannel.receive(
goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':normalServiceName',
'normal service payload');
channel.send('message', 'payload');
mockControl.$verifyAll();
}
function testOptionalConnectCallbackExecutes() {
var mockChannel = new goog.testing.messaging.MockMessageChannel(mockControl);
var channel = new goog.messaging.BufferedChannel(mockChannel);
var mockConnectCb = mockControl.createFunctionMock('mockConnectCb');
mockConnectCb();
mockControl.$replayAll();
channel.connect(mockConnectCb);
mockControl.$verifyAll();
}
function testSendExceptionsInSendReadyPingStopsTimerAndReraises() {
var mockChannel = new goog.testing.messaging.MockMessageChannel(mockControl);
var channel = new goog.messaging.BufferedChannel(mockChannel);
var errorMessage = 'errorMessage';
mockChannel.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':' +
goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_,
/* payload */ '').$throws(Error(errorMessage));
channel.timer_.enabled = true;
mockControl.$replayAll();
var exception = assertThrows(function() {
channel.sendReadyPing_();
});
assertContains(errorMessage, exception.message);
assertFalse(channel.timer_.enabled);
mockControl.$verifyAll();
}
function testPollingIntervalDefaultAndOverride() {
var mockChannel = new goog.testing.messaging.MockMessageChannel(mockControl);
var channel = new goog.messaging.BufferedChannel(mockChannel);
assertEquals(
goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_,
channel.timer_.getInterval());
var interval = 100;
var longIntervalChannel = new goog.messaging.BufferedChannel(
new goog.testing.messaging.MockMessageChannel(mockControl), interval);
assertEquals(interval, longIntervalChannel.timer_.getInterval());
}
function testBidirectionalCommunicationBuffersUntilReadyPingsSucceed() {
var mockChannel1 = new goog.testing.messaging.MockMessageChannel(mockControl);
var mockChannel2 = new goog.testing.messaging.MockMessageChannel(mockControl);
var bufferedChannel1 = new goog.messaging.BufferedChannel(mockChannel1);
var bufferedChannel2 = new goog.messaging.BufferedChannel(mockChannel2);
mockChannel1.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'').$does(function() {
bufferedChannel2.setPeerReady_('');
});
mockChannel2.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel1.setPeerReady_('1');
});
mockChannel1.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel2.setPeerReady_('1');
});
mockChannel1.send(goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':' +
messages[0].serviceName,
messages[0].payload);
mockChannel2.send(goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':' +
messages[1].serviceName,
messages[1].payload);
mockControl.$replayAll();
bufferedChannel1.send(messages[0].serviceName, messages[0].payload);
bufferedChannel2.send(messages[1].serviceName, messages[1].payload);
assertMessageArraysEqual([messages[0]], bufferedChannel1.buffer_);
assertMessageArraysEqual([messages[1]], bufferedChannel2.buffer_);
// First tick causes setPeerReady_ to fire, which in turn flushes the buffers.
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
assertEquals(bufferedChannel1.buffer_, null);
assertEquals(bufferedChannel2.buffer_, null);
// Now that peers are ready, a second tick causes no more sends.
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
mockControl.$verifyAll();
}
function testBidirectionalCommunicationReconnectsAfterOneSideRestarts() {
var mockChannel1 = new goog.testing.messaging.MockMessageChannel(mockControl);
var mockChannel2 = new goog.testing.messaging.MockMessageChannel(mockControl);
var mockChannel3 = new goog.testing.messaging.MockMessageChannel(mockControl);
var bufferedChannel1 = new goog.messaging.BufferedChannel(mockChannel1);
var bufferedChannel2 = new goog.messaging.BufferedChannel(mockChannel2);
var bufferedChannel3 = new goog.messaging.BufferedChannel(mockChannel3);
// First tick
mockChannel1.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'').$does(function() {
bufferedChannel2.setPeerReady_('');
});
mockChannel2.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel1.setPeerReady_('1');
});
mockChannel1.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel2.setPeerReady_('1');
});
mockChannel3.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
''); // pretend it's not ready to connect yet
// Second tick
mockChannel3.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'').$does(function() {
bufferedChannel1.setPeerReady_('');
});
// Third tick
mockChannel1.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel3.setPeerReady_('1');
});
mockChannel3.send(
goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ + ':setPeerReady_',
'1').$does(function() {
bufferedChannel1.setPeerReady_('1');
});
mockChannel1.send(goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':' +
messages[0].serviceName,
messages[0].payload);
mockChannel3.send(goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ + ':' +
messages[1].serviceName,
messages[1].payload);
mockControl.$replayAll();
// First tick causes setPeerReady_ to fire, which sets up the connection
// between channels 1 and 2.
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
assertTrue(bufferedChannel1.peerReady_);
assertTrue(bufferedChannel2.peerReady_);
// Now pretend that channel 2 went down and was replaced by channel 3, which
// is trying to connect with channel 1.
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
assertTrue(bufferedChannel1.peerReady_);
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
assertTrue(bufferedChannel3.peerReady_);
bufferedChannel1.send(messages[0].serviceName, messages[0].payload);
bufferedChannel3.send(messages[1].serviceName, messages[1].payload);
// All timers stopped, nothing happens on the fourth tick.
clock.tick(goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);
mockControl.$verifyAll();
}
</script>
<div id="debug-container"
style="border: 1px solid black; font-size: small; font-family: courier;">
Debug Window
[<a href="#"
onclick="document.getElementById('debug-div').innerHTML = '';">clear</a>]
<div id="debug-div"></div>
</div>
</body>
</html>