def test_consumer_group_container(self): ra1, rb1, ra2, rb2, rb3 = self._create_test_data() cg1 = db.consumer_group('g1', {'sa': '1', 'sb': '0'}) cg2 = db.consumer_group('g2', {'sb': '2'}) self.assertEqual(cg1.create(), {'sa': True, 'sb': True}) self.assertEqual(cg2.create(), {'sb': True}) self.assertEqual(dict(cg1.read(count=2)), { b'sa': [(ra2, {b'k': b'a2'})], b'sb': [(rb1, {b'k': b'b1'}), (rb2, {b'k': b'b2'})]}) self.assertEqual(cg1.sa.read(), []) self.assertEqual(cg1.sb.read(), [(rb3, {b'k': b'b3'})]) self.assertEqual(cg1.sa.ack(ra2), 1) self.assertEqual(cg1.sb.ack(rb1, rb3), 2) p1, = cg1.sb.pending() self.assertEqual(p1['message_id'], rb2) self.assertEqual(p1['consumer'], b'g1.c1') self.assertEqual(cg2.read(count=1), [ [b'sb', [(rb2, {b'k': b'b2'})]]]) self.assertEqual(cg2.sb.read(), [(rb3, {b'k': b'b3'})]) self.assertEqual(cg1.destroy(), {'sa': 1, 'sb': 1}) self.assertEqual(cg2.destroy(), {'sb': 1})
def test_consumer_group_container(self): ra1, rb1, ra2, rb2, rb3 = self._create_test_data() cg1 = db.consumer_group('g1', {'sa': '1', 'sb': '0'}) cg2 = db.consumer_group('g2', {'sb': '2'}) self.assertEqual(cg1.create(), {'sa': True, 'sb': True}) self.assertEqual(cg2.create(), {'sb': True}) self.assertEqual( dict(cg1.read(count=2)), { b'sa': [(ra2, { b'k': b'a2' })], b'sb': [(rb1, { b'k': b'b1' }), (rb2, { b'k': b'b2' })] }) self.assertEqual(cg1.sa.read(), []) self.assertEqual(cg1.sb.read(), [(rb3, {b'k': b'b3'})]) self.assertEqual(cg1.sa.ack(ra2), 1) self.assertEqual(cg1.sb.ack(rb1, rb3), 2) p1, = cg1.sb.pending() self.assertEqual(p1['message_id'], rb2) self.assertEqual(p1['consumer'], b'g1.c1') self.assertEqual(cg2.read(count=1), [[b'sb', [(rb2, {b'k': b'b2'})]]]) self.assertEqual(cg2.sb.read(), [(rb3, {b'k': b'b3'})]) self.assertEqual(cg1.destroy(), {'sa': 1, 'sb': 1}) self.assertEqual(cg2.destroy(), {'sb': 1})
def test_consumer_group_create(self): cg = db.consumer_group('cg', ['sa']) self.assertEqual(cg.create(), {'sa': True}) # Creating the consumer group again will report that it was not created # for the given key(s). self.assertEqual(cg.create(), {'sa': False}) # We can register the consumer group with another key. cg = db.consumer_group('cg', ['sa', 'sb']) self.assertEqual(cg.create(), {'sa': False, 'sb': True})
def test_stream_group_info(self): sa = db.Stream('sa') ra1 = sa.add({'k': 'a1'}) ra2 = sa.add({'k': 'a2'}) ra3 = sa.add({'k': 'a3'}) sb = db.Stream('sb') rb1 = sb.add({'k': 'b1'}) sa_info = sa.info() self.assertEqual(sa_info['groups'], 0) self.assertEqual(sa_info['length'], 3) self.assertEqual(sa_info['first-entry'][0], ra1) self.assertEqual(sa_info['last-entry'][0], ra3) sb_info = sb.info() self.assertEqual(sb_info['groups'], 0) self.assertEqual(sb_info['length'], 1) self.assertEqual(sb_info['first-entry'][0], rb1) self.assertEqual(sb_info['last-entry'][0], rb1) self.assertEqual(sa.groups_info(), []) self.assertEqual(sb.groups_info(), []) # Create consumer groups. cga = db.consumer_group('cga', ['sa']) cga.create() cgab = db.consumer_group('cgab', ['sa', 'sb']) cgab.create() self.assertEqual(sa.info()['groups'], 2) self.assertEqual(sb.info()['groups'], 1) sa_groups = sa.groups_info() self.assertEqual(len(sa_groups), 2) self.assertEqual(sorted(g['name'] for g in sa_groups), [b'cga', b'cgab']) sb_groups = sb.groups_info() self.assertEqual(len(sb_groups), 1) self.assertEqual(sb_groups[0]['name'], b'cgab') # Verify we can get stream info from the consumer group. stream_info = cgab.stream_info() self.assertEqual(sorted(stream_info), ['sa', 'sb']) # Destroy consumer group? cgab.destroy() self.assertEqual(len(sa.groups_info()), 1) self.assertEqual(len(sb.groups_info()), 0)
def test_consumer_group_consumers(self): ra1, rb1, ra2, rb2, rb3 = self._create_test_data() cg11 = db.consumer_group('g1', {'sa': '0', 'sb': '0'}, consumer='cg11') cg11.create() cg12 = cg11.consumer('cg12') self.assertEqual(dict(cg11.read(count=1)), { b'sa': [(ra1, { b'k': b'a1' })], b'sb': [(rb1, { b'k': b'b1' })] }) self.assertEqual(dict(cg12.read(count=1, block=1)), { b'sa': [(ra2, { b'k': b'a2' })], b'sb': [(rb2, { b'k': b'b2' })] }) pa1, pa2 = cg11.sa.pending() self.assertEqual(pa1['message_id'], ra1) self.assertEqual(pa1['consumer'], b'cg11') self.assertEqual(pa2['message_id'], ra2) self.assertEqual(pa2['consumer'], b'cg12') pb1, pb2 = cg11.sb.pending() self.assertEqual(pb1['message_id'], rb1) self.assertEqual(pb1['consumer'], b'cg11') self.assertEqual(pb2['message_id'], rb2) self.assertEqual(pb2['consumer'], b'cg12')
def test_consumer_group_streams(self): ra1, rb1, ra2, rb2, rb3 = self._create_test_data() cg = db.consumer_group('g1', ['sa', 'sb']) self.assertEqual(cg.sa[ra1], (ra1, {b'k': b'a1'})) self.assertEqual(cg.sb[rb3], (rb3, {b'k': b'b3'})) def assertMessages(resp, expected): self.assertEqual([mid for mid, _ in resp], expected) assertMessages(cg.sa[ra1:], [ra1, ra2]) assertMessages(cg.sa[:ra1], [ra1]) assertMessages(cg.sa[ra2:], [ra2]) assertMessages(cg.sa[:ra2], [ra1, ra2]) assertMessages(cg.sa[rb3:], []) assertMessages(cg.sa[:b'0-1'], []) assertMessages(list(cg.sa), [ra1, ra2]) assertMessages(cg.sb[rb1:], [rb1, rb2, rb3]) assertMessages(cg.sb[rb1::2], [rb1, rb2]) assertMessages(cg.sb[:rb1], [rb1]) assertMessages(cg.sb[rb3:], [rb3]) assertMessages(cg.sb[:rb3], [rb1, rb2, rb3]) assertMessages(list(cg.sb), [rb1, rb2, rb3]) self.assertEqual(len(cg.sa), 2) self.assertEqual(len(cg.sb), 3) del cg.sa[ra1] del cg.sb[rb1, rb3] self.assertEqual(len(cg.sa), 1) self.assertEqual(len(cg.sb), 1) assertMessages(list(cg.sa), [ra2]) assertMessages(list(cg.sb), [rb2])
def test_consumer_group_consumers(self): ra1, rb1, ra2, rb2, rb3 = self._create_test_data() cg11 = db.consumer_group('g1', {'sa': '0', 'sb': '0'}, consumer='cg11') cg11.create() cg12 = cg11.consumer('cg12') self.assertEqual(dict(cg11.read(count=1)), { b'sa': [(ra1, {b'k': b'a1'})], b'sb': [(rb1, {b'k': b'b1'})]}) self.assertEqual(dict(cg12.read(count=1)), { b'sa': [(ra2, {b'k': b'a2'})], b'sb': [(rb2, {b'k': b'b2'})]}) pa1, pa2 = cg11.sa.pending() self.assertEqual(pa1['message_id'], ra1) self.assertEqual(pa1['consumer'], b'cg11') self.assertEqual(pa2['message_id'], ra2) self.assertEqual(pa2['consumer'], b'cg12') pb1, pb2 = cg11.sb.pending() self.assertEqual(pb1['message_id'], rb1) self.assertEqual(pb1['consumer'], b'cg11') self.assertEqual(pb2['message_id'], rb2) self.assertEqual(pb2['consumer'], b'cg12')
def test_consumer_group_stream_creation(self): cg = db.consumer_group('cg1', ['stream-a', 'stream-b']) self.assertFalse(db.exists('stream-a')) self.assertFalse(db.exists('stream-b')) cg.create() # The streams were created (by adding and then deleting a message). self.assertTrue(db.exists('stream-a')) self.assertTrue(db.exists('stream-b')) # The streams that were automatically created will not have any data. self.assertEqual(db.xlen('stream-a'), 0) self.assertEqual(db.xlen('stream-b'), 0) # If a stream already exists that's OK. db.xadd('stream-c', {'data': 'dummy'}, id=b'1') cg = db.consumer_group('cg2', ['stream-c', 'stream-d']) self.assertTrue(db.exists('stream-c')) self.assertEqual(db.type('stream-c'), b'stream') self.assertFalse(db.exists('stream-d')) cg.create() self.assertTrue(db.exists('stream-d')) self.assertEqual(db.type('stream-c'), b'stream') self.assertEqual(db.type('stream-d'), b'stream') self.assertEqual(db.xlen('stream-c'), 1) self.assertEqual(db.xlen('stream-d'), 0) # If a stream key already exists and is a different type, fail. db.lpush('l1', 'item-1') db.hset('h1', 'key', 'data') db.sadd('s1', 'item-1') db.set('k1', 'v1') db.zadd('z1', {'item-1': 1.0}) for key in ('l1', 'h1', 's1', 'k1', 'z1'): cg = db.consumer_group('cg-%s' % key, keys=[key]) self.assertRaises(ValueError, cg.create)