/* * Copyright (c) 2008-2017 the original author or authors. * * 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. */ package org.cometd.javascript; import org.junit.Assert; import org.junit.Test; public class CometDCallbackPollingTest extends AbstractCometDCallbackPollingTest { @Test public void testCallbackPolling() throws Exception { defineClass(Latch.class); // Make the CometD URL different to simulate the cross domain request String url = cometdURL.replace("localhost", "127.0.0.1"); evaluateScript("cometd.configure({url: '" + url + "', logLevel: '" + getLogLevel() + "'});"); evaluateScript("" + "var handshakeLatch = new Latch(1);" + "var connectLatch = new Latch(1);" + "cometd.addListener('/meta/handshake', function(m) { handshakeLatch.countDown(); });" + "cometd.addListener('/meta/connect', function(m) { connectLatch.countDown(); });"); Latch handshakeLatch = get("handshakeLatch"); Latch connectLatch = get("connectLatch"); evaluateScript("cometd.handshake();"); Assert.assertTrue(handshakeLatch.await(5000)); Assert.assertTrue(connectLatch.await(5000)); evaluateScript("" + "var subscribeLatch = new Latch(1);" + "var messageLatch = new Latch(1);" + "cometd.addListener('/meta/subscribe', function(m) { subscribeLatch.countDown(); });" + "var subscription = cometd.subscribe('/test', function(message) { messageLatch.countDown(); });"); Latch subscribeLatch = get("subscribeLatch"); Assert.assertTrue(subscribeLatch.await(5000)); evaluateScript("cometd.publish('/test', {});"); Latch messageLatch = get("messageLatch"); Assert.assertTrue(messageLatch.await(5000)); evaluateScript("" + "var unsubscribeLatch = new Latch(1);" + "cometd.addListener('/meta/unsubscribe', function(m) { unsubscribeLatch.countDown(); });" + "cometd.unsubscribe(subscription);"); Latch unsubscribeLatch = get("unsubscribeLatch"); Assert.assertTrue(unsubscribeLatch.await(5000)); evaluateScript("" + "var disconnectLatch = new Latch(1);" + "cometd.addListener('/meta/disconnect', function(m) { disconnectLatch.countDown(); });" + "cometd.disconnect();"); Latch disconnectLatch = get("disconnectLatch"); Assert.assertTrue(disconnectLatch.await(5000)); } @Test public void testURLMaxLengthOneTooBigMessage() throws Exception { defineClass(Latch.class); // Make the CometD URL different to simulate the cross domain request String url = cometdURL.replace("localhost", "127.0.0.1"); evaluateScript("cometd.configure({url: '" + url + "', logLevel: '" + getLogLevel() + "'});"); evaluateScript("var connectLatch = new Latch(1);"); Latch connectLatch = get("connectLatch"); evaluateScript("" + "cometd.addListener('/meta/connect', connectLatch, 'countDown');" + "cometd.handshake();"); Assert.assertTrue(connectLatch.await(5000)); evaluateScript("var publishLatch = new Latch(1);"); Latch publishLatch = get("publishLatch"); evaluateScript("" + "var data = '';" + "for (var i = 0; i < 2000; ++i)" + " data += 'x';" + "cometd.addListener('/meta/publish', function(message)" + "{" + " if (!message.successful)" + " publishLatch.countDown();" + "});" + "cometd.publish('/foo', data);" + ""); Assert.assertTrue(publishLatch.await(5000)); evaluateScript("cometd.disconnect(true);"); } @Test public void testURLMaxLengthThreeMessagesBatchedOneTooBigFailsWholeBatch() throws Exception { defineClass(Latch.class); // Make the CometD URL different to simulate the cross domain request String url = cometdURL.replace("localhost", "127.0.0.1"); evaluateScript("cometd.configure({url: '" + url + "', logLevel: '" + getLogLevel() + "'});"); evaluateScript("var connectLatch = new Latch(1);"); Latch connectLatch = get("connectLatch"); evaluateScript("" + "cometd.addListener('/meta/connect', connectLatch, 'countDown');" + "cometd.handshake();"); Assert.assertTrue(connectLatch.await(5000)); evaluateScript("var publishLatch = new Latch(3);"); Latch publishLatch = get("publishLatch"); evaluateScript("" + "var data = '';" + "for (var i = 0; i < 500; ++i)" + " data += 'x';" + "cometd.addListener('/meta/publish', function(message)" + "{" + " if (!message.successful)" + " publishLatch.countDown();" + "});" + "cometd.batch(function()" + "{" + " cometd.publish('/foo', data);" + " cometd.publish('/foo', data);" + " cometd.publish('/foo', data + data + data + data);" + "});" + ""); Assert.assertTrue(publishLatch.await(5000)); evaluateScript("cometd.disconnect(true);"); } @Test public void testURLMaxLengthThreeMessagesBatchedAreSplit() throws Exception { defineClass(Latch.class); // Make the CometD URL different to simulate the cross domain request String url = cometdURL.replace("localhost", "127.0.0.1"); evaluateScript("cometd.configure({url: '" + url + "', logLevel: '" + getLogLevel() + "'});"); evaluateScript("var connectLatch = new Latch(1);"); Latch connectLatch = get("connectLatch"); evaluateScript("" + "cometd.addListener('/meta/connect', connectLatch, 'countDown');" + "cometd.handshake();"); Assert.assertTrue(connectLatch.await(5000)); evaluateScript("var publishLatch = new Latch(3);"); Latch publishLatch = get("publishLatch"); evaluateScript("" + "var data = '';" + "for (var i = 0; i < 500; ++i)" + " data += 'x';" + "cometd.addListener('/meta/publish', function(message)" + "{" + " if (message.successful)" + " publishLatch.countDown();" + "});" + "cometd.batch(function()" + "{" + " cometd.publish('/foo', data);" + " cometd.publish('/foo', data);" + " cometd.publish('/foo', data + data);" + "});" + ""); Assert.assertTrue(publishLatch.await(5000)); evaluateScript("cometd.disconnect(true);"); } @Test public void testURLMaxLengthThreeMessagesBatchedAreSplitOrderIsKept() throws Exception { defineClass(Latch.class); // Make the CometD URL different to simulate the cross domain request String url = cometdURL.replace("localhost", "127.0.0.1"); evaluateScript("cometd.configure({url: '" + url + "', logLevel: '" + getLogLevel() + "'});"); evaluateScript("var connectLatch = new Latch(1);"); Latch connectLatch = get("connectLatch"); evaluateScript("" + "cometd.addListener('/meta/connect', connectLatch, 'countDown');" + "cometd.handshake();"); Assert.assertTrue(connectLatch.await(5000)); evaluateScript("var subscribeLatch = new Latch(1);"); Latch subscribeLatch = get("subscribeLatch"); evaluateScript("var publishLatch = new Latch(12);"); Latch publishLatch = get("publishLatch"); evaluateScript("" + "var channel = '/foo';" + "var orders = [];" + "cometd.addListener('/meta/subscribe', subscribeLatch, 'countDown');" + "cometd.subscribe(channel, function(message)" + "{" + " orders.push(message.order);" + " publishLatch.countDown();" + "});"); Assert.assertTrue(subscribeLatch.await(5000)); evaluateScript("" + "var data = '';" + "for (var i = 0; i < 500; ++i)" + " data += 'x';" + "cometd.addListener('/meta/publish', function(message)" + "{" + " if (message.successful)" + " publishLatch.countDown();" + "});" + "cometd.batch(function()" + "{" + " cometd.publish(channel, data, {order:1});" + " cometd.publish(channel, data, {order:2});" + " cometd.publish(channel, data + data + data, {order:3});" + " cometd.publish(channel, data, {order:4});" + " cometd.publish(channel, data, {order:5});" + "});" + "/* This additional publish must be sent after the split batch */" + "cometd.publish(channel, data, {order:6});" + ""); Assert.assertTrue(publishLatch.await(5000)); evaluateScript("window.assert([1,2,3,4,5,6].join(',') === orders.join(','), 'Order not respected ' + orders.join(','));"); evaluateScript("cometd.disconnect(true);"); } }