From 927038a1d74e7323d19c1702283bc50249793d07 Mon Sep 17 00:00:00 2001 From: yevh-berdnyk Date: Sat, 15 Sep 2018 20:18:29 +0300 Subject: [PATCH] dockerfile for running e2e tests against desktop app Signed-off-by: yevh-berdnyk --- test/desktop.sikuli/Dockerfile | 31 ++++++++++++ test/desktop.sikuli/start.sh | 5 ++ test/desktop.sikuli/start_here.py | 33 +++++++++++++ test/desktop.sikuli/tests/base_test_case.py | 45 ++---------------- test/desktop.sikuli/tests/conftest.py | 18 ++----- .../tests/test_create_account.py | 4 +- .../images/sign_in_view/create_account.png | Bin 13444 -> 14173 bytes 7 files changed, 78 insertions(+), 58 deletions(-) create mode 100644 test/desktop.sikuli/Dockerfile create mode 100644 test/desktop.sikuli/start.sh create mode 100644 test/desktop.sikuli/start_here.py diff --git a/test/desktop.sikuli/Dockerfile b/test/desktop.sikuli/Dockerfile new file mode 100644 index 0000000000..0f998eff2e --- /dev/null +++ b/test/desktop.sikuli/Dockerfile @@ -0,0 +1,31 @@ +FROM ubuntu:latest + +RUN apt-get update +RUN apt-get install -y xvfb default-jre default-jdk xdotool curl +RUN update-alternatives --config java +RUN apt-get install -y libopencv3.2-java +RUN ln -s /usr/lib/jni/libopencv_java320.so /usr/lib/libopencv_java.so +RUN apt-get install -y icewm wmctrl x11vnc +RUN apt-get clean + +RUN mkdir tools +RUN pwd +RUN curl -L "http://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar" -o /tools/jython_installer-2.7.1.jar +RUN java -jar /tools/jython_installer-2.7.1.jar -s -d jython-2.7.1 -i ensurepip +RUN curl -L "https://raiman.github.io/SikuliX1/sikulixapi.jar" -o /tools/sikulixapi.jar + +ADD . /home +WORKDIR "/home" + +RUN /jython-2.7.1/bin/jython -m pip install jip +RUN /jython-2.7.1/bin/jython -m pip install -r /home/requirements.txt + +RUN chmod +x ./nightly.AppImage +RUN ./nightly.AppImage --appimage-extract +RUN chmod +x /home/squashfs-root/AppRun + +EXPOSE 5900 +RUN chmod +x start.sh +ENV CLASSPATH=/tools/sikulixapi.jar +ENV DISPLAY=:1 +ENTRYPOINT ["./start.sh"] diff --git a/test/desktop.sikuli/start.sh b/test/desktop.sikuli/start.sh new file mode 100644 index 0000000000..cf03cf7759 --- /dev/null +++ b/test/desktop.sikuli/start.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +Xvfb :1 -screen 0 1024x768x24 +extension GLX +render -noreset& +x11vnc --display :1 -forever& +icewm& +/bin/bash diff --git a/test/desktop.sikuli/start_here.py b/test/desktop.sikuli/start_here.py new file mode 100644 index 0000000000..80263184ec --- /dev/null +++ b/test/desktop.sikuli/start_here.py @@ -0,0 +1,33 @@ +import requests +import re +import docker +from urllib.request import urlretrieve + +raw_data = requests.request('GET', 'https://status-im.github.io/nightly/').text +app_url = re.findall('href="(.*AppImage)', raw_data)[0] +urlretrieve(app_url, 'nightly.AppImage') + + +ps = None + + +client = docker.from_env() +client.images.build(tag='status_desktop', path='.') + +try: + a = client.containers.run("status_desktop", + detach=True, tty=True, ports={'5900/tcp': 5900}) + + it = a.attach(stdout=True, stderr=True) + + print(it) + + ps = a.exec_run(['/jython-2.7.1/bin/jython', '-m', 'pytest', '/home/tests/test_create_account.py'], + stdout=True, stderr=False) +except Exception: + pass +finally: + a.stop() + +for line in ps.output.decode("utf-8").split("\n"): + print(line) diff --git a/test/desktop.sikuli/tests/base_test_case.py b/test/desktop.sikuli/tests/base_test_case.py index 4958fd7a98..d178c58a67 100644 --- a/test/desktop.sikuli/tests/base_test_case.py +++ b/test/desktop.sikuli/tests/base_test_case.py @@ -1,52 +1,13 @@ import org.sikuli.script.SikulixForJython -import pytest from sikuli import * -from subprocess import check_output - - -def mac_os_setup(): - check_output(['hdiutil', 'attach', 'nightly.dmg']) - check_output(['cp', '-rf', '/Volumes/Status/Status.app', '/Applications/']) - check_output(['hdiutil', 'detach', '/Volumes/Status/']) - import time - time.sleep(10) - openApp('Status.app') - - -def mac_os_teardown(): - closeApp('Status.app') - for dir in '/Applications/Status.app', '/Library/Application\ Support/StatusIm', \ - '/Users/yberdnyk/Library/Caches/StatusIm': - check_output(['rm', '-rf', dir]) - - -def linux_setup(): - check_output(['chmod', '+x', './nightly.AppImage']) - check_output(['./nightly.AppImage', '--appimage-extract']) - check_output(['chmod', '+x', '/src/squashfs-root/AppRun']) - openApp('/src/squashfs-root/AppRun') - - -def linux_teardown(): - pass - # check_output(['killall', 'ubuntu-server']) - # check_output(['rm', '-rf', '~/.local/share/StatusIm/']) - # check_output(['rm', '-rf', '~/.cache/StatusIm/']) class BaseTestCase: + Settings.ActionLogs = 0 - Settings.OcrTextSearch = True - Settings.OcrTextRead = True def setup_method(self, method): - if pytest.config.getoption('os') == 'linux': - linux_setup() - else: - mac_os_setup() + openApp('/home/squashfs-root/AppRun') def teardown_method(self, method): - if pytest.config.getoption('os') == 'linux': - linux_teardown() - else: - mac_os_teardown() + pass diff --git a/test/desktop.sikuli/tests/conftest.py b/test/desktop.sikuli/tests/conftest.py index 622a9f3891..b0f9d0b733 100644 --- a/test/desktop.sikuli/tests/conftest.py +++ b/test/desktop.sikuli/tests/conftest.py @@ -1,9 +1,4 @@ -import org.sikuli.script.SikulixForJython -from sikuli import * import pytest -import requests -import re -from urllib import urlretrieve from subprocess import check_output from tests.report import save_test_result, TEST_REPORT_DIR @@ -23,15 +18,7 @@ def pytest_addoption(parser): def pytest_configure(config): - if config.getoption('nightly'): - raw_data = requests.request('GET', 'https://status-im.github.io/nightly/').text - if config.getoption('os') == 'linux': - app_url = re.findall('href="(.*AppImage)', raw_data)[0] - urlretrieve(app_url, 'nightly.AppImage') - else: - dmg_url = re.findall('href="(.*dmg)', raw_data)[0] - urlretrieve(dmg_url, 'nightly.dmg') - + pass @pytest.mark.hookwrapper def pytest_runtest_makereport(item, call): @@ -46,7 +33,8 @@ def pytest_runtest_makereport(item, call): def after_all(): if pytest.config.getoption('os') == 'linux': - check_output(['rm', '-rf', 'nightly.AppImage']) + pass + # check_output(['rm', '-rf', 'nightly.AppImage']) else: check_output(['rm', '-rf', 'nightly.dmg']) diff --git a/test/desktop.sikuli/tests/test_create_account.py b/test/desktop.sikuli/tests/test_create_account.py index ad2defb5a8..046d178a0b 100644 --- a/test/desktop.sikuli/tests/test_create_account.py +++ b/test/desktop.sikuli/tests/test_create_account.py @@ -1,9 +1,11 @@ -from tests.base_test_case import BaseTestCase +import pytest from views.sign_in_view import SignInView +from tests.base_test_case import BaseTestCase class TestCreateAccount(BaseTestCase): + @pytest.mark.desktop def test_create_account(self): sign_in = SignInView() sign_in.create_account_button.click() diff --git a/test/desktop.sikuli/views/images/sign_in_view/create_account.png b/test/desktop.sikuli/views/images/sign_in_view/create_account.png index a40c9333c5a57ff2619cd569a4ca5c1ddab6dcc7..f6f893bec6eea673804bc9069980863c62d5c443 100644 GIT binary patch delta 10713 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