diff --git a/test/unit/common/test_db_replicator.py b/test/unit/common/test_db_replicator.py index 5c5912e..ca46e81 100644 --- a/test/unit/common/test_db_replicator.py +++ b/test/unit/common/test_db_replicator.py @@ -1483,6 +1483,76 @@ class TestReplicatorSync(unittest.TestCase): parts = os.listdir(part_root) self.assertEqual(0, len(parts)) + def test_rsync_then_merge(self): + # setup current db (and broker) + broker = self._get_broker('a', 'c', node_index=0) + part, node = self._get_broker_part_node(broker) + part = str(part) + put_timestamp = normalize_timestamp(time.time()) + broker.initialize(put_timestamp) + put_metadata = {'example-meta': ['bah', put_timestamp]} + broker.update_metadata(put_metadata) + + # sanity (re-open, and the db keeps the metadata) + broker = self._get_broker('a', 'c', node_index=0) + self.assertEqual(put_metadata, broker.metadata) + + # create rsynced db in tmp dir + obj_hash = hash_path('a', 'c') + rsynced_db_broker = ExampleBroker( + os.path.join(self.root, node['device'], 'tmp', obj_hash + '.db'), + account='a', container='b') + rsynced_db_broker.initialize(put_timestamp) + + # do rysnc_then_merge + rpc = db_replicator.ReplicatorRpc( + self.root, self.datadir, ExampleBroker, False) + response = rpc.dispatch((node['device'], part, obj_hash), + ['rsync_then_merge', obj_hash + '.db', 'arg2']) + # sanity + self.assertEqual('204 No Content', response.status) + self.assertEqual(204, response.status_int) + + # re-open the db + broker = self._get_broker('a', 'c', node_index=0) + # keep the metadata in existing db + self.assertEqual(put_metadata, broker.metadata) + + def test_replicator_sync(self): + # setup current db (and broker) + broker = self._get_broker('a', 'c', node_index=0) + part, node = self._get_broker_part_node(broker) + part = str(part) + put_timestamp = normalize_timestamp(time.time()) + broker.initialize(put_timestamp) + put_metadata = {'example-meta': ['bah', put_timestamp]} + sync_local_metadata = { + "meta1": ["data1", put_timestamp], + "meta2": ["data2", put_timestamp]} + broker.update_metadata(put_metadata) + + # sanity (re-open, and the db keeps the metadata) + broker = self._get_broker('a', 'c', node_index=0) + self.assertEqual(put_metadata, broker.metadata) + + # do rysnc_then_merge + rpc = db_replicator.ReplicatorRpc( + self.root, self.datadir, ExampleBroker, False) + response = rpc.sync( + broker, (broker.get_sync('id_') + 1, 12345, 'id_', + put_timestamp, put_timestamp, '0', + json.dumps(sync_local_metadata))) + # sanity + self.assertEqual('200 OK', response.status) + self.assertEqual(200, response.status_int) + + # re-open the db + broker = self._get_broker('a', 'c', node_index=0) + # keep the both metadata in existing db and local db + expected = put_metadata.copy() + expected.update(sync_local_metadata) + self.assertEqual(expected, broker.metadata) + if __name__ == '__main__': unittest.main()