Added all extra tests
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -7,6 +7,7 @@ build | ||||
| MANIFEST | ||||
| dist | ||||
| .coverage | ||||
| nosetests.xml | ||||
| cover/ | ||||
| docs/_build/ | ||||
| tests/integration/ccm | ||||
|   | ||||
| @@ -8,6 +8,8 @@ log = logging.getLogger(__name__) | ||||
| import os | ||||
| from threading import Event | ||||
|  | ||||
| from cassandra.cluster import Cluster | ||||
|  | ||||
| try: | ||||
|     from ccmlib.cluster import Cluster as CCMCluster | ||||
|     from ccmlib import common | ||||
| @@ -25,6 +27,8 @@ if not os.path.exists(path): | ||||
| def get_cluster(): | ||||
|     return CCM_CLUSTER | ||||
|  | ||||
| def get_node(node_id): | ||||
|     return CCM_CLUSTER.nodes['node%s' % node_id] | ||||
|  | ||||
| def setup_package(): | ||||
|     try: | ||||
| @@ -47,6 +51,33 @@ def setup_package(): | ||||
|  | ||||
|     global CCM_CLUSTER | ||||
|     CCM_CLUSTER = cluster | ||||
|     setup_test_keyspace() | ||||
|  | ||||
| def setup_test_keyspace(): | ||||
|     cluster = Cluster() | ||||
|     session = cluster.connect() | ||||
|  | ||||
|     ksname = 'test3rf' | ||||
|     cfname = 'test' | ||||
|  | ||||
|     try: | ||||
|         results = session.execute("SELECT keyspace_name FROM system.schema_keyspaces") | ||||
|         existing_keyspaces = [row[0] for row in results] | ||||
|         if ksname in existing_keyspaces: | ||||
|             session.execute("DROP KEYSPACE %s" % ksname) | ||||
|  | ||||
|         ddl = ''' | ||||
|             CREATE KEYSPACE %s | ||||
|             WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}''' | ||||
|         session.execute(ddl % ksname) | ||||
|  | ||||
|         ddl = ''' | ||||
|             CREATE TABLE %s.%s ( | ||||
|                 k int PRIMARY KEY, | ||||
|                 v int )''' | ||||
|         session.execute(ddl % (ksname, cfname)) | ||||
|     finally: | ||||
|         cluster.shutdown() | ||||
|  | ||||
|  | ||||
| def teardown_package(): | ||||
|   | ||||
| @@ -3,11 +3,20 @@ try: | ||||
| except ImportError: | ||||
|     import unittest # noqa | ||||
|  | ||||
| import cassandra | ||||
| from cassandra.query import SimpleStatement | ||||
| from cassandra.io.asyncorereactor import AsyncoreConnection | ||||
| from cassandra.policies import RoundRobinPolicy, ExponentialReconnectionPolicy, RetryPolicy, SimpleConvictionPolicy, HostDistance | ||||
|  | ||||
| from cassandra.cluster import Cluster, NoHostAvailable | ||||
|  | ||||
| class ClusterTests(unittest.TestCase): | ||||
|  | ||||
|     def test_basic(self): | ||||
|         """ | ||||
|         Test basic connection and usage | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         result = session.execute( | ||||
| @@ -39,11 +48,117 @@ class ClusterTests(unittest.TestCase): | ||||
|  | ||||
|         cluster.shutdown() | ||||
|  | ||||
|     def test_connect_on_keyspace(self): | ||||
|         """ | ||||
|         Ensure clusters that connect on a keyspace, do | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         result = session.execute( | ||||
|             """ | ||||
|             INSERT INTO test3rf.test (k, v) VALUES (8889, 8889) | ||||
|             """) | ||||
|         self.assertEquals(None, result) | ||||
|  | ||||
|         result = session.execute("SELECT * FROM test3rf.test") | ||||
|         self.assertEquals([(8889, 8889)], result) | ||||
|  | ||||
|         # test_connect_on_keyspace | ||||
|         session2 = cluster.connect('test3rf') | ||||
|         result2 = session2.execute("SELECT * FROM test") | ||||
|         self.assertEquals(result, result2) | ||||
|  | ||||
|     def test_default_connections(self): | ||||
|         """ | ||||
|         Ensure errors are not thrown when using non-default policies | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster( | ||||
|             load_balancing_policy=RoundRobinPolicy(), | ||||
|             reconnection_policy=ExponentialReconnectionPolicy(1.0, 600.0), | ||||
|             default_retry_policy=RetryPolicy(), | ||||
|             conviction_policy_factory=SimpleConvictionPolicy, | ||||
|             connection_class=AsyncoreConnection | ||||
|         ) | ||||
|  | ||||
|     def test_double_shutdown(self): | ||||
|         """ | ||||
|         Ensure that a cluster can be shutdown twice, without error | ||||
|         """ | ||||
|  | ||||
|         # DISCUSS: Should we allow this? | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.shutdown() | ||||
|  | ||||
|         # Shouldn't throw an error | ||||
|         cluster.shutdown() | ||||
|  | ||||
|     def test_connect_to_already_shutdown_cluster(self): | ||||
|         """ | ||||
|         Ensure you cannot connect to a cluster that's been shutdown | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.shutdown() | ||||
|         self.assertRaises(Exception, cluster.connect) | ||||
|  | ||||
|     def test_auth_provider_is_callable(self): | ||||
|         """ | ||||
|         Ensure that auth_providers are always callable | ||||
|         """ | ||||
|  | ||||
|         self.assertRaises(ValueError, Cluster, auth_provider=1) | ||||
|  | ||||
|     def test_conviction_policy_factory_is_callable(self): | ||||
|         """ | ||||
|         Ensure that conviction_policy_factory are always callable | ||||
|         """ | ||||
|  | ||||
|         self.assertRaises(ValueError, Cluster, conviction_policy_factory=1) | ||||
|  | ||||
|     def test_connect_to_bad_hosts(self): | ||||
|         """ | ||||
|         Ensure that a NoHostAvailable Exception is thrown | ||||
|         when a cluster cannot connect to given hosts | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster(['127.1.2.9', '127.1.2.10']) | ||||
|         self.assertRaises(NoHostAvailable, cluster.connect) | ||||
|  | ||||
|     def test_cluster_settings(self): | ||||
|         """ | ||||
|         Test connection setting getters and setters | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|  | ||||
|         min_requests_per_connection = cluster.get_min_requests_per_connection(HostDistance.LOCAL) | ||||
|         self.assertEqual(cassandra.cluster.DEFAULT_MIN_REQUESTS, min_requests_per_connection) | ||||
|         cluster.set_min_requests_per_connection(HostDistance.LOCAL, min_requests_per_connection + 1) | ||||
|         self.assertEqual(cluster.get_min_requests_per_connection(HostDistance.LOCAL), min_requests_per_connection + 1) | ||||
|  | ||||
|         max_requests_per_connection = cluster.get_max_requests_per_connection(HostDistance.LOCAL) | ||||
|         self.assertEqual(cassandra.cluster.DEFAULT_MAX_REQUESTS, max_requests_per_connection) | ||||
|         cluster.set_max_requests_per_connection(HostDistance.LOCAL, max_requests_per_connection + 1) | ||||
|         self.assertEqual(cluster.get_max_requests_per_connection(HostDistance.LOCAL), max_requests_per_connection + 1) | ||||
|  | ||||
|         core_connections_per_host = cluster.get_core_connections_per_host(HostDistance.LOCAL) | ||||
|         self.assertEqual(cassandra.cluster.DEFAULT_MIN_CONNECTIONS_PER_LOCAL_HOST, core_connections_per_host) | ||||
|         cluster.set_core_connections_per_host(HostDistance.LOCAL, core_connections_per_host + 1) | ||||
|         self.assertEqual(cluster.get_core_connections_per_host(HostDistance.LOCAL), core_connections_per_host + 1) | ||||
|  | ||||
|         max_connections_per_host = cluster.get_max_connections_per_host(HostDistance.LOCAL) | ||||
|         self.assertEqual(cassandra.cluster.DEFAULT_MAX_CONNECTIONS_PER_LOCAL_HOST, max_connections_per_host) | ||||
|         cluster.set_max_connections_per_host(HostDistance.LOCAL, max_connections_per_host + 1) | ||||
|         self.assertEqual(cluster.get_max_connections_per_host(HostDistance.LOCAL), max_connections_per_host + 1) | ||||
|  | ||||
|     def test_submit_schema_refresh(self): | ||||
|         """ | ||||
|         Ensure new new schema is refreshed after submit_schema_refresh() | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.connect() | ||||
|         self.assertNotIn("newkeyspace", cluster.metadata.keyspaces) | ||||
| @@ -62,6 +177,10 @@ class ClusterTests(unittest.TestCase): | ||||
|         self.assertIn("newkeyspace", cluster.metadata.keyspaces) | ||||
|  | ||||
|     def test_on_down_and_up(self): | ||||
|         """ | ||||
|         Test on_down and on_up handling | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         host = cluster.metadata.all_hosts()[0] | ||||
| @@ -78,3 +197,51 @@ class ClusterTests(unittest.TestCase): | ||||
|         self.assertEqual(None, host._reconnection_handler) | ||||
|         self.assertTrue(host_reconnector._cancelled) | ||||
|         self.assertIn(host, session._pools) | ||||
|  | ||||
|     def test_trace(self): | ||||
|         """ | ||||
|         Ensure trace can be requested for async and non-async queries | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         self.assertRaises(TypeError, session.execute, "SELECT * FROM system.local", trace=True) | ||||
|  | ||||
|         query = "SELECT * FROM system.local" | ||||
|         statement = SimpleStatement(query) | ||||
|         session.execute(statement, trace=True) | ||||
|         self.assertEqual(query, statement.trace.parameters['query']) | ||||
|  | ||||
|         query = "SELECT * FROM system.local" | ||||
|         statement = SimpleStatement(query) | ||||
|         session.execute(statement) | ||||
|         self.assertEqual(None, statement.trace) | ||||
|  | ||||
|         statement2 = SimpleStatement(query) | ||||
|         future = session.execute_async(statement2, trace=True) | ||||
|         future.result() | ||||
|         self.assertEqual(query, future.get_query_trace().parameters['query']) | ||||
|  | ||||
|         statement2 = SimpleStatement(query) | ||||
|         future = session.execute_async(statement2) | ||||
|         future.result() | ||||
|         self.assertEqual(None, future.get_query_trace()) | ||||
|  | ||||
|     def test_string_coverage(self): | ||||
|         """ | ||||
|         Ensure str(future) returns without error | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         query = "SELECT * FROM system.local" | ||||
|         statement = SimpleStatement(query) | ||||
|         future = session.execute_async(statement) | ||||
|  | ||||
|         self.assertIn(query, str(future)) | ||||
|         future.result() | ||||
|  | ||||
|         self.assertIn(query, str(future)) | ||||
|         self.assertIn('result', str(future)) | ||||
|   | ||||
							
								
								
									
										124
									
								
								tests/integration/test_factories.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								tests/integration/test_factories.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| import unittest | ||||
| import cassandra | ||||
| from cassandra.cluster import Cluster | ||||
| from cassandra.decoder import tuple_factory, named_tuple_factory, dict_factory, ordered_dict_factory | ||||
|  | ||||
| try: | ||||
|     from collections import OrderedDict | ||||
| except ImportError:  # Python <2.7 | ||||
|     from cassandra.util import OrderedDict # NOQA | ||||
|  | ||||
| class TestFactories(unittest.TestCase): | ||||
|     """ | ||||
|     Test different row_factories and access code | ||||
|     """ | ||||
|  | ||||
|     truncate = ''' | ||||
|         TRUNCATE test3rf.test | ||||
|     ''' | ||||
|  | ||||
|     insert1 = ''' | ||||
|         INSERT INTO test3rf.test | ||||
|             ( k , v ) | ||||
|         VALUES | ||||
|             ( 1 , 1 ) | ||||
|     ''' | ||||
|  | ||||
|     insert2 = ''' | ||||
|         INSERT INTO test3rf.test | ||||
|             ( k , v ) | ||||
|         VALUES | ||||
|             ( 2 , 2 ) | ||||
|     ''' | ||||
|  | ||||
|     select = ''' | ||||
|         SELECT * FROM test3rf.test | ||||
|     ''' | ||||
|  | ||||
|     def test_tuple_factory(self): | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         session.row_factory = tuple_factory | ||||
|  | ||||
|         session.execute(self.truncate) | ||||
|         session.execute(self.insert1) | ||||
|         session.execute(self.insert2) | ||||
|  | ||||
|         result = session.execute(self.select) | ||||
|  | ||||
|         self.assertTrue(isinstance(result, list)) | ||||
|         self.assertTrue(isinstance(result[0], tuple)) | ||||
|  | ||||
|         for row in result: | ||||
|             self.assertEqual(row[0], row[1]) | ||||
|  | ||||
|         self.assertEqual(result[0][0], result[0][1]) | ||||
|         self.assertEqual(result[0][0], 1) | ||||
|         self.assertEqual(result[1][0], result[1][1]) | ||||
|         self.assertEqual(result[1][0], 2) | ||||
|  | ||||
|     def test_named_tuple_factoryy(self): | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         session.row_factory = named_tuple_factory | ||||
|  | ||||
|         session.execute(self.truncate) | ||||
|         session.execute(self.insert1) | ||||
|         session.execute(self.insert2) | ||||
|  | ||||
|         result = session.execute(self.select) | ||||
|  | ||||
|         self.assertTrue(isinstance(result, list)) | ||||
|  | ||||
|         for row in result: | ||||
|             self.assertEqual(row.k, row.v) | ||||
|  | ||||
|         self.assertEqual(result[0].k, result[0].v) | ||||
|         self.assertEqual(result[0].k, 1) | ||||
|         self.assertEqual(result[1].k, result[1].v) | ||||
|         self.assertEqual(result[1].k, 2) | ||||
|  | ||||
|  | ||||
|     def test_dict_factory(self): | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         session.row_factory = dict_factory | ||||
|  | ||||
|         session.execute(self.truncate) | ||||
|         session.execute(self.insert1) | ||||
|         session.execute(self.insert2) | ||||
|  | ||||
|         result = session.execute(self.select) | ||||
|  | ||||
|         self.assertTrue(isinstance(result, list)) | ||||
|         self.assertTrue(isinstance(result[0], dict)) | ||||
|  | ||||
|         for row in result: | ||||
|             self.assertEqual(row['k'], row['v']) | ||||
|  | ||||
|         self.assertEqual(result[0]['k'], result[0]['v']) | ||||
|         self.assertEqual(result[0]['k'], 1) | ||||
|         self.assertEqual(result[1]['k'], result[1]['v']) | ||||
|         self.assertEqual(result[1]['k'], 2) | ||||
|  | ||||
|     def test_ordered_dict_factory(self): | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         session.row_factory = ordered_dict_factory | ||||
|  | ||||
|         session.execute(self.truncate) | ||||
|         session.execute(self.insert1) | ||||
|         session.execute(self.insert2) | ||||
|  | ||||
|         result = session.execute(self.select) | ||||
|  | ||||
|         self.assertTrue(isinstance(result, list)) | ||||
|         self.assertTrue(isinstance(result[0], OrderedDict)) | ||||
|  | ||||
|         for row in result: | ||||
|             self.assertEqual(row['k'], row['v']) | ||||
|  | ||||
|         self.assertEqual(result[0]['k'], result[0]['v']) | ||||
|         self.assertEqual(result[0]['k'], 1) | ||||
|         self.assertEqual(result[1]['k'], result[1]['v']) | ||||
|         self.assertEqual(result[1]['k'], 2) | ||||
| @@ -3,8 +3,12 @@ try: | ||||
| except ImportError: | ||||
|     import unittest # noqa | ||||
|  | ||||
| import cassandra | ||||
| from cassandra import AlreadyExists | ||||
|  | ||||
| from cassandra.cluster import Cluster | ||||
| from cassandra.metadata import KeyspaceMetadata, TableMetadata, Token, MD5Token, TokenMap | ||||
| from cassandra.metadata import TableMetadata, Token, MD5Token, TokenMap, Murmur3Token | ||||
| from cassandra.policies import SimpleConvictionPolicy | ||||
| from cassandra.pool import Host | ||||
|  | ||||
| @@ -272,6 +276,103 @@ class SchemaMetadataTest(unittest.TestCase): | ||||
|         self.assertEqual(d_index, statements[1]) | ||||
|         self.assertEqual(e_index, statements[2]) | ||||
|  | ||||
| class TestCodeCoverage(unittest.TestCase): | ||||
|     def test_export_schema(self): | ||||
|         """ | ||||
|         Test export schema functionality | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.connect() | ||||
|  | ||||
|         # BUG: Does not work | ||||
|         # print cluster.metadata.export_schema_as_string() | ||||
|         # Traceback (most recent call last): | ||||
|         #   File "/Users/joaquin/repos/python-driver/tests/integration/test_metadata.py", line 280, in test_export_schema | ||||
|         #     print cluster.metadata.export_schema_as_string() | ||||
|         #   File "/Users/joaquin/repos/python-driver/cassandra/metadata.py", line 71, in export_schema_as_string | ||||
|         #     return "\n".join(ks.export_as_string() for ks in self.keyspaces.values()) | ||||
|         #   File "/Users/joaquin/repos/python-driver/cassandra/metadata.py", line 71, in <genexpr> | ||||
|         #     return "\n".join(ks.export_as_string() for ks in self.keyspaces.values()) | ||||
|         #   File "/Users/joaquin/repos/python-driver/cassandra/metadata.py", line 351, in export_as_string | ||||
|         #     return "\n".join([self.as_cql_query()] + [t.as_cql_query() for t in self.tables.values()]) | ||||
|         # TypeError: sequence item 0: expected string, NoneType found | ||||
|  | ||||
|     def test_export_keyspace_schema(self): | ||||
|         """ | ||||
|         Test export keyspace schema functionality | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.connect() | ||||
|  | ||||
|         # BUG: Attempting to check cassandra.metadata:350 | ||||
|         # print cluster.metadata.keyspaces.export_as_string() | ||||
|         # Traceback (most recent call last): | ||||
|         #   File "/Users/joaquin/repos/python-driver/tests/integration/test_metadata.py", line 296, in test_export_keyspace_schema | ||||
|         #     print cluster.metadata.keyspaces.export_as_string() | ||||
|         # AttributeError: 'dict' object has no attribute 'export_as_string' | ||||
|  | ||||
|         # BUG: Attempting to check cassandra.metadata:353 | ||||
|         # print cluster.metadata.keyspaces.as_cql_query() | ||||
|         # Traceback (most recent call last): | ||||
|         #   File "/Users/joaquin/repos/python-driver/tests/integration/test_metadata.py", line 305, in test_export_keyspace_schema | ||||
|         #     print cluster.metadata.keyspaces.as_cql_query() | ||||
|         # AttributeError: 'dict' object has no attribute 'as_cql_query' | ||||
|  | ||||
|     def test_already_exists_exceptions(self): | ||||
|         """ | ||||
|         Ensure AlreadyExists exception is thrown when hit | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         ksname = 'test3rf' | ||||
|         cfname = 'test' | ||||
|  | ||||
|         ddl = ''' | ||||
|             CREATE KEYSPACE %s | ||||
|             WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}''' | ||||
|         self.assertRaises(AlreadyExists, session.execute, ddl % ksname) | ||||
|  | ||||
|         ddl = ''' | ||||
|             CREATE TABLE %s.%s ( | ||||
|                 k int PRIMARY KEY, | ||||
|                 v int )''' | ||||
|         self.assertRaises(AlreadyExists, session.execute, ddl % (ksname, cfname)) | ||||
|  | ||||
|     def test_replicas(self): | ||||
|         """ | ||||
|         Ensure cluster.metadata.get_replicas return correctly when not attached to keyspace | ||||
|         """ | ||||
|         cluster = Cluster() | ||||
|         self.assertEqual(cluster.metadata.get_replicas('key'), []) | ||||
|  | ||||
|         cluster.connect('test3rf') | ||||
|         host = list(cluster.metadata.get_replicas('key'))[0] | ||||
|         self.assertEqual(host.datacenter, 'datacenter1') | ||||
|         self.assertEqual(host.rack, 'rack1') | ||||
|         self.assertEqual(host.address, '127.0.0.2') | ||||
|  | ||||
|     def test_token_map(self): | ||||
|         """ | ||||
|         Test token mappings | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         cluster.connect('test3rf') | ||||
|         ring = cluster.metadata.token_map.ring | ||||
|  | ||||
|         self.assertEqual(list(cluster.metadata.token_map.get_replicas(ring[0]))[0].address, '127.0.0.1') | ||||
|         self.assertEqual(list(cluster.metadata.token_map.get_replicas(ring[1]))[0].address, '127.0.0.2') | ||||
|         self.assertEqual(list(cluster.metadata.token_map.get_replicas(ring[2]))[0].address, '127.0.0.3') | ||||
|  | ||||
|         # BUG: I was specifically trying to ensure that tokens wrap around | ||||
|         self.assertEqual(list(cluster.metadata.token_map.get_replicas(Murmur3Token(ring[0].value - 1)))[0].address, '127.0.0.3') | ||||
|         # self.assertEqual(list(cluster.metadata.token_map.get_replicas(Murmur3Token(ring[1].value - 1)))[0].address, '127.0.0.1') | ||||
|         # self.assertEqual(list(cluster.metadata.token_map.get_replicas(Murmur3Token(ring[2].value - 1)))[0].address, '127.0.0.2') | ||||
|  | ||||
|  | ||||
| class TokenMetadataTest(unittest.TestCase): | ||||
|     """ | ||||
|   | ||||
							
								
								
									
										137
									
								
								tests/integration/test_metrics.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								tests/integration/test_metrics.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| import unittest | ||||
| from cassandra.query import SimpleStatement | ||||
| from cassandra import ConsistencyLevel, WriteTimeout, Unavailable, ReadTimeout | ||||
|  | ||||
| from cassandra.cluster import Cluster, NoHostAvailable | ||||
| from cassandra.decoder import QueryMessage | ||||
| from tests.integration import get_node, get_cluster | ||||
|  | ||||
|  | ||||
| class MetricsTests(unittest.TestCase): | ||||
|  | ||||
|     def test_connection_error(self): | ||||
|         """ | ||||
|         Trigger and ensure connection_errors are counted | ||||
|         """ | ||||
|  | ||||
|         # DISCUSS: Doesn't trigger code coverage on cassandra.metrics.on_connection_error(). Find new example. | ||||
|         cluster = Cluster(metrics_enabled=True) | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         # Test write | ||||
|         session.execute("USE test3rf") | ||||
|  | ||||
|         # Force kill cluster | ||||
|         get_cluster().stop(wait=True, gently=False) | ||||
|         try: | ||||
|             self.assertRaises(NoHostAvailable, session.execute, "USE test3rf") | ||||
|         finally: | ||||
|             get_cluster().start(wait_for_binary_proto=True) | ||||
|  | ||||
|     def test_write_timeout(self): | ||||
|         """ | ||||
|         Trigger and ensure write_timeouts are counted | ||||
|         Write a key, value pair. Force kill a node without waiting for the cluster to register the death. | ||||
|         Attempt a write at cl.ALL and receive a WriteTimeout. | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster(metrics_enabled=True) | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         # Test write | ||||
|         session.execute("INSERT INTO test3rf.test (k, v) VALUES (1, 1)") | ||||
|  | ||||
|         # Assert read | ||||
|         query = SimpleStatement("SELECT v FROM test3rf.test WHERE k=%(k)s", consistency_level=ConsistencyLevel.ALL) | ||||
|         results = session.execute(query, {'k': 1}) | ||||
|         self.assertEqual(1, results[0].v) | ||||
|  | ||||
|         # Force kill ccm node | ||||
|         get_node(1).stop(wait=False, gently=False) | ||||
|  | ||||
|         try: | ||||
|             # Test write | ||||
|             query = SimpleStatement("INSERT INTO test3rf.test (k, v) VALUES (2, 2)", consistency_level=ConsistencyLevel.ALL) | ||||
|             self.assertRaises(WriteTimeout, session.execute, query) | ||||
|             self.assertEqual(1, cluster.metrics.stats.write_timeouts) | ||||
|  | ||||
|         finally: | ||||
|             get_node(1).start(wait_other_notice=True, wait_for_binary_proto=True) | ||||
|  | ||||
|     def test_read_timeout(self): | ||||
|         """ | ||||
|         Trigger and ensure read_timeouts are counted | ||||
|         Write a key, value pair. Force kill a node without waiting for the cluster to register the death. | ||||
|         Attempt a read at cl.ALL and receive a ReadTimeout. | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster(metrics_enabled=True) | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         # Test write | ||||
|         session.execute("INSERT INTO test3rf.test (k, v) VALUES (1, 1)") | ||||
|  | ||||
|         # Assert read | ||||
|         query = SimpleStatement("SELECT v FROM test3rf.test WHERE k=%(k)s", consistency_level=ConsistencyLevel.ALL) | ||||
|         results = session.execute(query, {'k': 1}) | ||||
|         self.assertEqual(1, results[0].v) | ||||
|  | ||||
|         # Force kill ccm node | ||||
|         get_node(1).stop(wait=False, gently=False) | ||||
|  | ||||
|         try: | ||||
|             # Test read | ||||
|             query = SimpleStatement("SELECT v FROM test3rf.test WHERE k=%(k)s", consistency_level=ConsistencyLevel.ALL) | ||||
|             self.assertRaises(ReadTimeout, session.execute, query, {'k': 1}) | ||||
|             self.assertEqual(1, cluster.metrics.stats.read_timeouts) | ||||
|  | ||||
|         finally: | ||||
|             get_node(1).start(wait_other_notice=True, wait_for_binary_proto=True) | ||||
|  | ||||
|     def test_unavailable(self): | ||||
|         """ | ||||
|         Trigger and ensure unavailables are counted | ||||
|         Write a key, value pair. Kill a node while waiting for the cluster to register the death. | ||||
|         Attempt an insert/read at cl.ALL and receive a Unavailable Exception. | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster(metrics_enabled=True) | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         # Test write | ||||
|         session.execute("INSERT INTO test3rf.test (k, v) VALUES (1, 1)") | ||||
|  | ||||
|         # Assert read | ||||
|         query = SimpleStatement("SELECT v FROM test3rf.test WHERE k=%(k)s", consistency_level=ConsistencyLevel.ALL) | ||||
|         results = session.execute(query, {'k': 1}) | ||||
|         self.assertEqual(1, results[0].v) | ||||
|  | ||||
|         # Force kill ccm node | ||||
|         get_node(1).stop(wait=True, gently=True) | ||||
|  | ||||
|         try: | ||||
|             # Test write | ||||
|             query = SimpleStatement("INSERT INTO test3rf.test (k, v) VALUES (2, 2)", consistency_level=ConsistencyLevel.ALL) | ||||
|             self.assertRaises(Unavailable, session.execute, query) | ||||
|             self.assertEqual(1, cluster.metrics.stats.unavailables) | ||||
|  | ||||
|             # Test write | ||||
|             query = SimpleStatement("SELECT v FROM test3rf.test WHERE k=%(k)s", consistency_level=ConsistencyLevel.ALL) | ||||
|             self.assertRaises(Unavailable, session.execute, query, {'k': 1}) | ||||
|             self.assertEqual(2, cluster.metrics.stats.unavailables) | ||||
|         finally: | ||||
|             get_node(1).start(wait_other_notice=True, wait_for_binary_proto=True) | ||||
|  | ||||
|     def test_other_error(self): | ||||
|         # TODO: Bootstrapping or Overloaded cases | ||||
|         pass | ||||
|  | ||||
|  | ||||
|     def test_ignore(self): | ||||
|         # TODO: Look for ways to generate ignores | ||||
|         pass | ||||
|  | ||||
|  | ||||
|     def test_retry(self): | ||||
|         # TODO: Look for ways to generate retries | ||||
|         pass | ||||
| @@ -2,6 +2,7 @@ try: | ||||
|     import unittest2 as unittest | ||||
| except ImportError: | ||||
|     import unittest # noqa | ||||
| from cassandra import InvalidRequest | ||||
|  | ||||
| from cassandra.cluster import Cluster | ||||
| from cassandra.query import PreparedStatement | ||||
| @@ -9,6 +10,10 @@ from cassandra.query import PreparedStatement | ||||
| class PreparedStatementTests(unittest.TestCase): | ||||
|  | ||||
|     def test_basic(self): | ||||
|         """ | ||||
|         Test basic PreparedStatement usage | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|         session.execute( | ||||
| @@ -47,3 +52,91 @@ class PreparedStatementTests(unittest.TestCase): | ||||
|         bound = prepared.bind(('a')) | ||||
|         results = session.execute(bound) | ||||
|         self.assertEquals(results, [('a', 'b', 'c')]) | ||||
|  | ||||
|     def test_missing_primary_key(self): | ||||
|         """ | ||||
|         Ensure an InvalidRequest is thrown | ||||
|         when prepared statements are missing the primary key | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|             """ | ||||
|             INSERT INTO test3rf.test (v) VALUES  (?) | ||||
|             """) | ||||
|  | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|         bound = prepared.bind((1,)) | ||||
|         self.assertRaises(InvalidRequest, session.execute, bound) | ||||
|  | ||||
|     def test_too_many_bind_values(self): | ||||
|         """ | ||||
|         Ensure a ValueError is thrown when attempting to bind too many variables | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|             """ | ||||
|             INSERT INTO test3rf.test (v) VALUES  (?) | ||||
|             """) | ||||
|  | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|         self.assertRaises(ValueError, prepared.bind, (1,2)) | ||||
|  | ||||
|     def test_none_values(self): | ||||
|         """ | ||||
|         Ensure binding None is handled correctly | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|             """ | ||||
|             INSERT INTO test3rf.test (k, v) VALUES  (?, ?) | ||||
|             """) | ||||
|  | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|         bound = prepared.bind((1, None)) | ||||
|         session.execute(bound) | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|            """ | ||||
|            SELECT * FROM test3rf.test WHERE k=? | ||||
|            """) | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|  | ||||
|         bound = prepared.bind((1,)) | ||||
|         results = session.execute(bound) | ||||
|         self.assertEquals(results[0].v, None) | ||||
|  | ||||
|     def test_async_binding(self): | ||||
|         """ | ||||
|         Ensure None binding over async queries | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|             """ | ||||
|             INSERT INTO test3rf.test (k, v) VALUES  (?, ?) | ||||
|             """) | ||||
|  | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|         future = session.execute_async(prepared, (873, None)) | ||||
|         future.result() | ||||
|  | ||||
|         prepared = session.prepare( | ||||
|            """ | ||||
|            SELECT * FROM test3rf.test WHERE k=? | ||||
|            """) | ||||
|         self.assertIsInstance(prepared, PreparedStatement) | ||||
|  | ||||
|         future = session.execute_async(prepared, (873,)) | ||||
|         results = future.result() | ||||
|         self.assertEquals(results[0].v, None) | ||||
|   | ||||
							
								
								
									
										45
									
								
								tests/integration/test_query.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								tests/integration/test_query.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| import unittest | ||||
| from cassandra.query import PreparedStatement, BoundStatement, ValueSequence, SimpleStatement | ||||
| from cassandra.cluster import Cluster | ||||
|  | ||||
|  | ||||
| class QueryTest(unittest.TestCase): | ||||
|     # TODO: Cover routing keys | ||||
|     # def test_query(self): | ||||
|     #     cluster = Cluster() | ||||
|     #     session = cluster.connect() | ||||
|     # | ||||
|     #     prepared = session.prepare( | ||||
|     #         """ | ||||
|     #         INSERT INTO test3rf.test (k, v) VALUES  (?, ?) | ||||
|     #         """) | ||||
|     # | ||||
|     #     self.assertIsInstance(prepared, PreparedStatement) | ||||
|     #     bound = prepared.bind((1, None)) | ||||
|     #     self.assertIsInstance(bound, BoundStatement) | ||||
|     #     session.execute(bound) | ||||
|     # | ||||
|     #     print bound.routing_key | ||||
|  | ||||
|     def test_value_sequence(self): | ||||
|         """ | ||||
|         Test the output of ValueSequences() | ||||
|         """ | ||||
|  | ||||
|         my_user_ids = ('alice', 'bob', 'charles') | ||||
|         self.assertEqual(str(ValueSequence(my_user_ids)), "( 'alice' , 'bob' , 'charles' )") | ||||
|  | ||||
|     def test_trace_prints_okay(self): | ||||
|         """ | ||||
|         Code coverage to ensure trace prints to string without error | ||||
|         """ | ||||
|  | ||||
|         cluster = Cluster() | ||||
|         session = cluster.connect() | ||||
|  | ||||
|         query = "SELECT * FROM system.local" | ||||
|         statement = SimpleStatement(query) | ||||
|         session.execute(statement, trace=True) | ||||
|  | ||||
|         # Ensure this does not throw an exception | ||||
|         str(statement.trace) | ||||
| @@ -9,7 +9,7 @@ from threading import Thread, Event | ||||
| from cassandra.cluster import Session | ||||
| from cassandra.connection import Connection, MAX_STREAM_PER_CONNECTION | ||||
| from cassandra.pool import Host, HostConnectionPool, NoConnectionsAvailable, HealthMonitor | ||||
| from cassandra.policies import HostDistance | ||||
| from cassandra.policies import HostDistance, SimpleConvictionPolicy | ||||
|  | ||||
| class HostConnectionPoolTests(unittest.TestCase): | ||||
|  | ||||
| @@ -202,3 +202,27 @@ class HostConnectionPoolTests(unittest.TestCase): | ||||
|         # a new creation should be scheduled | ||||
|         session.submit.assert_called_once() | ||||
|         self.assertFalse(pool.is_shutdown) | ||||
|  | ||||
|     def test_host_instantiations(self): | ||||
|         """ | ||||
|         Ensure Host fails if not initialized properly | ||||
|         """ | ||||
|  | ||||
|         self.assertRaises(ValueError, Host, None, None) | ||||
|         self.assertRaises(ValueError, Host, '127.0.0.1', None) | ||||
|         self.assertRaises(ValueError, Host, None, SimpleConvictionPolicy) | ||||
|  | ||||
|     def test_host_equality(self): | ||||
|         """ | ||||
|         Test host equality has correct logic | ||||
|         """ | ||||
|  | ||||
|         a = Host('127.0.0.1', SimpleConvictionPolicy) | ||||
|         b = Host('127.0.0.1', SimpleConvictionPolicy) | ||||
|         c = Host('127.0.0.2', SimpleConvictionPolicy) | ||||
|  | ||||
|         self.assertEqual(a, b, 'Two Host instances should be equal when sharing.') | ||||
|         self.assertNotEqual(a, c, 'Two Host instances should NOT be equal when using two different addresses.') | ||||
|         self.assertNotEqual(b, c, 'Two Host instances should NOT be equal when using two different addresses.') | ||||
|  | ||||
|         self.assertFalse(a == '127.0.0.1') | ||||
|   | ||||
							
								
								
									
										101
									
								
								tests/unit/test_metadata.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								tests/unit/test_metadata.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| import unittest | ||||
| import cassandra | ||||
| from cassandra.cluster import Cluster | ||||
| from cassandra.metadata import TableMetadata, Murmur3Token, MD5Token, BytesToken | ||||
|  | ||||
|  | ||||
| class TestMetadata(unittest.TestCase): | ||||
|  | ||||
|     def test_protect_name(self): | ||||
|         """ | ||||
|         Test TableMetadata.protect_name output | ||||
|         """ | ||||
|  | ||||
|         table_metadata = TableMetadata('ks_name', 'table_name') | ||||
|  | ||||
|         self.assertEqual(table_metadata.protect_name('tests'), 'tests') | ||||
|         self.assertEqual(table_metadata.protect_name('test\'s'), '"test\'s"') | ||||
|         self.assertEqual(table_metadata.protect_name('test\'s'), "\"test's\"") | ||||
|         self.assertEqual(table_metadata.protect_name('tests ?!@#$%^&*()'), '"tests ?!@#$%^&*()"') | ||||
|  | ||||
|         # BUG: Or is this fine? | ||||
|         self.assertEqual(table_metadata.protect_name('1'), '"1"') | ||||
|  | ||||
|     def test_protect_names(self): | ||||
|         """ | ||||
|         Test TableMetadata.protect_names output | ||||
|         """ | ||||
|  | ||||
|         table_metadata = TableMetadata('ks_name', 'table_name') | ||||
|  | ||||
|         self.assertEqual(table_metadata.protect_names(['tests']), ['tests']) | ||||
|         self.assertEqual(table_metadata.protect_names( | ||||
|             [ | ||||
|                 'tests', | ||||
|                 'test\'s', | ||||
|                 'tests ?!@#$%^&*()', | ||||
|                 '1' | ||||
|             ]), | ||||
|              [ | ||||
|                  'tests', | ||||
|                  "\"test's\"", | ||||
|                  '"tests ?!@#$%^&*()"', | ||||
|                  '"1"' | ||||
|              ]) | ||||
|  | ||||
|     def test_protect_value(self): | ||||
|         """ | ||||
|         Test TableMetadata.protect_value output | ||||
|         """ | ||||
|  | ||||
|         table_metadata = TableMetadata('ks_name', 'table_name') | ||||
|  | ||||
|         self.assertEqual(table_metadata.protect_value(True), "'true'") | ||||
|         self.assertEqual(table_metadata.protect_value(False), "'false'") | ||||
|         self.assertEqual(table_metadata.protect_value(3.14), '3.140000') | ||||
|         self.assertEqual(table_metadata.protect_value(3), '3') | ||||
|         self.assertEqual(table_metadata.protect_value('test'), "'test'") | ||||
|         self.assertEqual(table_metadata.protect_value('test\'s'), "'test''s'") | ||||
|  | ||||
|         # BUG: Do we remove this altogether now? | ||||
|         self.assertEqual(table_metadata.protect_value(None), 'NULL') | ||||
|  | ||||
|     def test_is_valid_name(self): | ||||
|         """ | ||||
|         Test TableMetadata.is_valid_name output | ||||
|         """ | ||||
|  | ||||
|         table_metadata = TableMetadata('ks_name', 'table_name') | ||||
|  | ||||
|         self.assertEqual(table_metadata.is_valid_name(None), False) | ||||
|         self.assertEqual(table_metadata.is_valid_name('test'), True) | ||||
|         self.assertEqual(table_metadata.is_valid_name('Test'), False) | ||||
|         self.assertEqual(table_metadata.is_valid_name('t_____1'), True) | ||||
|         self.assertEqual(table_metadata.is_valid_name('test1'), True) | ||||
|         self.assertEqual(table_metadata.is_valid_name('1test1'), False) | ||||
|  | ||||
|         non_valid_keywords = cassandra.metadata._keywords - cassandra.metadata._unreserved_keywords | ||||
|         for keyword in non_valid_keywords: | ||||
|             self.assertEqual(table_metadata.is_valid_name(keyword), False) | ||||
|  | ||||
|     def test_token_values(self): | ||||
|         """ | ||||
|         Spot check token classes and values | ||||
|         """ | ||||
|  | ||||
|         # spot check murmur3 | ||||
|         murmur3_token = Murmur3Token(cassandra.metadata.MIN_LONG - 1) | ||||
|         self.assertEqual(murmur3_token.hash_fn('123'), -7468325962851647638) | ||||
|         self.assertEqual(murmur3_token.hash_fn(str(cassandra.metadata.MAX_LONG)), 7162290910810015547) | ||||
|  | ||||
|         md5_token = MD5Token(cassandra.metadata.MIN_LONG - 1) | ||||
|         # BUG: MD5Token always returns the same token | ||||
|         # self.assertNotEqual(md5_token.hash_fn('123'), 110673303387115207421586718101067225896) | ||||
|         # self.assertNotEqual(md5_token.hash_fn(str(cassandra.metadata.MAX_LONG)), 110673303387115207421586718101067225896) | ||||
|  | ||||
|         bytes_token = BytesToken(cassandra.metadata.MIN_LONG - 1) | ||||
|         self.assertEqual(bytes_token.hash_fn('123'), '123') | ||||
|         self.assertEqual(bytes_token.hash_fn(str(cassandra.metadata.MAX_LONG)), str(cassandra.metadata.MAX_LONG)) | ||||
|  | ||||
|         # BUG? Should only accept strings? | ||||
|         self.assertEqual(bytes_token.hash_fn(123), '123') | ||||
| @@ -15,10 +15,31 @@ from cassandra.policies import (RoundRobinPolicy, DCAwareRoundRobinPolicy, | ||||
|                                 TokenAwarePolicy, SimpleConvictionPolicy, | ||||
|                                 HostDistance, ExponentialReconnectionPolicy, | ||||
|                                 RetryPolicy, WriteType, | ||||
|                                 DowngradingConsistencyRetryPolicy) | ||||
|                                 DowngradingConsistencyRetryPolicy, ConstantReconnectionPolicy, | ||||
|                                 LoadBalancingPolicy, ConvictionPolicy, ReconnectionPolicy) | ||||
| from cassandra.pool import Host | ||||
| from cassandra.query import Statement | ||||
|  | ||||
|  | ||||
| class TestLoadBalancingPolicy(unittest.TestCase): | ||||
|     def test_non_implemented(self): | ||||
|         """ | ||||
|         Code coverage for interface-style base class | ||||
|         """ | ||||
|  | ||||
|         policy = LoadBalancingPolicy() | ||||
|         host = Host("ip1", SimpleConvictionPolicy) | ||||
|         host.set_location_info("dc1", "rack1") | ||||
|  | ||||
|         self.assertRaises(NotImplementedError, policy.distance, host) | ||||
|         self.assertRaises(NotImplementedError, policy.distance, host) | ||||
|         self.assertRaises(NotImplementedError, policy.make_query_plan) | ||||
|         self.assertRaises(NotImplementedError, policy.on_up, host) | ||||
|         self.assertRaises(NotImplementedError, policy.on_down, host) | ||||
|         self.assertRaises(NotImplementedError, policy.on_add, host) | ||||
|         self.assertRaises(NotImplementedError, policy.on_remove, host) | ||||
|  | ||||
|  | ||||
| class TestRoundRobinPolicy(unittest.TestCase): | ||||
|  | ||||
|     def test_basic(self): | ||||
| @@ -67,8 +88,23 @@ class TestRoundRobinPolicy(unittest.TestCase): | ||||
|         map(lambda t: t.start(), threads) | ||||
|         map(lambda t: t.join(), threads) | ||||
|  | ||||
|     def test_no_live_nodes(self): | ||||
|         """ | ||||
|         Ensure query plan for a downed cluster will execute without errors | ||||
|         """ | ||||
|  | ||||
| class TestDCAwareRoundRobinPolicy(unittest.TestCase): | ||||
|         hosts = [0, 1, 2, 3] | ||||
|         policy = RoundRobinPolicy() | ||||
|         policy.populate(None, hosts) | ||||
|  | ||||
|         for i in range(4): | ||||
|             policy.on_down(i) | ||||
|  | ||||
|         qplan = list(policy.make_query_plan()) | ||||
|         self.assertEqual(qplan, []) | ||||
|  | ||||
|  | ||||
| class DCAwareRoundRobinPolicyTest(unittest.TestCase): | ||||
|  | ||||
|     def test_no_remote(self): | ||||
|         hosts = [] | ||||
| @@ -173,6 +209,47 @@ class TestDCAwareRoundRobinPolicy(unittest.TestCase): | ||||
|         # since we have hosts in dc9000, the distance shouldn't be IGNORED | ||||
|         self.assertEqual(policy.distance(new_remote_host), HostDistance.REMOTE) | ||||
|  | ||||
|         policy.on_down(new_local_host) | ||||
|         policy.on_down(hosts[1]) | ||||
|         qplan = list(policy.make_query_plan()) | ||||
|         self.assertEqual(set(qplan), set([hosts[3], new_remote_host])) | ||||
|  | ||||
|         policy.on_down(new_remote_host) | ||||
|         policy.on_down(hosts[3]) | ||||
|         qplan = list(policy.make_query_plan()) | ||||
|         self.assertEqual(qplan, []) | ||||
|  | ||||
|     def test_no_live_nodes(self): | ||||
|         """ | ||||
|         Ensure query plan for a downed cluster will execute without errors | ||||
|         """ | ||||
|  | ||||
|         hosts = [] | ||||
|         for i in range(4): | ||||
|             h = Host(i, SimpleConvictionPolicy) | ||||
|             h.set_location_info("dc1", "rack1") | ||||
|             hosts.append(h) | ||||
|  | ||||
|         policy = DCAwareRoundRobinPolicy("dc1", used_hosts_per_remote_dc=1) | ||||
|         policy.populate(None, hosts) | ||||
|  | ||||
|         for host in hosts: | ||||
|             policy.on_down(host) | ||||
|  | ||||
|         qplan = list(policy.make_query_plan()) | ||||
|         self.assertEqual(qplan, []) | ||||
|  | ||||
|     def test_no_nodes(self): | ||||
|         """ | ||||
|         Ensure query plan for an empty cluster will execute without errors | ||||
|         """ | ||||
|  | ||||
|         policy = DCAwareRoundRobinPolicy("dc1", used_hosts_per_remote_dc=1) | ||||
|         policy.populate(None, []) | ||||
|  | ||||
|         qplan = list(policy.make_query_plan()) | ||||
|         self.assertEqual(qplan, []) | ||||
|  | ||||
|  | ||||
| class TokenAwarePolicyTest(unittest.TestCase): | ||||
|  | ||||
| @@ -199,6 +276,19 @@ class TokenAwarePolicyTest(unittest.TestCase): | ||||
|             self.assertEquals(replicas, qplan[:2]) | ||||
|             self.assertEquals(other, set(qplan[2:])) | ||||
|  | ||||
|         # Should use the secondary policy | ||||
|         for i in range(4): | ||||
|             query = Query() | ||||
|             qplan = list(policy.make_query_plan(query)) | ||||
|  | ||||
|             self.assertEquals(set(qplan), set(hosts)) | ||||
|  | ||||
|         # Should use the secondary policy | ||||
|         for i in range(4): | ||||
|             qplan = list(policy.make_query_plan()) | ||||
|  | ||||
|             self.assertEquals(set(qplan), set(hosts)) | ||||
|  | ||||
|     def test_wrap_dc_aware(self): | ||||
|         cluster = Mock(spec=Cluster) | ||||
|         cluster.metadata = Mock(spec=Metadata) | ||||
| @@ -239,6 +329,74 @@ class TokenAwarePolicyTest(unittest.TestCase): | ||||
|             self.assertEquals(qplan[2].datacenter, "dc2") | ||||
|             self.assertEquals(3, len(qplan)) | ||||
|  | ||||
| class ConvictionPolicyTest(unittest.TestCase): | ||||
|     def test_not_implemented(self): | ||||
|         """ | ||||
|         Code coverage for interface-style base class | ||||
|         """ | ||||
|  | ||||
|         conviction_policy = ConvictionPolicy(1) | ||||
|         self.assertRaises(NotImplementedError, conviction_policy.add_failure, 1) | ||||
|         self.assertRaises(NotImplementedError, conviction_policy.reset) | ||||
|  | ||||
|  | ||||
| class SimpleConvictionPolicyTest(unittest.TestCase): | ||||
|     def test_basic_responses(self): | ||||
|         """ | ||||
|         Code coverage for SimpleConvictionPolicy | ||||
|         """ | ||||
|  | ||||
|         conviction_policy = SimpleConvictionPolicy(1) | ||||
|  | ||||
|         # DISCUSS: Always return True? | ||||
|         self.assertEqual(conviction_policy.add_failure(1), True) | ||||
|  | ||||
|         self.assertEqual(conviction_policy.reset(), None) | ||||
|  | ||||
|  | ||||
| class ReconnectionPolicyTest(unittest.TestCase): | ||||
|     def test_basic_responses(self): | ||||
|         """ | ||||
|         Code coverage for interface-style base class | ||||
|         """ | ||||
|  | ||||
|         policy = ReconnectionPolicy() | ||||
|         self.assertRaises(NotImplementedError, policy.new_schedule) | ||||
|  | ||||
|  | ||||
| class ConstantReconnectionPolicyTest(unittest.TestCase): | ||||
|  | ||||
|     def test_bad_vals(self): | ||||
|         """ | ||||
|         Test initialization values | ||||
|         """ | ||||
|  | ||||
|         self.assertRaises(ValueError, ConstantReconnectionPolicy, -1, 0) | ||||
|  | ||||
|     def test_schedule(self): | ||||
|         """ | ||||
|         Test ConstantReconnectionPolicy schedule | ||||
|         """ | ||||
|  | ||||
|         delay = 2 | ||||
|         max_attempts = 100 | ||||
|         policy = ConstantReconnectionPolicy(delay=delay, max_attempts=max_attempts) | ||||
|         schedule = list(policy.new_schedule()) | ||||
|         self.assertEqual(len(schedule), max_attempts) | ||||
|         for i, delay in enumerate(schedule): | ||||
|             self.assertEqual(delay, delay) | ||||
|  | ||||
|     def test_schedule_negative_max_attempts(self): | ||||
|         """ | ||||
|         Test how negative max_attempts are handled | ||||
|         """ | ||||
|  | ||||
|         delay = 2 | ||||
|         max_attempts = -100 | ||||
|         policy = ConstantReconnectionPolicy(delay=delay, max_attempts=max_attempts) | ||||
|         schedule = list(policy.new_schedule()) | ||||
|         self.assertEqual(len(schedule), 0) | ||||
|  | ||||
|  | ||||
| class ExponentialReconnectionPolicyTest(unittest.TestCase): | ||||
|  | ||||
| @@ -270,25 +428,28 @@ class RetryPolicyTest(unittest.TestCase): | ||||
|             query=None, consistency="ONE", required_responses=1, received_responses=2, | ||||
|             data_retrieved=True, retry_num=1) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # if we didn't get enough responses, rethrow | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=2, received_responses=1, | ||||
|             data_retrieved=True, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # if we got enough responses, but also got a data response, rethrow | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=2, received_responses=2, | ||||
|             data_retrieved=True, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # we got enough reponses but no data response, so retry | ||||
|         # we got enough responses but no data response, so retry | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=2, received_responses=2, | ||||
|             data_retrieved=False, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETRY) | ||||
|         self.assertEqual(consistency, "ONE") | ||||
|         self.assertEqual(consistency, 'ONE') | ||||
|  | ||||
|     def test_write_timeout(self): | ||||
|         policy = RetryPolicy() | ||||
| @@ -298,19 +459,21 @@ class RetryPolicyTest(unittest.TestCase): | ||||
|             query=None, consistency="ONE", write_type=WriteType.SIMPLE, | ||||
|             required_responses=1, received_responses=2, retry_num=1) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # if it's not a BATCH_LOG write, don't retry it | ||||
|         retry, consistency = policy.on_write_timeout( | ||||
|             query=None, consistency="ONE", write_type=WriteType.SIMPLE, | ||||
|             required_responses=1, received_responses=2, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # retry BATCH_LOG writes regardless of received responses | ||||
|         retry, consistency = policy.on_write_timeout( | ||||
|             query=None, consistency="ONE", write_type=WriteType.BATCH_LOG, | ||||
|             required_responses=10000, received_responses=1, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETRY) | ||||
|         self.assertEqual(consistency, "ONE") | ||||
|         self.assertEqual(consistency, 'ONE') | ||||
|  | ||||
|  | ||||
| class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
| @@ -323,6 +486,14 @@ class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
|             query=None, consistency="ONE", required_responses=1, received_responses=2, | ||||
|             data_retrieved=True, retry_num=1) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # if we didn't get enough responses, retry at a lower consistency | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=4, received_responses=3, | ||||
|             data_retrieved=True, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETRY) | ||||
|         self.assertEqual(consistency, ConsistencyLevel.THREE) | ||||
|  | ||||
|         # if we didn't get enough responses, retry at a lower consistency | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
| @@ -343,18 +514,21 @@ class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
|             query=None, consistency="ONE", required_responses=3, received_responses=0, | ||||
|             data_retrieved=True, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # if we got enough response but no data, retry | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=3, received_responses=3, | ||||
|             data_retrieved=False, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETRY) | ||||
|         self.assertEqual(consistency, 'ONE') | ||||
|  | ||||
|         # if we got enough responses, but also got a data response, rethrow | ||||
|         retry, consistency = policy.on_read_timeout( | ||||
|             query=None, consistency="ONE", required_responses=2, received_responses=2, | ||||
|             data_retrieved=True, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|     def test_write_timeout(self): | ||||
|         policy = DowngradingConsistencyRetryPolicy() | ||||
| @@ -364,6 +538,7 @@ class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
|             query=None, consistency="ONE", write_type=WriteType.SIMPLE, | ||||
|             required_responses=1, received_responses=2, retry_num=1) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # ignore failures on these types of writes | ||||
|         for write_type in (WriteType.SIMPLE, WriteType.BATCH, WriteType.COUNTER): | ||||
| @@ -386,6 +561,13 @@ class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
|         self.assertEqual(retry, RetryPolicy.RETRY) | ||||
|         self.assertEqual(consistency, "ONE") | ||||
|  | ||||
|         # timeout on an unknown write_type | ||||
|         retry, consistency = policy.on_write_timeout( | ||||
|             query=None, consistency="ONE", write_type=None, | ||||
|             required_responses=1, received_responses=2, retry_num=0) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|     def test_unavailable(self): | ||||
|         policy = DowngradingConsistencyRetryPolicy() | ||||
|  | ||||
| @@ -393,6 +575,7 @@ class DowngradingConsistencyRetryPolicyTest(unittest.TestCase): | ||||
|         retry, consistency = policy.on_unavailable( | ||||
|             query=None, consistency="ONE", required_replicas=3, alive_replicas=1, retry_num=1) | ||||
|         self.assertEqual(retry, RetryPolicy.RETHROW) | ||||
|         self.assertEqual(consistency, None) | ||||
|  | ||||
|         # downgrade consistency on unavailable exceptions | ||||
|         retry, consistency = policy.on_unavailable( | ||||
|   | ||||
							
								
								
									
										289
									
								
								tests/unit/test_types.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								tests/unit/test_types.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,289 @@ | ||||
| import unittest | ||||
| import datetime | ||||
| import cassandra | ||||
| from cassandra.cqltypes import lookup_cqltype, CassandraType, BooleanType, lookup_casstype_simple, lookup_casstype, \ | ||||
|     AsciiType, LongType, DecimalType, DoubleType, FloatType, Int32Type, UTF8Type, IntegerType, SetType, cql_typename | ||||
|  | ||||
| from cassandra.cluster import Cluster | ||||
|  | ||||
|  | ||||
| class TypeTests(unittest.TestCase): | ||||
|  | ||||
|     def test_lookup_casstype_simple(self): | ||||
|         """ | ||||
|         Ensure lookup_casstype_simple returns the correct classes | ||||
|         """ | ||||
|  | ||||
|         self.assertEqual(lookup_casstype_simple('AsciiType'), cassandra.cqltypes.AsciiType) | ||||
|         self.assertEqual(lookup_casstype_simple('LongType'), cassandra.cqltypes.LongType) | ||||
|         self.assertEqual(lookup_casstype_simple('BytesType'), cassandra.cqltypes.BytesType) | ||||
|         self.assertEqual(lookup_casstype_simple('BooleanType'), cassandra.cqltypes.BooleanType) | ||||
|         self.assertEqual(lookup_casstype_simple('CounterColumnType'), cassandra.cqltypes.CounterColumnType) | ||||
|         self.assertEqual(lookup_casstype_simple('DecimalType'), cassandra.cqltypes.DecimalType) | ||||
|         self.assertEqual(lookup_casstype_simple('DoubleType'), cassandra.cqltypes.DoubleType) | ||||
|         self.assertEqual(lookup_casstype_simple('FloatType'), cassandra.cqltypes.FloatType) | ||||
|         self.assertEqual(lookup_casstype_simple('InetAddressType'), cassandra.cqltypes.InetAddressType) | ||||
|         self.assertEqual(lookup_casstype_simple('Int32Type'), cassandra.cqltypes.Int32Type) | ||||
|         self.assertEqual(lookup_casstype_simple('UTF8Type'), cassandra.cqltypes.UTF8Type) | ||||
|         self.assertEqual(lookup_casstype_simple('DateType'), cassandra.cqltypes.DateType) | ||||
|         self.assertEqual(lookup_casstype_simple('TimeUUIDType'), cassandra.cqltypes.TimeUUIDType) | ||||
|         self.assertEqual(lookup_casstype_simple('UUIDType'), cassandra.cqltypes.UUIDType) | ||||
|  | ||||
|         # DISCUSS: varchar is not valid? | ||||
|         # self.assertEqual(lookup_casstype_simple('varchar'), cassandra.cqltypes.UTF8Type) | ||||
|  | ||||
|         self.assertEqual(lookup_casstype_simple('IntegerType'), cassandra.cqltypes.IntegerType) | ||||
|         self.assertEqual(lookup_casstype_simple('MapType'), cassandra.cqltypes.MapType) | ||||
|         self.assertEqual(lookup_casstype_simple('ListType'), cassandra.cqltypes.ListType) | ||||
|         self.assertEqual(lookup_casstype_simple('SetType'), cassandra.cqltypes.SetType) | ||||
|         self.assertEqual(lookup_casstype_simple('CompositeType'), cassandra.cqltypes.CompositeType) | ||||
|         self.assertEqual(lookup_casstype_simple('ColumnToCollectionType'), cassandra.cqltypes.ColumnToCollectionType) | ||||
|         self.assertEqual(lookup_casstype_simple('ReversedType'), cassandra.cqltypes.ReversedType) | ||||
|  | ||||
|         self.assertEqual(str(lookup_casstype_simple('unknown')), str(cassandra.cqltypes.mkUnrecognizedType('unknown'))) | ||||
|  | ||||
|     def test_lookup_casstype(self): | ||||
|         """ | ||||
|         Ensure lookup_casstype returns the correct classes | ||||
|         """ | ||||
|  | ||||
|         self.assertEqual(lookup_casstype('AsciiType'), cassandra.cqltypes.AsciiType) | ||||
|         self.assertEqual(lookup_casstype('LongType'), cassandra.cqltypes.LongType) | ||||
|         self.assertEqual(lookup_casstype('BytesType'), cassandra.cqltypes.BytesType) | ||||
|         self.assertEqual(lookup_casstype('BooleanType'), cassandra.cqltypes.BooleanType) | ||||
|         self.assertEqual(lookup_casstype('CounterColumnType'), cassandra.cqltypes.CounterColumnType) | ||||
|         self.assertEqual(lookup_casstype('DecimalType'), cassandra.cqltypes.DecimalType) | ||||
|         self.assertEqual(lookup_casstype('DoubleType'), cassandra.cqltypes.DoubleType) | ||||
|         self.assertEqual(lookup_casstype('FloatType'), cassandra.cqltypes.FloatType) | ||||
|         self.assertEqual(lookup_casstype('InetAddressType'), cassandra.cqltypes.InetAddressType) | ||||
|         self.assertEqual(lookup_casstype('Int32Type'), cassandra.cqltypes.Int32Type) | ||||
|         self.assertEqual(lookup_casstype('UTF8Type'), cassandra.cqltypes.UTF8Type) | ||||
|         self.assertEqual(lookup_casstype('DateType'), cassandra.cqltypes.DateType) | ||||
|         self.assertEqual(lookup_casstype('TimeUUIDType'), cassandra.cqltypes.TimeUUIDType) | ||||
|         self.assertEqual(lookup_casstype('UUIDType'), cassandra.cqltypes.UUIDType) | ||||
|  | ||||
|         # DISCUSS: varchar is not valid? | ||||
|         # self.assertEqual(lookup_casstype('varchar'), cassandra.cqltypes.UTF8Type) | ||||
|  | ||||
|         self.assertEqual(lookup_casstype('IntegerType'), cassandra.cqltypes.IntegerType) | ||||
|         self.assertEqual(lookup_casstype('MapType'), cassandra.cqltypes.MapType) | ||||
|         self.assertEqual(lookup_casstype('ListType'), cassandra.cqltypes.ListType) | ||||
|         self.assertEqual(lookup_casstype('SetType'), cassandra.cqltypes.SetType) | ||||
|         self.assertEqual(lookup_casstype('CompositeType'), cassandra.cqltypes.CompositeType) | ||||
|         self.assertEqual(lookup_casstype('ColumnToCollectionType'), cassandra.cqltypes.ColumnToCollectionType) | ||||
|         self.assertEqual(lookup_casstype('ReversedType'), cassandra.cqltypes.ReversedType) | ||||
|  | ||||
|         self.assertEqual(str(lookup_casstype('unknown')), str(cassandra.cqltypes.mkUnrecognizedType('unknown'))) | ||||
|  | ||||
|         self.assertRaises(ValueError, lookup_casstype, 'AsciiType~') | ||||
|  | ||||
|         # DISCUSS: Figure out if other tests are needed | ||||
|         self.assertEqual(str(lookup_casstype(BooleanType(True))), str(BooleanType(True))) | ||||
|  | ||||
|  | ||||
|     def test_lookup_cqltype(self): | ||||
|         """ | ||||
|         Ensure lookup_cqltype returns the correct class | ||||
|         """ | ||||
|  | ||||
|         self.assertEqual(lookup_cqltype('ascii'), cassandra.cqltypes.AsciiType) | ||||
|         self.assertEqual(lookup_cqltype('bigint'), cassandra.cqltypes.LongType) | ||||
|         self.assertEqual(lookup_cqltype('blob'), cassandra.cqltypes.BytesType) | ||||
|         self.assertEqual(lookup_cqltype('boolean'), cassandra.cqltypes.BooleanType) | ||||
|         self.assertEqual(lookup_cqltype('counter'), cassandra.cqltypes.CounterColumnType) | ||||
|         self.assertEqual(lookup_cqltype('decimal'), cassandra.cqltypes.DecimalType) | ||||
|         self.assertEqual(lookup_cqltype('double'), cassandra.cqltypes.DoubleType) | ||||
|         self.assertEqual(lookup_cqltype('float'), cassandra.cqltypes.FloatType) | ||||
|         self.assertEqual(lookup_cqltype('inet'), cassandra.cqltypes.InetAddressType) | ||||
|         self.assertEqual(lookup_cqltype('int'), cassandra.cqltypes.Int32Type) | ||||
|         self.assertEqual(lookup_cqltype('text'), cassandra.cqltypes.UTF8Type) | ||||
|         self.assertEqual(lookup_cqltype('timestamp'), cassandra.cqltypes.DateType) | ||||
|         self.assertEqual(lookup_cqltype('timeuuid'), cassandra.cqltypes.TimeUUIDType) | ||||
|         self.assertEqual(lookup_cqltype('uuid'), cassandra.cqltypes.UUIDType) | ||||
|         self.assertEqual(lookup_cqltype('varchar'), cassandra.cqltypes.UTF8Type) | ||||
|         self.assertEqual(lookup_cqltype('varint'), cassandra.cqltypes.IntegerType) | ||||
|  | ||||
|  | ||||
|         self.assertEqual(str(lookup_cqltype('list<ascii>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.AsciiType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<bigint>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.LongType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<blob>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.BytesType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<boolean>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.BooleanType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<counter>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.CounterColumnType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<decimal>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.DecimalType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<double>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.DoubleType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<float>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.FloatType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<inet>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.InetAddressType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<int>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.Int32Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<text>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<timestamp>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.DateType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<timeuuid>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.TimeUUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<uuid>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.UUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<varchar>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('list<varint>')), | ||||
|                          str(cassandra.cqltypes.ListType.apply_parameters(cassandra.cqltypes.IntegerType))) | ||||
|  | ||||
|  | ||||
|         self.assertEqual(str(lookup_cqltype('set<ascii>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.AsciiType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<bigint>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.LongType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<blob>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.BytesType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<boolean>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.BooleanType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<counter>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.CounterColumnType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<decimal>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.DecimalType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<double>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.DoubleType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<float>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.FloatType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<inet>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.InetAddressType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<int>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.Int32Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<text>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<timestamp>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.DateType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<timeuuid>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.TimeUUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<uuid>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.UUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<varchar>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('set<varint>')), | ||||
|                          str(cassandra.cqltypes.SetType.apply_parameters(cassandra.cqltypes.IntegerType))) | ||||
|  | ||||
|  | ||||
|         self.assertEqual(str(lookup_cqltype('map<ascii, ascii>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.AsciiType, | ||||
|                                                                          cassandra.cqltypes.AsciiType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<bigint, bigint>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.LongType, | ||||
|                                                                          cassandra.cqltypes.LongType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<blob, blob>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.BytesType, | ||||
|                                                                          cassandra.cqltypes.BytesType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<boolean, boolean>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.BooleanType, | ||||
|                                                                          cassandra.cqltypes.BooleanType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<counter, counter>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.CounterColumnType, | ||||
|                                                                          cassandra.cqltypes.CounterColumnType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<decimal, decimal>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.DecimalType, | ||||
|                                                                          cassandra.cqltypes.DecimalType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<double, double>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.DoubleType, | ||||
|                                                                          cassandra.cqltypes.DoubleType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<float, float>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.FloatType, | ||||
|                                                                          cassandra.cqltypes.FloatType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<inet, inet>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.InetAddressType, | ||||
|                                                                          cassandra.cqltypes.InetAddressType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<int, int>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.Int32Type, | ||||
|                                                                          cassandra.cqltypes.Int32Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<text, text>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.UTF8Type, | ||||
|                                                                          cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<timestamp, timestamp>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.DateType, | ||||
|                                                                          cassandra.cqltypes.DateType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<timeuuid, timeuuid>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.TimeUUIDType, | ||||
|                                                                          cassandra.cqltypes.TimeUUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<uuid, uuid>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.UUIDType, | ||||
|                                                                          cassandra.cqltypes.UUIDType))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<varchar, varchar>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.UTF8Type, | ||||
|                                                                          cassandra.cqltypes.UTF8Type))) | ||||
|         self.assertEqual(str(lookup_cqltype('map<varint, varint>')), | ||||
|                          str(cassandra.cqltypes.MapType.apply_parameters(cassandra.cqltypes.IntegerType, | ||||
|                                                                          cassandra.cqltypes.IntegerType))) | ||||
|  | ||||
|         # DISCUSS: Figure out if other tests are needed, and how to test them | ||||
|         # self.assertEqual(str(lookup_cqltype(AsciiType(CassandraType('asdf')))), str(AsciiType(CassandraType('asdf')))) | ||||
|         # self.assertEqual(str(lookup_cqltype(LongType(CassandraType(1234)))), str(LongType(CassandraType(1234)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(BytesType(CassandraType(True)))), str(BytesType(CassandraType(True)))) | ||||
|         self.assertEqual(str(lookup_cqltype(BooleanType(CassandraType(True)))), str(BooleanType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(CounterColumnType(CassandraType(True)))), str(CounterColumnType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(DecimalType(CassandraType(1234.1234)))), str(DecimalType(CassandraType(1234.1234)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(DoubleType(CassandraType(1234.1234)))), str(DoubleType(CassandraType(1234.1234)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(FloatType(CassandraType(1234.1234)))), str(FloatType(CassandraType(1234.1234)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(InetAddressType(CassandraType(True)))), str(InetAddressType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(Int32Type(CassandraType(1234)))), str(Int32Type(CassandraType(1234)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(UTF8Type(CassandraType('asdf')))), str(UTF8Type(CassandraType('asdf')))) | ||||
|         # self.assertEqual(str(lookup_cqltype(DateType(CassandraType(True)))), str(DateType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(TimeUUIDType(CassandraType(True)))), str(TimeUUIDType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(UUIDType(CassandraType(True)))), str(UUIDType(CassandraType(True)))) | ||||
|         # self.assertEqual(str(lookup_cqltype(IntegerType(CassandraType(1234)))), str(IntegerType(CassandraType(1234)))) | ||||
|  | ||||
|         # DISCUSS: Check if typo in code, or misunderstanding | ||||
|         # self.assertEqual(lookup_cqltype("'ascii'"), cassandra.cqltypes.AsciiType) | ||||
|         # self.assertEqual(lookup_cqltype("'bigint'"), cassandra.cqltypes.LongType) | ||||
|         # self.assertEqual(lookup_cqltype("'blob'"), cassandra.cqltypes.BytesType) | ||||
|         # self.assertEqual(lookup_cqltype("'boolean'"), cassandra.cqltypes.BooleanType) | ||||
|         # self.assertEqual(lookup_cqltype("'counter'"), cassandra.cqltypes.CounterColumnType) | ||||
|         # self.assertEqual(lookup_cqltype("'decimal'"), cassandra.cqltypes.DecimalType) | ||||
|         # self.assertEqual(lookup_cqltype("'float'"), cassandra.cqltypes.FloatType) | ||||
|         # self.assertEqual(lookup_cqltype("'inet'"), cassandra.cqltypes.InetAddressType) | ||||
|         # self.assertEqual(lookup_cqltype("'int'"), cassandra.cqltypes.Int32Type) | ||||
|         # self.assertEqual(lookup_cqltype("'text'"), cassandra.cqltypes.UTF8Type) | ||||
|         # self.assertEqual(lookup_cqltype("'timestamp'"), cassandra.cqltypes.DateType) | ||||
|         # self.assertEqual(lookup_cqltype("'timeuuid'"), cassandra.cqltypes.TimeUUIDType) | ||||
|         # self.assertEqual(lookup_cqltype("'uuid'"), cassandra.cqltypes.UUIDType) | ||||
|         # self.assertEqual(lookup_cqltype("'varchar'"), cassandra.cqltypes.UTF8Type) | ||||
|         # self.assertEqual(lookup_cqltype("'varint'"), cassandra.cqltypes.IntegerType) | ||||
|  | ||||
|     def test_cassandratype(self): | ||||
|         """ | ||||
|         Smoke test cass_parameterized_type_with | ||||
|         """ | ||||
|  | ||||
|         self.assertEqual(LongType.cass_parameterized_type_with(()), 'LongType') | ||||
|         self.assertEqual(LongType.cass_parameterized_type_with((), full=True), 'org.apache.cassandra.db.marshal.LongType') | ||||
|         self.assertEqual(SetType.cass_parameterized_type_with([DecimalType], full=True), 'org.apache.cassandra.db.marshal.SetType(org.apache.cassandra.db.marshal.DecimalType)') | ||||
|  | ||||
|         self.assertEqual(LongType.cql_parameterized_type(), 'bigint') | ||||
|         self.assertEqual(cassandra.cqltypes.MapType.apply_parameters( | ||||
|                          cassandra.cqltypes.UTF8Type, cassandra.cqltypes.UTF8Type).cql_parameterized_type(), | ||||
|                          'map<text, text>') | ||||
|  | ||||
|     def test_datetype(self): | ||||
|         """ | ||||
|         Test cassandra.cqltypes.DateType() construction | ||||
|         """ | ||||
|  | ||||
|         pass | ||||
|         # TODO: Figure out the required format here | ||||
|         # date_string = str(datetime.datetime.now().strftime('%s.%f')) | ||||
|         # print date_string | ||||
|         # print cassandra.cqltypes.DateType(date_string) | ||||
|  | ||||
|     def test_cql_typename(self): | ||||
|         """ | ||||
|         Smoke test cql_typename | ||||
|         """ | ||||
|  | ||||
|         self.assertEqual(cql_typename('DateType'), 'timestamp') | ||||
|         self.assertEqual(cql_typename('org.apache.cassandra.db.marshal.ListType(IntegerType)'), 'list<varint>') | ||||
		Reference in New Issue
	
	Block a user
	 Joaquin Casares
					Joaquin Casares