111 lines
2.7 KiB
Python
111 lines
2.7 KiB
Python
|
import mgclient
|
||
|
import time
|
||
|
|
||
|
# These are the indices of the different values in the result of SHOW STREAM
|
||
|
# query
|
||
|
NAME = 0
|
||
|
TOPICS = 1
|
||
|
CONSUMER_GROUP = 2
|
||
|
BATCH_INTERVAL = 3
|
||
|
BATCH_SIZE = 4
|
||
|
TRANSFORM = 5
|
||
|
OWNER = 6
|
||
|
IS_RUNNING = 7
|
||
|
|
||
|
|
||
|
def execute_and_fetch_all(cursor, query):
|
||
|
cursor.execute(query)
|
||
|
return cursor.fetchall()
|
||
|
|
||
|
|
||
|
def connect(**kwargs):
|
||
|
connection = mgclient.connect(host="localhost", port=7687, **kwargs)
|
||
|
connection.autocommit = True
|
||
|
return connection
|
||
|
|
||
|
|
||
|
def timed_wait(fun):
|
||
|
start_time = time.time()
|
||
|
seconds = 10
|
||
|
|
||
|
while True:
|
||
|
current_time = time.time()
|
||
|
elapsed_time = current_time - start_time
|
||
|
|
||
|
if elapsed_time > seconds:
|
||
|
return False
|
||
|
|
||
|
if fun():
|
||
|
return True
|
||
|
|
||
|
time.sleep(0.1)
|
||
|
|
||
|
|
||
|
def check_one_result_row(cursor, query):
|
||
|
start_time = time.time()
|
||
|
seconds = 10
|
||
|
|
||
|
while True:
|
||
|
current_time = time.time()
|
||
|
elapsed_time = current_time - start_time
|
||
|
|
||
|
if elapsed_time > seconds:
|
||
|
return False
|
||
|
|
||
|
cursor.execute(query)
|
||
|
results = cursor.fetchall()
|
||
|
if len(results) < 1:
|
||
|
time.sleep(0.1)
|
||
|
continue
|
||
|
|
||
|
return len(results) == 1
|
||
|
|
||
|
|
||
|
def check_vertex_exists_with_topic_and_payload(cursor, topic, payload_bytes):
|
||
|
assert check_one_result_row(cursor,
|
||
|
"MATCH (n: MESSAGE {"
|
||
|
f"payload: '{payload_bytes.decode('utf-8')}',"
|
||
|
f"topic: '{topic}'"
|
||
|
"}) RETURN n")
|
||
|
|
||
|
|
||
|
def get_stream_info(cursor, stream_name):
|
||
|
stream_infos = execute_and_fetch_all(cursor, "SHOW STREAMS")
|
||
|
for stream_info in stream_infos:
|
||
|
if (stream_info[NAME] == stream_name):
|
||
|
return stream_info
|
||
|
|
||
|
return None
|
||
|
|
||
|
|
||
|
def get_is_running(cursor, stream_name):
|
||
|
stream_info = get_stream_info(cursor, stream_name)
|
||
|
|
||
|
assert stream_info
|
||
|
return stream_info[IS_RUNNING]
|
||
|
|
||
|
|
||
|
def start_stream(cursor, stream_name):
|
||
|
execute_and_fetch_all(cursor, f"START STREAM {stream_name}")
|
||
|
|
||
|
assert get_is_running(cursor, stream_name)
|
||
|
|
||
|
|
||
|
def stop_stream(cursor, stream_name):
|
||
|
execute_and_fetch_all(cursor, f"STOP STREAM {stream_name}")
|
||
|
|
||
|
assert not get_is_running(cursor, stream_name)
|
||
|
|
||
|
|
||
|
def drop_stream(cursor, stream_name):
|
||
|
execute_and_fetch_all(cursor, f"DROP STREAM {stream_name}")
|
||
|
|
||
|
assert get_stream_info(cursor, stream_name) is None
|
||
|
|
||
|
|
||
|
def check_stream_info(cursor, stream_name, expected_stream_info):
|
||
|
stream_info = get_stream_info(cursor, stream_name)
|
||
|
assert len(stream_info) == len(expected_stream_info)
|
||
|
for info, expected_info in zip(stream_info, expected_stream_info):
|
||
|
assert info == expected_info
|