UNPKG

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
<!DOCTYPE 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>