def setUp(self): super(SockJSSubscriberTestCase, self).setUp() self.publisher = self._new_client() self.subscriber = SockJSSubscriber(self.client)
class SockJSSubscriberTestCase(RedisTestCase): def setUp(self): super(SockJSSubscriberTestCase, self).setUp() self.publisher = self._new_client() self.subscriber = SockJSSubscriber(self.client) def tearDown(self): if self.subscriber.is_subscribed(): self.subscriber.close() try: self.publisher.connection.disconnect() del self.publisher except AttributeError: pass super(SockJSSubscriberTestCase, self).tearDown() @async_test @gen.engine def test_subscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) data = {'foo': randint(0, 1000)} self.subscriber.publish('test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.stop() @async_test @gen.engine def test_subscribe_unicode(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, u'test.channel', broadcaster) data = {'foo': randint(0, 1000)} self.subscriber.publish(u'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.stop() @async_test @gen.engine def test_publish_unicode(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) data = u'лабуда-ерунда' self.publisher.publish('test.channel', data) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.assertEqual(broadcaster.messages[0], data) self.stop() @async_test @gen.engine def test_unsubscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) self.subscriber.unsubscribe('test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) self.stop() @async_test @gen.engine def test_unsubscribe_unicode(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, u'test.channel', broadcaster) self.subscriber.unsubscribe(u'test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, u'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) self.stop() @async_test @gen.engine def test_sequental_subscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel2', broadcaster) self.subscriber.unsubscribe(u'test.channel2', broadcaster) self.subscriber.unsubscribe(u'test.channel', broadcaster) yield gen.Task(self.pause) yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.stop() @async_test @gen.engine def test_subscribe_multiple(self): broadcaster = DummyConnection() broadcaster2 = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel2', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster2) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) data2 = {'foo2': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel2', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 3) self.assertEqual(len(broadcaster.messages), 2) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.subscriber.unsubscribe('test.channel', broadcaster2) data2 = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 4) self.assertEqual(len(broadcaster.messages), 3) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[2], json.dumps(data2)) self.stop() @async_test @gen.engine def test_subscribe_list(self): broadcaster = DummyConnection() broadcaster2 = DummyConnection() channels = ['test.channel', 'test.channel2'] yield gen.Task(self.subscriber.subscribe, channels, broadcaster) yield gen.Task(self.subscriber.subscribe, ('test.channel', ), broadcaster2) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) data2 = {'foo2': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel2', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 3) self.assertEqual(len(broadcaster.messages), 2) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.subscriber.unsubscribe('test.channel', broadcaster2) data2 = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 4) self.assertEqual(len(broadcaster.messages), 3) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[2], json.dumps(data2)) self.stop()
class SockJSSubscriberTestCase(RedisTestCase): def setUp(self): super(SockJSSubscriberTestCase, self).setUp() self.publisher = self._new_client() self.subscriber = SockJSSubscriber(self.client) def tearDown(self): if self.subscriber.is_subscribed(): self.subscriber.close() try: self.publisher.connection.disconnect() del self.publisher except AttributeError: pass super(SockJSSubscriberTestCase, self).tearDown() @async_test @gen.engine def test_subscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) data = {'foo': randint(0, 1000)} self.subscriber.publish('test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.stop() @async_test @gen.engine def test_subscribe_unicode(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, u'test.channel', broadcaster) data = {'foo': randint(0, 1000)} self.subscriber.publish(u'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.stop() @async_test @gen.engine def test_unsubscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) self.subscriber.unsubscribe('test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) self.stop() @async_test @gen.engine def test_unsubscribe_unicode(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, u'test.channel', broadcaster) self.subscriber.unsubscribe(u'test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, u'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) self.stop() @async_test @gen.engine def test_sequental_subscribe(self): broadcaster = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel2', broadcaster) self.subscriber.unsubscribe(u'test.channel2', broadcaster) self.subscriber.unsubscribe(u'test.channel', broadcaster) yield gen.Task(self.pause) yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.pause) self.assertFalse(broadcaster.messages) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) yield gen.Task(self.pause) self.assertTrue(broadcaster.messages) self.stop() @async_test @gen.engine def test_subscribe_multiple(self): broadcaster = DummyConnection() broadcaster2 = DummyConnection() yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel2', broadcaster) yield gen.Task(self.subscriber.subscribe, 'test.channel', broadcaster2) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) data2 = {'foo2': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel2', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 3) self.assertEqual(len(broadcaster.messages), 2) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.subscriber.unsubscribe('test.channel', broadcaster2) data2 = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 4) self.assertEqual(len(broadcaster.messages), 3) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[2], json.dumps(data2)) self.stop() @async_test @gen.engine def test_subscribe_list(self): broadcaster = DummyConnection() broadcaster2 = DummyConnection() channels = ['test.channel', 'test.channel2'] yield gen.Task(self.subscriber.subscribe, channels, broadcaster) yield gen.Task(self.subscriber.subscribe, ('test.channel', ), broadcaster2) data = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data, client=self.publisher) data2 = {'foo2': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel2', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 3) self.assertEqual(len(broadcaster.messages), 2) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[0], json.dumps(data)) self.subscriber.unsubscribe('test.channel', broadcaster2) data2 = {'foo': randint(0, 1000)} yield gen.Task(self.subscriber.publish, 'test.channel', data2, client=self.publisher) yield gen.Task(self.pause) msgs = broadcaster.messages + broadcaster2.messages self.assertEqual(len(msgs), 4) self.assertEqual(len(broadcaster.messages), 3) self.assertEqual(len(broadcaster2.messages), 1) self.assertEqual(broadcaster.messages[2], json.dumps(data2)) self.stop()
from tornado.web import StaticFileHandler, FallbackHandler, RedirectHandler,\ Application from tornado.wsgi import WSGIContainer from sockjs.tornado import SockJSConnection, SockJSRouter from tornadoredis import Client as RedisClient from tornadoredis.pubsub import SockJSSubscriber from .. import config toolname = config.toolname from .oauth_handler import app as oauth_wsgi # noqa from ..celery import app as celery_app # noqa # Create the tornadoredis.Client instance # and use it for redis channel subscriptions subscriber = SockJSSubscriber( RedisClient(host=config.redis_server, port=config.redis_port, selected_db=config.redis_db)) class SockConnection(SockJSConnection): def on_open(self, info): self.channel = str(uuid4()) subscriber.subscribe(self.channel, self) def on_close(self): subscriber.unsubscribe(self.channel, self) def on_message(self, message): data = json.loads(message) data['redis_channel'] = self.channel if data['action'] == 'watchlist':