diff --git a/alert.yaml b/alert.yaml new file mode 100644 index 0000000..ecdee7e --- /dev/null +++ b/alert.yaml @@ -0,0 +1,12 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service \ No newline at end of file diff --git a/blank.yaml b/blank.yaml new file mode 100644 index 0000000..ecdee7e --- /dev/null +++ b/blank.yaml @@ -0,0 +1,12 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service \ No newline at end of file diff --git a/full_run_rand.yaml b/full_run_rand.yaml new file mode 100644 index 0000000..23ff174 --- /dev/null +++ b/full_run_rand.yaml @@ -0,0 +1,85 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service +step4: + delay: 1 + name: search_and_add + payload: + plugin: songs +step5: + delay: 1 + name: search_and_add + payload: + plugin: songs +step6: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step7: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step8: + delay: 1 + name: search_and_add + payload: + plugin: custom +step9: + delay: 1 + name: search_and_add + payload: + plugin: images +step10: + delay: 1 + name: search_and_add + payload: + plugin: songs +step11: + delay: 1 + name: search_and_add + payload: + plugin: presentation +step12: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step13: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step14: + delay: 1 + name: search_and_add + payload: + plugin: songs +step15: + delay: 1 + name: search_and_add + payload: + plugin: custom +step16: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step17: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step18: + delay: 0.1 + name: load_service_sequential \ No newline at end of file diff --git a/full_run_seq.yaml b/full_run_seq.yaml new file mode 100644 index 0000000..f2c10b8 --- /dev/null +++ b/full_run_seq.yaml @@ -0,0 +1,85 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service +step4: + delay: 1 + name: search_and_add + payload: + plugin: songs +step5: + delay: 1 + name: search_and_add + payload: + plugin: songs +step6: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step7: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step8: + delay: 1 + name: search_and_add + payload: + plugin: custom +step9: + delay: 1 + name: search_and_add + payload: + plugin: images +step10: + delay: 1 + name: search_and_add + payload: + plugin: songs +step11: + delay: 1 + name: search_and_add + payload: + plugin: presentation +step12: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step13: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step14: + delay: 1 + name: search_and_add + payload: + plugin: songs +step15: + delay: 1 + name: search_and_add + payload: + plugin: custom +step16: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step17: + delay: 1 + name: search_and_add + payload: + plugin: bibles +step18: + delay: 0.1 + name: load_service_random \ No newline at end of file diff --git a/media.yaml b/media.yaml new file mode 100644 index 0000000..4f0e15f --- /dev/null +++ b/media.yaml @@ -0,0 +1,42 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service +step4: + delay: 5 + name: media_play +step5: + delay: 1 + name: clear_preview_controller +step6: + max: 1 + min: 1 + name: new_service +step7: + delay: 1 + name: search_and_add + payload: + plugin: media +step8: + delay: 5 + name: media_play +step9: + delay: 5 + name: media_pause +step10: + delay: 5 + name: media_pause +step11: + delay: 5 + name: media_play +step12: + delay: 5 + name: media_stop \ No newline at end of file diff --git a/test.yaml b/test.yaml new file mode 100644 index 0000000..b88da63 --- /dev/null +++ b/test.yaml @@ -0,0 +1,25 @@ +process_name: test process +step1: + max: 1 + min: 1 + name: clear_live_controller +step2: + delay: 1 + name: clear_preview_controller +step3: + max: 1 + min: 1 + name: new_service +step4: + delay: 1 + name: search_and_add + payload: + plugin: songs +step5: + delay: 1 + name: search_and_add + payload: + plugin: songs +step6: + delay: 0.1 + name: load_service_sequential \ No newline at end of file diff --git a/test2.py b/test2.py new file mode 100644 index 0000000..fe3cbab --- /dev/null +++ b/test2.py @@ -0,0 +1,25 @@ +import json +import yaml +# ... +import argparse +parser = argparse.ArgumentParser() +parser.add_argument('rargs', nargs='*', default=[]) +a = parser.parse_args() +with open(a.rargs[0], 'r') as file: + # The FullLoader parameter handles the conversion from YAML + # scalar values to Python the dictionary format + xx = yaml.load(file) + print(yaml.dump(xx)) + + for x in xx: + print(x) + print(xx[x]) + c = xx[x] + print(c) + if isinstance(c, str): + pass + else: + try: + print(c['delay']) + except KeyError: + pass \ No newline at end of file diff --git a/test_api/apitest/callbacks.py b/test_api/apitest/callbacks.py index 502b581..fe2d100 100644 --- a/test_api/apitest/callbacks.py +++ b/test_api/apitest/callbacks.py @@ -25,7 +25,7 @@ import string from test_api.apitest.constants import BookNames from test_api.apitest.logger import print_text -from test_api.apitest.task import Task +from test_api.apitest.task import Task, human_delay def clear_live_controller(rtc: object) -> None: @@ -47,7 +47,8 @@ def new_service(rtc: object) -> None: assert ret.status_code == 204, f'{ret.status_code} returned' -def search_and_add(rtc: object, plugin: str) -> None: +def search_and_add(rtc: object, payload: dict) -> None: + plugin = payload['plugin'] print_text(f'Search_and_add for {plugin}') if plugin == 'bibles': bk_id = random.randint(1, len(BookNames) - 1) @@ -83,7 +84,8 @@ def search_and_add(rtc: object, plugin: str) -> None: assert ret.status_code == 204, f'{ret.status_code} returned from add' -def search_and_live(rtc: object, plugin: str) -> None: +def search_and_live(rtc: object, payload: dict) -> None: + plugin = payload['plugin'] print_text(f'Search_and_live for {plugin}') while True: let = random.choice(string.ascii_letters) @@ -129,7 +131,8 @@ def load_service_sequential(rtc: object) -> None: if item['plugin'] == 'video': pass else: - rtc.pending.append(Task(rtc, service_item_show, poll_m=1, poll_o=2, ag=item)) + pl = {'max': 1, 'min': 1, 'name': 'service_item_show', 'payload': {'item': item}} + rtc.pending.append(Task(rtc, pl)) # rtc.tasks.append(Task(rtc, play_live_item, poll_m=1, poll_o=2, ag=item)) #rtc.tasks.append(Task(rtc, clear_live_controller, poll_m=1, poll_o=1)) @@ -137,29 +140,35 @@ def load_service_sequential(rtc: object) -> None: #self.load_service_random() -def service_item_show(rtc: object, item: dict) -> None: +def service_item_show(rtc: object, payload: dict) -> None: + item = payload['item'] print_text('Service_item_show') title = item['title'] id = item['id'] print_text(f'test_service_song {title} {id}') ret = requests.post(rtc.base_url + 'service/show', json=dict(uid=id)) assert ret.status_code == 204, ret.status_code - rtc.tasks.append(Task(rtc, play_live_item, poll_m=1, poll_o=2, ag=item)) + pl = {'max': 1, 'min': 2, 'name': 'play_live_item', 'payload': {'item': item}} + rtc.tasks.append(Task(rtc, pl)) -def play_live_item(rtc: object, item: dict) -> None: +def play_live_item(rtc: object, payload: dict) -> None: + item = payload['item'] plugin = item['plugin'] print_text(f'Play_live_item - {plugin}') ret = requests.get(rtc.base_url + 'controller/live-item') assert ret.status_code == 200, f'{ret.status_code} returned from live_item' i = 0 for _ in json.loads(ret.text): - rtc.tasks.append(Task(rtc, controller_item_show, delay=0.1, poll_m=1, poll_o=2, ag=str(i))) + pl = {'max': 1, 'min': 2, 'delay': 1, 'name': 'controller_item_show', 'payload': {'id': i}} + rtc.tasks.append(Task(rtc, pl)) i += 1 assert ret.status_code == 200, f'{ret.status_code} returned from show' -def controller_item_show(rtc: object, id: str) -> None: +def controller_item_show(rtc: object, payload: dict) -> None: + id = payload['id'] print_text('Controller_item_show') ret = requests.post(rtc.base_url + 'controller/show', json=dict(id=int(id))) + human_delay() assert ret.status_code == 204, ret.status_code diff --git a/test_api/apitest/runner.py b/test_api/apitest/runner.py index ecfc1b6..5ce40fc 100644 --- a/test_api/apitest/runner.py +++ b/test_api/apitest/runner.py @@ -18,9 +18,11 @@ # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # ########################################################################## +import argparse import threading import websocket import time +import yaml from collections import deque from websocket import create_connection @@ -79,7 +81,7 @@ class RunTestsController(object): print_error(f'WebSocket Error: {error}') def load_and_check_sockets(self, first_run: bool = False) -> bool: - ws = create_connection(f'ws://{self.address}:{self.ws_port}') + ws = create_connection(f'ws://{self.address}:{self.ws_port}', ping_interval=None) if first_run: print_text('Establishing Connection to State') self.result_stage = ws.recv() @@ -96,6 +98,20 @@ class RunTestsController(object): ws.close() return good + def read_command_file(self) -> None: + parser = argparse.ArgumentParser() + parser.add_argument('rargs', nargs='*', default=[]) + a = parser.parse_args() + with open(a.rargs[0], 'r') as file: + commands = yaml.load(file, Loader=yaml.FullLoader) + + for step in commands: + if step == 'process_name': + print_info(f'Processing file {commands[step]}') + continue + self.tasks.append(Task(self, commands[step])) + self.process_queue() + def compare_stage(self): """ :return: @@ -114,32 +130,6 @@ class RunTestsController(object): self.stage_diff[a] = {'before': reserved[a], 'after': current[a]} self.reserved_result_stage = self.result_stage - def marshal_full(self): - print_ok('Running full test script') - if self.load_and_check_sockets(True): - self.tasks.append(Task(self, clear_live_controller, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, clear_preview_controller, delay=1)) - self.tasks.append(Task(self, new_service, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, search_and_add, delay=1, ag='songs')) - self.tasks.append(Task(self, search_and_add, delay=1, ag='songs')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='custom')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='images')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='songs')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='presentations')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='songs')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='custom')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='custom')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='songs')) - #self.tasks.append(Task(self, search_and_add, delay=1, ag='bibles')) - self.tasks.append(Task(self, load_service_sequential, delay=0.1)) - self.process_queue() - def process_queue(self): while len(self.tasks) > 0: task = self.tasks.popleft() @@ -149,37 +139,6 @@ class RunTestsController(object): pend = self.pending.popleft() self.tasks.append(pend) - def marshal_media(self): - print_ok('Running media test script') - if self.load_and_check_sockets(True): - self.tasks.append(Task(self, clear_live_controller, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, clear_preview_controller, delay=1)) - self.tasks.append(Task(self, new_service, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, search_and_live, delay=1, ag='songs')) - self.tasks.append(Task(self, media_play, delay=2)) - self.tasks.append(Task(self, clear_preview_controller, delay=1)) - self.tasks.append(Task(self, new_service, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, search_and_live, delay=1, ag='media')) - self.tasks.append(Task(self, media_play, delay=5)) - self.tasks.append(Task(self, media_pause, delay=5)) - self.tasks.append(Task(self, media_pause, delay=5)) - self.tasks.append(Task(self, media_play, delay=5)) - self.tasks.append(Task(self, media_stop, delay=1)) - - def marshal_blank(self): - print_ok('Running blank test script') - if self.load_and_check_sockets(True): - self.tasks.append(Task(self, clear_live_controller, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, clear_preview_controller, delay=1)) - self.tasks.append(Task(self, new_service, poll_m=1, poll_o=1)) - - def marshal_alert(self): - print_ok('Running alert test script') - if self.load_and_check_sockets(True): - self.tasks.append(Task(self, clear_live_controller, poll_m=1, poll_o=1)) - self.tasks.append(Task(self, clear_preview_controller, delay=1)) - self.tasks.append(Task(self, new_service, poll_m=1, poll_o=1)) - def load_service_random(self) -> None: print_text('Load_and process_service_random') items = requests.get(f'http://{self.address}:{self.http_port}/api/v2/service/items') diff --git a/test_api/apitest/task.py b/test_api/apitest/task.py index 2d11458..607d6d7 100644 --- a/test_api/apitest/task.py +++ b/test_api/apitest/task.py @@ -18,7 +18,9 @@ # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # ########################################################################## +import importlib import time +from test_api.apitest.callbacks import * # noqa E403 def human_delay(delay: int = 2) -> None: @@ -27,22 +29,27 @@ def human_delay(delay: int = 2) -> None: class Task(object): - def __init__(self, caller: object, callback: object, delay: float = 0, poll_m: int = -1, - poll_o: int = -1, ag: str = None) -> None: + def __init__(self, caller: object, request: dict) -> None: self.caller = caller - self.delay = delay - self.poll_m = poll_m - self.poll_o = poll_o - self.__setattr__("callback", callback) - self.arg = ag + self.request = request + callback = self.request['name'] + function_string = f'test_api.apitest.callbacks.{callback}' + mod_name, func_name = function_string.rsplit('.', 1) + mod = importlib.import_module(mod_name) + func = getattr(mod, func_name) + self.__setattr__("callback", func) def run(self): - if self.arg: - self.callback(self.caller, self.arg) - else: + try: + payload = self.request['payload'] + self.callback(self.caller, payload) + except KeyError: self.callback(self.caller) - if self.delay > 0: - human_delay(self.delay) - if self.poll_m >= 0: - self.caller.check_websocket_changes(self.poll_m, self.poll_m) - + try: + human_delay(self.request['delay']) + except KeyError: + pass + try: + self.caller.check_websocket_changes(self.request['max'], self.request['min']) + except KeyError: + pass \ No newline at end of file diff --git a/test_api/runner.py b/test_api/runner.py index 286cb15..19d5262 100644 --- a/test_api/runner.py +++ b/test_api/runner.py @@ -42,7 +42,8 @@ def start() -> None: print_ok(f'OpenLP is running on port (ws) {op_ws_port}') rtc = RunTestsController(op_address, op_http_port, op_ws_port) rtc.connect() - rtc.marshal_full() + rtc.read_command_file() + #rtc.marshal_full() # nrtc.marshal_media() print_text('Finished running tests')