|
1 | 1 | import unittest |
| 2 | + |
2 | 3 | import cassandra |
3 | 4 | from cassandra.metadata import (TableMetadata, Murmur3Token, MD5Token, |
4 | 5 | BytesToken, ReplicationStrategy, |
5 | 6 | NetworkTopologyStrategy, SimpleStrategy, |
6 | 7 | LocalStrategy) |
| 8 | +from cassandra.policies import SimpleConvictionPolicy |
| 9 | +from cassandra.pool import Host |
7 | 10 |
|
8 | 11 |
|
9 | 12 | class TestStrategies(unittest.TestCase): |
@@ -50,11 +53,80 @@ def test_replication_strategy(self): |
50 | 53 | self.assertRaises(NotImplementedError, rs.make_token_replica_map, None, None) |
51 | 54 | self.assertRaises(NotImplementedError, rs.export_for_schema) |
52 | 55 |
|
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): |
55 | 102 | # TODO: Cover NetworkTopologyStrategy.export_for_schema() |
56 | 103 | pass |
57 | 104 |
|
| 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]) |
58 | 130 |
|
59 | 131 | class TestTokens(unittest.TestCase): |
60 | 132 |
|
@@ -141,7 +213,7 @@ def test_token_values(self): |
141 | 213 | md5_token = MD5Token(cassandra.metadata.MIN_LONG - 1) |
142 | 214 | self.assertEqual(md5_token.hash_fn('123'), 42767516990368493138776584305024125808L) |
143 | 215 | 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>') |
145 | 217 |
|
146 | 218 | bytes_token = BytesToken(str(cassandra.metadata.MIN_LONG - 1)) |
147 | 219 | self.assertEqual(bytes_token.hash_fn('123'), '123') |
|
0 commit comments