Skip to content

Commit 7a4ae44

Browse files
committed
Test metadata_request_timeout configuration option
1 parent 4beebd5 commit 7a4ae44

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

tests/integration/standard/test_cluster.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ def test_refresh_schema_no_wait(self):
522522
def patched_wait_for_responses(*args, **kwargs):
523523
# When selecting schema version, replace the real schema UUID with an unexpected UUID
524524
response = original_wait_for_responses(*args, **kwargs)
525-
if len(args) > 2 and hasattr(args[2], "query") and args[2].query == "SELECT schema_version FROM system.local WHERE key='local'":
525+
if len(args) > 2 and hasattr(args[2], "query") and "SELECT schema_version FROM system.local WHERE key='local'" in args[2].query:
526526
new_uuid = uuid4()
527527
response[1].parsed_rows[0] = (new_uuid,)
528528
return response

tests/integration/standard/test_metadata.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@
2525
import pytest
2626

2727
from cassandra import AlreadyExists, SignatureDescriptor, UserFunctionDescriptor, UserAggregateDescriptor
28+
from cassandra.connection import Connection
2829

2930
from cassandra.encoder import Encoder
3031
from cassandra.metadata import (IndexMetadata, Token, murmur3, Function, Aggregate, protect_name, protect_names,
3132
RegisteredTableExtension, _RegisteredExtensionType, get_schema_parser,
3233
group_keys_by_replica, NO_VALID_REPLICA)
34+
from cassandra.protocol import QueryMessage, ProtocolHandler
3335
from cassandra.util import SortedSet
3436

3537
from tests.integration import (get_cluster, use_singledc, PROTOCOL_VERSION, execute_until_pass,
@@ -1331,6 +1333,38 @@ def test_token(self):
13311333
cluster.shutdown()
13321334

13331335

1336+
class MetadataTimeoutTest(unittest.TestCase):
1337+
"""
1338+
Test of TokenMap creation and other behavior.
1339+
"""
1340+
def test_timeout(self):
1341+
cluster = TestCluster()
1342+
cluster.metadata_request_timeout = None
1343+
1344+
stmts = []
1345+
1346+
class ConnectionWrapper(cluster.connection_class):
1347+
def __init__(self, *args, **kwargs):
1348+
super(ConnectionWrapper, self).__init__(*args, **kwargs)
1349+
1350+
def send_msg(self, msg, request_id, cb, encoder=ProtocolHandler.encode_message,
1351+
decoder=ProtocolHandler.decode_message, result_metadata=None):
1352+
if isinstance(msg, QueryMessage):
1353+
stmts.append(msg.query)
1354+
return super(ConnectionWrapper, self).send_msg(msg, request_id, cb, encoder, decoder, result_metadata)
1355+
1356+
cluster.connection_class = ConnectionWrapper
1357+
s = cluster.connect()
1358+
s.execute('SELECT now() FROM system.local')
1359+
s.shutdown()
1360+
1361+
for stmt in stmts:
1362+
if "SELECT now() FROM system.local" in stmt:
1363+
continue
1364+
if "USING TIMEOUT 2000ms" not in stmt:
1365+
self.fail(f"query `{stmt}` does not contain `USING TIMEOUT 2000ms`")
1366+
1367+
13341368
class KeyspaceAlterMetadata(unittest.TestCase):
13351369
"""
13361370
Test verifies that table metadata is preserved on keyspace alter

tests/unit/advanced/test_metadata.py

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
14+
import datetime
1515
import unittest
1616

1717
from cassandra.metadata import (
1818
KeyspaceMetadata, TableMetadataDSE68,
19-
VertexMetadata, EdgeMetadata
19+
VertexMetadata, EdgeMetadata, SchemaParserV22, _SchemaParser
2020
)
21+
from cassandra.protocol import ResultMessage, RESULT_KIND_ROWS
2122

2223

2324
class GraphMetadataToCQLTests(unittest.TestCase):
@@ -136,3 +137,44 @@ def test_edge_multiple_partition_and_clustering_keys(self):
136137
'FROM from_label((pk1, pk2), c1, c2) ',
137138
tm.as_cql_query()
138139
)
140+
141+
142+
class SchemaParsersTests(unittest.TestCase):
143+
def test_metadata_query_metadata_timeout(self):
144+
class FakeConnection:
145+
def __init__(self):
146+
self.queries = []
147+
148+
def wait_for_responses(self, *msgs, **kwargs):
149+
self.queries.extend(msgs)
150+
local_response = ResultMessage(kind=RESULT_KIND_ROWS)
151+
local_response.column_names = []
152+
local_response.parsed_rows = []
153+
154+
return [[local_response, local_response] for _ in msgs]
155+
156+
for schemaClass in get_all_schema_parser_classes(_SchemaParser):
157+
conn = FakeConnection()
158+
p = schemaClass(conn, 2.0, 1000, None)
159+
p._query_all()
160+
161+
for q in conn.queries:
162+
if "USING TIMEOUT" in q.query:
163+
self.fail(f"<{schemaClass.__name__}> query `{q.query}` contains `USING TIMEOUT`, while should not")
164+
165+
conn = FakeConnection()
166+
p = schemaClass(conn, 2.0, 1000, datetime.timedelta(seconds=2))
167+
p._query_all()
168+
169+
for q in conn.queries:
170+
if "USING TIMEOUT 2000ms" not in q.query:
171+
self.fail(f"{schemaClass.__name__} query `{q.query}` does not contain `USING TIMEOUT 2000ms`")
172+
173+
174+
def get_all_schema_parser_classes(cl):
175+
for child in cl.__subclasses__():
176+
if not child.__name__.startswith('SchemaParser') or child.__module__ != 'cassandra.metadata':
177+
continue
178+
yield child
179+
for c in get_all_schema_parser_classes(child):
180+
yield c

tests/unit/test_util_types.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import datetime
1717

18-
from cassandra.util import Date, Time, Duration, Version
18+
from cassandra.util import Date, Time, Duration, Version, maybe_add_timeout_to_query
1919

2020

2121
class DateTests(unittest.TestCase):
@@ -287,3 +287,15 @@ def test_version_compare(self):
287287
self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0.0-SNAPSHOT1'))
288288

289289
self.assertTrue(Version('4.0.0-alpha1-SNAPSHOT') > Version('4.0.0-SNAPSHOT'))
290+
291+
292+
class FunctionTests(unittest.TestCase):
293+
def test_maybe_add_timeout_to_query(self):
294+
self.assertEqual(
295+
"SELECT * FROM HOSTS",
296+
maybe_add_timeout_to_query("SELECT * FROM HOSTS", None)
297+
)
298+
self.assertEqual(
299+
"SELECT * FROM HOSTS USING TIMEOUT 1000ms",
300+
maybe_add_timeout_to_query("SELECT * FROM HOSTS", datetime.timedelta(seconds=1))
301+
)

0 commit comments

Comments
 (0)