From 8bab9f8f2232bd17496041640b18d139a641f945 Mon Sep 17 00:00:00 2001 From: Yevheniia Berdnyk Date: Thu, 10 Aug 2023 00:26:13 +0300 Subject: [PATCH] e2e: pulling geth log in teardown if setup is failed --- test/appium/tests/base_test_case.py | 69 ++++++++++++++++------------- test/appium/views/base_view.py | 4 +- test/appium/views/sign_in_view.py | 6 +-- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/test/appium/tests/base_test_case.py b/test/appium/tests/base_test_case.py index 91a0287f58..e7d2f652ed 100644 --- a/test/appium/tests/base_test_case.py +++ b/test/appium/tests/base_test_case.py @@ -12,15 +12,12 @@ import requests from appium import webdriver from appium.webdriver.common.mobileby import MobileBy from sauceclient import SauceException -from selenium.common.exceptions import NoSuchElementException -from selenium.common.exceptions import WebDriverException -from selenium.common.exceptions import TimeoutException +from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException from selenium.webdriver.support.wait import WebDriverWait from urllib3.exceptions import MaxRetryError, ProtocolError from support.api.network_api import NetworkApi -from tests import test_suite_data, start_threads, appium_container, pytest_config_global -from tests import transl +from tests import test_suite_data, start_threads, appium_container, pytest_config_global, transl from tests.conftest import sauce_username, sauce_access_key, apibase, github_report executor_sauce_lab = 'https://%s:%s@ondemand.%s:443/wd/hub' % (sauce_username, sauce_access_key, apibase) @@ -90,6 +87,24 @@ def update_capabilities_sauce_lab(new_capabilities: dict): return caps +def get_app_path(): + app_folder = 'im.status.ethereum' + apk = pytest_config_global['apk'] + if re.findall(r'pr\d\d\d\d\d', apk) or re.findall(r'\d\d\d\d\d.apk', apk): + app_folder += '.pr' + app_path = '/storage/emulated/0/Android/data/%s/files/Download/' % app_folder + return app_path + + +def get_geth_path(): + return get_app_path() + 'geth.log' + + +def pull_geth(driver): + result = driver.pull_file(get_geth_path()) + return base64.b64decode(result) + + class AbstractTestCase: __metaclass__ = ABCMeta @@ -101,19 +116,6 @@ class AbstractTestCase: def get_translation_by_key(self, key): return transl[key] - @property - def app_path(self): - app_folder = 'im.status.ethereum' - apk = pytest_config_global['apk'] - if re.findall(r'pr\d\d\d\d\d', apk) or re.findall(r'\d\d\d\d\d.apk', apk): - app_folder += '.pr' - app_path = '/storage/emulated/0/Android/data/%s/files/Download/' % app_folder - return app_path - - @property - def geth_path(self): - return self.app_path + 'geth.log' - @abstractmethod def setup_method(self, method): raise NotImplementedError('Should be overridden from a child class') @@ -146,14 +148,6 @@ class AbstractTestCase: test_suite_data.current_test.testruns[-1].error = "%s; \n RemoteDisconnected" % \ test_suite_data.current_test.testruns[-1].error - def pull_geth(self, driver): - result = "" - # try: - result = driver.pull_file(self.geth_path) - # except WebDriverException: - # pass - return base64.b64decode(result) - class Driver(webdriver.Remote): @@ -207,7 +201,7 @@ class SingleDeviceTestCase(AbstractTestCase): self.print_sauce_lab_info(self.driver) try: self.add_alert_text_to_report(self.driver) - geth_content = self.pull_geth(self.driver) + geth_content = pull_geth(self.driver) self.driver.quit() if pytest_config_global['docker']: appium_container.stop_container() @@ -215,7 +209,7 @@ class SingleDeviceTestCase(AbstractTestCase): pass finally: github_report.save_test(test_suite_data.current_test, - {'%s_geth.log' % test_suite_data.current_test.name: geth_content}) + {'%s_geth.log' % test_suite_data.current_test.name: geth_content}) class LocalMultipleDeviceTestCase(AbstractTestCase): @@ -271,7 +265,7 @@ class SauceMultipleDeviceTestCase(AbstractTestCase): self.add_alert_text_to_report(self.drivers[driver]) geth_names.append( '%s_geth%s.log' % (test_suite_data.current_test.name, str(self.drivers[driver].number))) - geth_contents.append(self.pull_geth(self.drivers[driver])) + geth_contents.append(pull_geth(self.drivers[driver])) self.drivers[driver].quit() except (WebDriverException, AttributeError): pass @@ -372,7 +366,7 @@ class SauceSharedMultipleDeviceTestCase(AbstractTestCase): self.add_alert_text_to_report(self.drivers[driver]) geth_names.append( '%s_geth%s.log' % (test_suite_data.current_test.name, str(self.drivers[driver].number))) - geth_contents.append(self.pull_geth(self.drivers[driver])) + geth_contents.append(pull_geth(self.drivers[driver])) except (WebDriverException, AttributeError, RemoteDisconnected, ProtocolError): pass @@ -396,8 +390,16 @@ class SauceSharedMultipleDeviceTestCase(AbstractTestCase): from tests.conftest import sauce requests_session = requests.Session() requests_session.auth = (sauce_username, sauce_access_key) + if test_suite_data.tests[0].testruns[-1].error and 'setup failed' in test_suite_data.tests[0].testruns[ + -1].error: + group_setup_failed = True + else: + group_setup_failed = False + geth_contents = list() try: for _, driver in cls.drivers.items(): + if group_setup_failed: + geth_contents.append(pull_geth(driver=driver)) session_id = driver.session_id try: sauce.jobs.update_job(username=sauce_username, job_id=session_id, name=cls.__name__) @@ -428,7 +430,14 @@ class SauceSharedMultipleDeviceTestCase(AbstractTestCase): cls.loop.close() except AttributeError: pass + + geth_names = ['%s_geth%s.log' % (cls.__name__, i) for i in range(len(geth_contents))] + geth = dict(zip(geth_names, geth_contents)) + geth_paths = github_report.save_geth(geth) + for test in test_suite_data.tests: + if group_setup_failed: + test.geth_paths = geth_paths github_report.save_test(test) diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index 6b7f5ea960..fb46ede8dd 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -672,8 +672,8 @@ class BaseView(object): return items_in_logcat def find_values_in_geth(self, *args): - from tests.base_test_case import AbstractTestCase - b64_log = self.driver.pull_file(AbstractTestCase().geth_path) + from tests.base_test_case import pull_geth + b64_log = pull_geth(self.driver) file = base64.b64decode(b64_log) result = False for value in args: diff --git a/test/appium/views/sign_in_view.py b/test/appium/views/sign_in_view.py index 3c339f1737..3c80d22228 100644 --- a/test/appium/views/sign_in_view.py +++ b/test/appium/views/sign_in_view.py @@ -4,7 +4,7 @@ import os from selenium.common.exceptions import NoSuchElementException from tests import common_password, appium_root_project_path -from tests.base_test_case import AbstractTestCase +from tests.base_test_case import get_app_path from views.base_element import Button, EditBox, Text from views.base_view import BaseView @@ -324,7 +324,7 @@ class SignInView(BaseView): self.get_multiaccount_by_position(1).click() self.password_input.set_value(password) self.driver.push_file(source_path=full_path_to_file, - destination_path='%s%s' % (AbstractTestCase().app_path, import_file_name)) + destination_path='%s%s' % (get_app_path(), import_file_name)) self.options_button.click() self.element_by_text('Import unencrypted').click() self.element_by_text('Import unencrypted').wait_for_invisibility_of_element(40) @@ -345,7 +345,7 @@ class SignInView(BaseView): self.options_button.click() self.element_by_text('Export unencrypted').wait_and_click(40) self.element_by_text('Export unencrypted').wait_for_invisibility_of_element(40) - file_base_64 = self.driver.pull_file('%s/export.db' % AbstractTestCase().app_path) + file_base_64 = self.driver.pull_file('%s/export.db' % get_app_path()) try: with open(full_path_to_file, "wb") as f: f.write(base64.b64decode(file_base_64))