bunkerized-nginx/tests/Test.py

148 lines
5.2 KiB
Python
Raw Normal View History

from abc import ABC
2022-12-14 17:09:57 +01:00
from pathlib import Path
2022-07-11 12:17:33 +02:00
from time import time, sleep
from requests import get
from traceback import format_exc
2022-07-13 21:23:58 +02:00
from shutil import copytree
2022-07-11 12:17:33 +02:00
from os.path import isdir, join
from os import getenv, mkdir, walk, rename
2022-07-13 21:43:04 +02:00
from re import sub, search, MULTILINE
2022-07-13 21:23:58 +02:00
from subprocess import run
2023-03-05 21:51:04 +01:00
from logger import log
2022-07-11 12:17:33 +02:00
class Test(ABC):
def __init__(self, name, kind, timeout, tests, no_copy_container=False, delay=0):
2022-07-11 12:17:33 +02:00
self._name = name
self.__kind = kind
self._timeout = timeout
2022-07-11 12:17:33 +02:00
self.__tests = tests
self._no_copy_container = no_copy_container
2022-07-27 14:44:46 +02:00
self.__delay = delay
self._domains = {}
2023-03-05 21:51:04 +01:00
log("TEST", "", "instiantiated with " + str(len(tests)) + " tests and timeout of " + str(timeout) + "s for " + self._name)
2022-07-11 12:17:33 +02:00
# called once before running all the different tests for a given integration
@staticmethod
def init():
try:
if not isdir("/tmp/bw-data"):
2022-07-11 12:17:33 +02:00
mkdir("/tmp/bw-data")
2022-07-14 14:33:04 +02:00
run("sudo chmod 777 /tmp/bw-data", shell=True)
2022-07-11 12:17:33 +02:00
rm_dirs = ["configs", "plugins", "www"]
for rm_dir in rm_dirs:
if isdir(rm_dir):
run(f"sudo rm -rf /tmp/bw-data/{rm_dir}", shell=True)
if not isdir("/tmp/tests"):
2022-07-11 16:23:50 +02:00
mkdir("/tmp/tests")
except:
2023-03-05 21:51:04 +01:00
log("TEST", "", "exception while running Test.init()\n" + format_exc())
2022-07-11 12:17:33 +02:00
return False
return True
2022-07-13 22:57:36 +02:00
# called once all tests ended
@staticmethod
def end():
return True
2022-07-13 22:57:36 +02:00
2022-07-11 12:17:33 +02:00
# called before starting the tests
# must be override if specific actions needs to be done
def _setup_test(self):
try:
2022-07-11 16:23:50 +02:00
rm_dirs = ["configs", "plugins", "www"]
for rm_dir in rm_dirs:
if isdir(f"/tmp/bw-data/{rm_dir}"):
run(
f"sudo bash -c 'rm -rf /tmp/bw-data/{rm_dir}/*'",
shell=True,
)
if isdir(f"/tmp/tests/{self._name}"):
run(f"sudo rm -rf /tmp/tests/{self._name}", shell=True)
copytree(f"./examples/{self._name}", f"/tmp/tests/{self._name}")
except:
2023-03-05 21:51:04 +01:00
log("TEST", "", "exception while running Test._setup_test()\n" + format_exc())
2022-07-11 12:17:33 +02:00
return False
return True
# called after running the tests
def _cleanup_test(self):
try:
run(f"sudo rm -rf /tmp/tests/{self._name}", shell=True)
except:
2023-03-05 21:51:04 +01:00
log("TEST", "", "exception while running Test._cleanup_test()\n" + format_exc())
2022-07-11 12:17:33 +02:00
return False
return True
# run all the tests
def run_tests(self):
if not self._setup_test():
self._debug_fail()
2022-07-11 12:17:33 +02:00
return False
if self.__delay != 0:
2023-03-05 21:51:04 +01:00
log("TEST", "", "delay is set, sleeping " + str(self.__delay) + "s")
2022-07-27 14:44:46 +02:00
sleep(self.__delay)
2022-07-11 12:17:33 +02:00
start = time()
while time() < start + self._timeout:
2022-07-11 12:17:33 +02:00
all_ok = True
for test in self.__tests:
2022-07-11 12:17:33 +02:00
ok = self.__run_test(test)
2022-07-20 20:31:50 +02:00
sleep(1)
if not ok:
2022-07-11 12:17:33 +02:00
all_ok = False
break
if all_ok:
2022-07-11 12:17:33 +02:00
elapsed = str(int(time() - start))
2023-03-05 21:51:04 +01:00
log("TEST", "", "success (" + elapsed + "/" + str(self._timeout) + "s)")
2022-07-11 12:17:33 +02:00
return self._cleanup_test()
self.__logger.warning("tests not ok, retrying in 1s ...")
2022-07-14 14:27:18 +02:00
self._debug_fail()
self._cleanup_test()
2023-03-05 21:51:04 +01:00
log("TEST", "", "failed (timeout = " + str(self._timeout) + "s)")
2022-07-11 12:17:33 +02:00
return False
# run a single test
def __run_test(self, test):
try:
2022-07-23 11:29:18 +02:00
ex_url = test["url"]
for ex_domain, test_domain in self._domains.items():
if search(ex_domain, ex_url):
2022-07-23 11:29:18 +02:00
ex_url = sub(ex_domain, test_domain, ex_url)
break
if test["type"] == "string":
r = get(ex_url, timeout=10)
return test["string"].casefold() in r.text.casefold()
elif test["type"] == "status":
r = get(ex_url, timeout=10)
2022-07-23 11:29:18 +02:00
return test["status"] == r.status_code
except:
2022-07-13 21:43:04 +02:00
return False
raise Exception(f"Unknown test type {test['type']}")
2022-07-11 12:17:33 +02:00
2022-07-14 14:27:18 +02:00
# called when tests fail : typical case is to show logs
def _debug_fail(self):
2022-07-14 14:27:18 +02:00
pass
@staticmethod
def replace_in_file(path, old, new):
try:
2022-12-14 17:09:57 +01:00
Path(path).write_text(
sub(old, new, Path(path).read_text(), flags=MULTILINE)
)
except:
2023-03-05 21:51:04 +01:00
log("TEST", "⚠️", "can't replace file " + path + " : " + format_exc())
2022-07-11 12:17:33 +02:00
@staticmethod
def replace_in_files(path, old, new):
for root, _, files in walk(path):
for name in files:
Test.replace_in_file(join(root, name), old, new)
2022-07-11 16:23:50 +02:00
@staticmethod
def rename(path, old, new):
for root, dirs, files in walk(path):
for name in dirs + files:
2022-07-11 12:17:33 +02:00
full_path = join(root, name)
2022-07-20 16:26:53 +02:00
new_path = sub(old, new, full_path)
if full_path != new_path:
rename(full_path, new_path)