Files
multi-user/test_replication.py

265 lines
7.1 KiB
Python
Raw Normal View History

import cProfile
2019-07-23 20:18:51 +02:00
import logging
import re
2019-07-23 20:18:51 +02:00
import time
import unittest
2019-07-05 18:07:16 +02:00
2019-07-23 20:01:03 +02:00
logging.basicConfig()
logging.getLogger().setLevel(logging.INFO)
2019-07-23 11:41:36 +02:00
logger = logging.getLogger(__name__)
2019-07-05 18:07:16 +02:00
2019-07-23 20:01:03 +02:00
2019-07-23 20:18:51 +02:00
from replication import ReplicatedDatablock, ReplicatedDataFactory
from replication_client import Client, Server
2019-07-05 18:07:16 +02:00
class SampleData():
2019-07-23 20:18:51 +02:00
def __init__(self, map={"sample": "data"}):
self.map = map
2019-07-05 18:07:16 +02:00
2019-07-19 11:20:22 +02:00
2019-07-05 18:07:16 +02:00
class RepSampleData(ReplicatedDatablock):
2019-07-23 20:18:51 +02:00
def serialize(self, data):
2019-07-05 18:07:16 +02:00
import pickle
2019-07-23 20:18:51 +02:00
2019-07-05 18:07:16 +02:00
return pickle.dumps(data)
2019-07-23 20:18:51 +02:00
def deserialize(self, data):
2019-07-05 18:07:16 +02:00
import pickle
2019-07-18 18:15:01 +02:00
return pickle.loads(data)
2019-07-23 20:18:51 +02:00
def dump(self):
import json
output = {}
output['map'] = json.dumps(self.pointer.map)
return output
2019-07-23 20:18:51 +02:00
def load(self, target=None):
2019-07-22 17:49:51 +02:00
import json
2019-07-23 11:34:43 +02:00
if target is None:
2019-07-23 20:18:51 +02:00
target = SampleData()
2019-07-23 11:34:43 +02:00
2019-07-22 17:49:51 +02:00
target.map = json.loads(self.buffer['map'])
2019-07-05 18:47:40 +02:00
2019-07-19 11:20:22 +02:00
2019-07-18 18:15:01 +02:00
class TestDataFactory(unittest.TestCase):
2019-07-18 16:38:13 +02:00
def test_data_factory(self):
2019-07-07 12:22:45 +02:00
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
2019-07-05 18:47:40 +02:00
data_sample = SampleData()
2019-07-23 20:18:51 +02:00
rep_sample = factory.construct_from_dcc(
data_sample)(owner="toto", pointer=data_sample)
self.assertEqual(isinstance(rep_sample, RepSampleData), True)
2019-07-05 18:47:40 +02:00
2019-07-07 12:22:45 +02:00
2019-07-19 11:20:22 +02:00
class TestClient(unittest.TestCase):
2019-07-23 20:18:51 +02:00
def __init__(self, methodName='runTest'):
2019-07-18 18:15:01 +02:00
unittest.TestCase.__init__(self, methodName)
def test_empty_snapshot(self):
# Setup
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
2019-07-07 12:22:45 +02:00
server = Server(factory=factory)
client = Client(factory=factory, id="client_test_callback")
2019-07-18 16:38:13 +02:00
server.serve(port=5570)
client.connect(port=5570)
test_state = client.state
2019-07-23 20:18:51 +02:00
server.stop()
client.disconnect()
2019-07-18 16:38:13 +02:00
self.assertNotEqual(test_state, 2)
2019-07-18 16:38:13 +02:00
def test_filled_snapshot(self):
# Setup
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
server = Server(factory=factory)
client = Client(factory=factory, id="cli_test_filled_snapshot")
client2 = Client(factory=factory, id="client_2")
2019-07-23 20:18:51 +02:00
server.serve(port=5575)
client.connect(port=5575)
# Test the key registering
data_sample_key = client.register(SampleData())
client2.connect(port=5575)
time.sleep(0.2)
rep_test_key = client2._rep_store[data_sample_key].uuid
server.stop()
client.disconnect()
client2.disconnect()
self.assertEqual(data_sample_key, rep_test_key)
2019-07-18 16:38:13 +02:00
2019-07-18 18:15:01 +02:00
def test_register_client_data(self):
2019-07-19 11:20:22 +02:00
# Setup environment
2019-07-23 20:18:51 +02:00
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
2019-07-18 16:38:13 +02:00
server = Server(factory=factory)
server.serve(port=5560)
2019-07-18 16:38:13 +02:00
client = Client(factory=factory, id="cli_test_register_client_data")
client.connect(port=5560)
2019-07-18 16:38:13 +02:00
client2 = Client(factory=factory, id="cli2_test_register_client_data")
client2.connect(port=5560)
2019-07-23 20:18:51 +02:00
2019-07-19 11:20:22 +02:00
# Test the key registering
data_sample_key = client.register(SampleData())
2019-07-23 20:18:51 +02:00
2019-07-22 17:49:51 +02:00
time.sleep(0.3)
2019-07-23 20:18:51 +02:00
# Waiting for server to receive the datas
2019-07-19 11:20:22 +02:00
rep_test_key = client2._rep_store[data_sample_key].uuid
2019-07-23 20:18:51 +02:00
client.disconnect()
client2.disconnect()
server.stop()
2019-07-05 18:47:40 +02:00
self.assertEqual(rep_test_key, data_sample_key)
def test_client_data_intergity(self):
# Setup environment
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
server = Server(factory=factory)
server.serve(port=5560)
client = Client(factory=factory, id="cli_test_client_data_intergity")
client.connect(port=5560)
client2 = Client(factory=factory, id="cli2_test_client_data_intergity")
client2.connect(port=5560)
2019-07-23 20:18:51 +02:00
test_map = {"toto": "test"}
# Test the key registering
data_sample_key = client.register(SampleData(map=test_map))
2019-07-22 17:49:51 +02:00
test_map_result = SampleData()
2019-07-23 20:18:51 +02:00
# Waiting for server to receive the datas
time.sleep(1)
client2._rep_store[data_sample_key].load(target=test_map_result)
client.disconnect()
client2.disconnect()
server.stop()
2019-07-22 17:49:51 +02:00
self.assertEqual(test_map_result.map["toto"], test_map["toto"])
2019-07-18 18:15:01 +02:00
2019-07-23 11:34:43 +02:00
def test_client_unregister_key(self):
# Setup environment
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
server = Server(factory=factory)
server.serve(port=5560)
client = Client(factory=factory, id="cli_test_client_data_intergity")
client.connect(port=5560)
client2 = Client(factory=factory, id="cli2_test_client_data_intergity")
client2.connect(port=5560)
2019-07-23 20:18:51 +02:00
test_map = {"toto": "test"}
2019-07-23 11:34:43 +02:00
# Test the key registering
data_sample_key = client.register(SampleData(map=test_map))
test_map_result = SampleData()
2019-07-23 20:18:51 +02:00
# Waiting for server to receive the datas
2019-07-23 11:49:38 +02:00
time.sleep(.1)
2019-07-23 11:34:43 +02:00
client2._rep_store[data_sample_key].load(target=test_map_result)
2019-07-23 20:18:51 +02:00
2019-07-23 11:34:43 +02:00
client.unregister(data_sample_key)
2019-07-23 11:49:38 +02:00
time.sleep(.1)
2019-07-23 11:34:43 +02:00
2019-07-23 11:49:38 +02:00
logger.debug("client store:")
2019-07-23 11:41:36 +02:00
logger.debug(client._rep_store)
2019-07-23 11:49:38 +02:00
logger.debug("client2 store:")
logger.debug(client2._rep_store)
logger.debug("server store:")
logger.debug(server._rep_store)
2019-07-23 11:34:43 +02:00
client.disconnect()
client2.disconnect()
server.stop()
self.assertFalse(data_sample_key in client._rep_store)
2019-07-23 20:18:51 +02:00
2019-07-23 11:34:43 +02:00
def test_client_disconnect(self):
pass
def test_client_change_rights(self):
pass
2019-07-22 18:18:11 +02:00
2019-07-23 18:58:25 +02:00
class TestStressClient(unittest.TestCase):
def test_stress_register(self):
total_time = 0
# Setup
factory = ReplicatedDataFactory()
factory.register_type(SampleData, RepSampleData)
server = Server(factory=factory)
client = Client(factory=factory, id="cli_test_filled_snapshot")
client2 = Client(factory=factory, id="client_2")
2019-07-23 20:18:51 +02:00
2019-07-23 18:58:25 +02:00
server.serve(port=5575)
client.connect(port=5575)
client2.connect(port=5575)
# Test the key registering
for i in range(10000):
client.register(SampleData())
while len(client2._rep_store.keys()) < 10000:
2019-07-23 20:01:03 +02:00
time.sleep(0.00001)
2019-07-23 20:18:51 +02:00
total_time += 0.00001
2019-07-23 18:58:25 +02:00
# test_num_items = len(client2._rep_store.keys())
server.stop()
client.disconnect()
client2.disconnect()
2019-07-23 20:01:03 +02:00
logger.info("{} s for 10000 values".format(total_time))
2019-07-23 18:58:25 +02:00
2019-07-23 20:18:51 +02:00
self.assertLess(total_time, 1)
2019-07-23 18:58:25 +02:00
2019-07-18 18:15:01 +02:00
def suite():
suite = unittest.TestSuite()
2019-07-22 18:18:11 +02:00
# Data factory
2019-07-18 18:15:01 +02:00
suite.addTest(TestDataFactory('test_data_factory'))
2019-07-23 20:18:51 +02:00
# Client
2019-07-19 11:20:22 +02:00
suite.addTest(TestClient('test_empty_snapshot'))
suite.addTest(TestClient('test_filled_snapshot'))
2019-07-19 11:20:22 +02:00
suite.addTest(TestClient('test_register_client_data'))
2019-07-22 17:49:51 +02:00
suite.addTest(TestClient('test_client_data_intergity'))
2019-07-23 20:18:51 +02:00
2019-07-23 18:58:25 +02:00
# Stress test
suite.addTest(TestStressClient('test_stress_register'))
2019-07-18 18:15:01 +02:00
return suite
2019-07-04 15:56:03 +02:00
2019-07-23 20:18:51 +02:00
2019-07-04 15:56:03 +02:00
if __name__ == '__main__':
2019-07-23 11:34:43 +02:00
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite())