Skip to content

Commit d8b24f8

Browse files
committed
Unit test coverage for replica map generation
1 parent 2b4a9c4 commit d8b24f8

1 file changed

Lines changed: 75 additions & 3 deletions

File tree

tests/unit/test_metadata.py

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import unittest
2+
23
import cassandra
34
from cassandra.metadata import (TableMetadata, Murmur3Token, MD5Token,
45
BytesToken, ReplicationStrategy,
56
NetworkTopologyStrategy, SimpleStrategy,
67
LocalStrategy)
8+
from cassandra.policies import SimpleConvictionPolicy
9+
from cassandra.pool import Host
710

811

912
class TestStrategies(unittest.TestCase):
@@ -50,11 +53,80 @@ def test_replication_strategy(self):
5053
self.assertRaises(NotImplementedError, rs.make_token_replica_map, None, None)
5154
self.assertRaises(NotImplementedError, rs.export_for_schema)
5255

53-
def test_nts(self):
54-
# TODO: Cover NetworkTopologyStrategy.make_token_replica_map()
56+
def test_nts_make_token_replica_map(self):
57+
token_to_host_owner = {}
58+
59+
dc1_1 = Host('dc1.1', SimpleConvictionPolicy)
60+
dc1_2 = Host('dc1.2', SimpleConvictionPolicy)
61+
dc1_3 = Host('dc1.3', SimpleConvictionPolicy)
62+
for host in (dc1_1, dc1_2, dc1_3):
63+
host.set_location_info('dc1', 'rack1')
64+
token_to_host_owner[MD5Token(0)] = dc1_1
65+
token_to_host_owner[MD5Token(100)] = dc1_2
66+
token_to_host_owner[MD5Token(200)] = dc1_3
67+
68+
dc2_1 = Host('dc2.1', SimpleConvictionPolicy)
69+
dc2_2 = Host('dc2.2', SimpleConvictionPolicy)
70+
dc2_1.set_location_info('dc2', 'rack1')
71+
dc2_2.set_location_info('dc2', 'rack1')
72+
token_to_host_owner[MD5Token(1)] = dc2_1
73+
token_to_host_owner[MD5Token(101)] = dc2_2
74+
75+
dc3_1 = Host('dc3.1', SimpleConvictionPolicy)
76+
dc3_1.set_location_info('dc3', 'rack3')
77+
token_to_host_owner[MD5Token(2)] = dc3_1
78+
79+
ring = [MD5Token(0),
80+
MD5Token(1),
81+
MD5Token(2),
82+
MD5Token(100),
83+
MD5Token(101),
84+
MD5Token(200)]
85+
86+
nts = NetworkTopologyStrategy({'dc1': 2, 'dc2': 2, 'dc3': 1})
87+
replica_map = nts.make_token_replica_map(token_to_host_owner, ring)
88+
89+
self.assertItemsEqual(replica_map[MD5Token(0)], (dc1_1, dc1_2, dc2_1, dc2_2, dc3_1))
90+
91+
def test_nts_make_token_replica_map_empty_dc(self):
92+
host = Host('1', SimpleConvictionPolicy)
93+
host.set_location_info('dc1', 'rack1')
94+
token_to_host_owner = {MD5Token(0): host}
95+
ring = [MD5Token(0)]
96+
nts = NetworkTopologyStrategy({'dc1': 1, 'dc2': 0})
97+
98+
replica_map = nts.make_token_replica_map(token_to_host_owner, ring)
99+
self.assertEqual(replica_map[MD5Token(0)], set([host]))
100+
101+
def test_nts_export_for_schema(self):
55102
# TODO: Cover NetworkTopologyStrategy.export_for_schema()
56103
pass
57104

105+
def test_simple_strategy_make_token_replica_map(self):
106+
host1 = Host('1', SimpleConvictionPolicy)
107+
host2 = Host('2', SimpleConvictionPolicy)
108+
host3 = Host('3', SimpleConvictionPolicy)
109+
token_to_host_owner = {
110+
MD5Token(0): host1,
111+
MD5Token(100): host2,
112+
MD5Token(200): host3
113+
}
114+
ring = [MD5Token(0), MD5Token(100), MD5Token(200)]
115+
116+
rf1_replicas = SimpleStrategy(1).make_token_replica_map(token_to_host_owner, ring)
117+
self.assertItemsEqual(rf1_replicas[MD5Token(0)], [host1])
118+
self.assertItemsEqual(rf1_replicas[MD5Token(100)], [host2])
119+
self.assertItemsEqual(rf1_replicas[MD5Token(200)], [host3])
120+
121+
rf2_replicas = SimpleStrategy(2).make_token_replica_map(token_to_host_owner, ring)
122+
self.assertItemsEqual(rf2_replicas[MD5Token(0)], [host1, host2])
123+
self.assertItemsEqual(rf2_replicas[MD5Token(100)], [host2, host3])
124+
self.assertItemsEqual(rf2_replicas[MD5Token(200)], [host3, host1])
125+
126+
rf3_replicas = SimpleStrategy(3).make_token_replica_map(token_to_host_owner, ring)
127+
self.assertItemsEqual(rf3_replicas[MD5Token(0)], [host1, host2, host3])
128+
self.assertItemsEqual(rf3_replicas[MD5Token(100)], [host2, host3, host1])
129+
self.assertItemsEqual(rf3_replicas[MD5Token(200)], [host3, host1, host2])
58130

59131
class TestTokens(unittest.TestCase):
60132

@@ -141,7 +213,7 @@ def test_token_values(self):
141213
md5_token = MD5Token(cassandra.metadata.MIN_LONG - 1)
142214
self.assertEqual(md5_token.hash_fn('123'), 42767516990368493138776584305024125808L)
143215
self.assertEqual(md5_token.hash_fn(str(cassandra.metadata.MAX_LONG)), 28528976619278518853815276204542453639L)
144-
self.assertEqual(str(md5_token), '<MD5Token: -9223372036854775809>')
216+
self.assertEqual(str(md5_token), '<MD5Token: -9223372036854775809L>')
145217

146218
bytes_token = BytesToken(str(cassandra.metadata.MIN_LONG - 1))
147219
self.assertEqual(bytes_token.hash_fn('123'), '123')

0 commit comments

Comments
 (0)