def test_subscription_filter(self): service = PubSub('test_subscription_filter') sub1 = Subscriber('sub1') sub2 = Subscriber('sub2') service.subscribe(sub1, sub1.key, 'topic1', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic1', sub1.cb2) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb2) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb2) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb2) subscriptions = service.subscriptions(subscriber=sub2) self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertNotIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertNotIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) subscriptions = service.subscriptions(key=sub1.key) self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertNotIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) subscriptions = service.subscriptions(topic='topic1') self.assertEqual(len(subscriptions), 1) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertNotIn('topic2', subscriptions) subscriptions = service.subscriptions(callback=sub1.cb1) self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertNotIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2'])
def test_weak_subscriptions(self): service = PubSub('test_weak_subscriptions') sub = Subscriber('sub') weaksub = weakref.ref(sub) service.subscribe(sub, sub.key, 'topic', sub.cb1) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 1) self.assertIn('topic', subscriptions) self.assertIn((sub, sub.key, sub.cb1), subscriptions['topic']) del subscriptions del sub gc.collect() self.assertEqual(weaksub(), None) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 0)
def test_subscription(self): service = PubSub('test_subscription') sub = Subscriber('sub') service.subscribe(sub, sub.key, 'topic', sub.cb1) subscriptions = service.subscriptions() self.assertIn('topic', subscriptions) self.assertIn((sub, sub.key, sub.cb1), subscriptions['topic'])
def test_persistent_subscriptions(self): service = PubSub('test_pseristsent_subscriptions') sub = Subscriber('sub') service.subscribe(sub, sub.key, 'topic', sub.cb1) del service service = PubSub('test_pseristsent_subscriptions') subscriptions = service.subscriptions() self.assertIn('topic', subscriptions) self.assertIn((sub, sub.key, sub.cb1), subscriptions['topic'])
def test_duplicate_subscription(self): service = PubSub('test_duplicate_subscription') sub = Subscriber('sub') local_dict = WeakValueDictionary() service.subscribe(sub, sub.key, 'topic', sub.cb1) service.subscribe(sub, sub.key, 'topic', sub.cb1) subscriptions = service.subscriptions() self.assertIn('topic', subscriptions) self.assertEqual(len(subscriptions['topic']), 1) self.assertIn((sub, sub.key, sub.cb1), subscriptions['topic'])
def test_mutliple_subscriptions(self): service = PubSub('test_multiple_subscription') sub1 = Subscriber('sub1') sub2 = Subscriber('sub2') service.subscribe(sub1, sub1.key, 'topic1', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic1', sub1.cb2) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb2) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb2) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb2) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2'])
def test_unsubscribe(self): service = PubSub('test_unsubscribe') sub1 = Subscriber('sub1') sub2 = Subscriber('sub2') service.subscribe(sub1, sub1.key, 'topic1', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic1', sub1.cb2) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb1) service.subscribe(sub1, sub1.key, 'topic2', sub1.cb2) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic1', sub2.cb2) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb1) service.subscribe(sub2, sub2.key, 'topic2', sub2.cb2) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) service.unsubscribe(sub2, sub2.key, 'topic2', sub2.cb2) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) service.unsubscribe(sub1, sub1.key, callback=sub1.cb2) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) service.unsubscribe(callback=sub1.cb1) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 2) self.assertIn('topic1', subscriptions) self.assertNotIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertIn('topic2', subscriptions) self.assertNotIn((sub1, sub1.key, sub1.cb1), subscriptions['topic2']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic2']) self.assertIn((sub2, sub2.key, sub2.cb1), subscriptions['topic2']) self.assertNotIn((sub2, sub2.key, sub2.cb2), subscriptions['topic2']) service.unsubscribe(callback=sub2.cb1) subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 1) self.assertIn('topic1', subscriptions) self.assertNotIn((sub1, sub1.key, sub1.cb1), subscriptions['topic1']) self.assertNotIn((sub1, sub1.key, sub1.cb2), subscriptions['topic1']) self.assertNotIn((sub2, sub2.key, sub2.cb1), subscriptions['topic1']) self.assertIn((sub2, sub2.key, sub2.cb2), subscriptions['topic1']) self.assertNotIn('topic2', subscriptions) service.unsubscribe() subscriptions = service.subscriptions() self.assertEqual(len(subscriptions), 0)