aioetcd3/test/test_kv.py

164 lines
5.5 KiB
Python

import unittest
import asyncio
import functools
from aioetcd3.client import client
from aioetcd3.kv import KV
from aioetcd3.help import range_all, range_prefix, range_greater, range_greater_equal
from aioetcd3 import transaction
def asynctest(f):
@functools.wraps(f)
def _f(self):
return asyncio.get_event_loop().run_until_complete(f(self))
return _f
class KVTest(unittest.TestCase):
@asynctest
async def setUp(self):
endpoints = "127.0.0.1:2379"
self.client = client(endpoint=endpoints)
endpoints = "127.0.0.1:2379"
self.client.update_server_list(endpoint=endpoints)
await self.cleanUp()
async def cleanUp(self):
await self.client.delete(key_range=range_all())
@asynctest
async def tearDown(self):
await self.cleanUp()
await self.client.close()
@asynctest
async def test_put_get(self):
for i in range(0, 10):
key = '/test' + str(i)
value, meta = await self.client.put(key, str(i))
self.assertIsNone(value)
self.assertIsNone(meta)
value, meta = await self.client.put('/test9', "10", prev_kv=True)
self.assertEqual(value, b'9')
self.assertIsNotNone(meta)
value, meta = await self.client.put('/test9', "9", prev_kv=True, ignore_value=True)
self.assertEqual(value, b'10')
self.assertIsNotNone(meta)
value, meta = await self.client.put('/test9', "9", prev_kv=True)
self.assertEqual(value, b'10')
self.assertIsNotNone(meta)
count = await self.client.count(key_range=range_all())
self.assertEqual(count, 10)
value, meta = await self.client.get("/test9")
self.assertEqual(value, b'9')
self.assertIsNotNone(meta)
keys_list = await self.client.range_keys(key_range=range_all())
self.assertEqual(len(keys_list), 10)
value_list = await self.client.range(key_range=range_all())
self.assertEqual(len(value_list), 10)
value = [v[1].decode('utf-8') for v in value_list]
value.sort()
real_value = [str(i) for i in range(0, 10)]
self.assertEqual(value, real_value)
value_list = await self.client.range(key_range=range_all(), limit=5)
self.assertEqual(len(value_list), 5)
value_list = await self.client.range(key_range=range_prefix('/'))
self.assertEqual(len(value_list), 10)
value_list = await self.client.range(key_range=range_prefix('/'), limit=11)
self.assertEqual(len(value_list), 10)
value_list = await self.client.range(key_range=range_greater_equal('/test8'))
self.assertEqual(len(value_list), 2)
self.assertEqual(value_list[0][1], b'8')
self.assertEqual(value_list[1][1], b'9')
value_list = await self.client.range(key_range=range_greater('/testa'))
self.assertEqual(len(value_list), 0)
await self.client.delete(key_range='/test9')
value, meta = await self.client.get("/test9")
self.assertIsNone(value)
self.assertIsNone(meta)
value_list = await self.client.pop(key_range='/test8')
self.assertEqual(len(value_list), 1)
self.assertEqual(value_list[0][0], b'/test8')
self.assertEqual(value_list[0][1], b'8')
value_list = await self.client.delete(key_range=range_prefix('/'), prev_kv=True)
self.assertEqual(len(value_list), 8)
@asynctest
async def test_transaction(self):
await self.client.put('/trans1', 'trans1')
await self.client.put('/trans2', 'trans2')
is_success, response = await self.client.txn(compare=[
transaction.Value('/trans1') == b'trans1',
transaction.Value('/trans2') == b'trans2'
], success=[
KV.get.txn('/trans1'),
KV.range.txn('/trans2')
], fail=[
KV.delete.txn('/trans1')
])
self.assertEqual(is_success, True)
self.assertEqual(len(response), 2)
self.assertEqual(response[0][0], b'trans1')
self.assertEqual(response[1][0][:2], (b'/trans2', b'trans2'))
is_success, response = await self.client.txn(compare=[
transaction.Value('/trans1') == b'trans1',
transaction.Value('/trans2') == b'trans2'
], success=[
KV.delete.txn('/trans1'),
KV.put.txn('/trans2', 'trans2', prev_kv=True),
KV.put.txn('/trans3', 'trans3', prev_kv=True)
], fail=[
KV.delete.txn('/trans1')
])
self.assertEqual(is_success, True)
self.assertEqual(len(response), 3)
del_response = response[0]
self.assertEqual(del_response, 1)
put_response = response[1]
self.assertEqual(put_response[0], b'trans2')
put_response = response[2]
# there is not pre_kv None
self.assertIsNone(put_response[0])
is_success, response = await self.client.txn(compare=[
transaction.Value('/trans3') != b'trans3',
transaction.Version('/trans3') < 1000,
transaction.Mod('/trans3') > 100,
transaction.Create('/trans3') != 200
], success=[
], fail=[
KV.delete.txn('/trans3', prev_kv=True)
])
self.assertEqual(is_success, False)
self.assertEqual(len(response), 1)
self.assertEqual(len(response[0]), 1)
self.assertEqual(response[0][0][:2], (b'/trans3', b'trans3'))
if __name__ == '__main__':
unittest.main()