예제 #1
0
def test_double_stop():
    vd = Display().start().stop()
    assert vd.return_code == 0
    assert not vd.is_alive()
    vd.stop()
    assert vd.return_code == 0
    assert not vd.is_alive()
예제 #2
0
def test_stop_terminated():
    vd = Display().start()
    assert vd.is_alive()
    vd._obj._subproc.terminate()
    sleep(0.2)
    assert not vd.is_alive()
    vd.stop()
    assert vd.return_code == 0
    assert not vd.is_alive()
예제 #3
0
def test_nest():
    vd = Display().start()
    assert vd.is_alive()

    nd = Display(visible=True).start().stop()

    assert nd.return_code == 0

    vd.stop()
    assert not vd.is_alive()
예제 #4
0
def test_disp():
    vd = Display().start()
    assert vd.is_alive()

    # d = Display(visible=True).start().sleep(2).stop()
    # .assertEquals(d.return_code, 0)

    d = Display(visible=False).start().stop()
    assert d.return_code == 0

    vd.stop()
    assert not vd.is_alive()
예제 #5
0
def test_virt():
    vd = Display()
    assert vd.return_code is None
    assert not vd.is_alive()
    vd.start()
    assert vd.return_code is None
    assert vd.is_alive()
    vd.stop()
    assert vd.return_code == 0
    assert not vd.is_alive()

    vd = Display().start().stop()
    assert vd.return_code == 0
    assert not vd.is_alive()
예제 #6
0
def test_extra_args():
    # Unrecognized option
    d = Display(extra_args=["willcrash"])
    with pytest.raises(XStartError):
        d.start()

    with Display():
        # -c                     turns off key-click
        with Display(visible=True, extra_args=["-c"]) as d:
            assert d.is_alive()
        assert not d.is_alive()

        with XephyrDisplay(extra_args=["-c"]) as d:
            assert d.is_alive()
        assert not d.is_alive()
예제 #7
0
def main(i, backend):
    # TODO: test all backends
    d = Display(backend=backend).start()
    print("my index:%s  backend:%s disp:%s" % (i, backend, d.new_display_var))
    ok = d.is_alive()
    d.stop()
    assert ok
def new_driver_wrapper(startup_url=None):
    logger = logging.getLogger(__name__)
    browser_config = BrowserConfig()

    display = None
    if browser_config.getbool('use_headless_browser'
                              ) and not browser_config.getbool('use_remote'):
        display = Display(visible=0, size=(1280, 1024))
        display.start()
        display_pid = display.pid

        def process_exists(pid):
            try:
                os.kill(pid, 0)
            except OSError:
                return False
            else:
                return True

        polling.poll(
            lambda: display.is_alive(),
            timeout=60,
            exception_message='Display was not alive; process was: {}'.format(
                display_pid),
            ontimeout=(
                lambda: logger.critical('Display process {} exists: {}'.format(
                    display_pid, process_exists(display_pid))), ))

        polling.poll(
            lambda: display.is_started,
            timeout=60,
            exception_message=
            'Display was alive but not started; process was: {}'.format(
                display_pid))

        # TODO: Is there a better condition we can check here?
        time.sleep(1.5)

    driver = new_driver()

    logging.getLogger(__name__).info('Browser successfully launched')

    action_callbacks = []
    # Fail if there are errors in the console
    if TestrunConfig().getbool('fail_on_console_errors'):
        action_callbacks.append(_log_fail_callback)

    driver_wrapper = CoyoteDriver(
        driver=driver,
        display=display,
        options={
            'timeout': 40,
            'page_load_timeout': 45,
            'ignore_page_load_timeouts':
            True,  # Prevent page timeouts from breaking out tests
            'action_callbacks': action_callbacks
        })
    driver.set_window_size(*(1280, 1024))
    return driver_wrapper
예제 #9
0
def _start_virtual_display(width, height):
    from pyvirtualdisplay import Display
    d = Display(visible=0, size=(width, height))
    d.start()
    if d.stderr or not d.is_alive():
        raise Exception(
            'Could not open headless Display with width({}) and height ({}). StdErr: {}'
            ''.format(width, height, d.stderr))
    return d
def new_driver_wrapper(startup_url=None):
    logger = logging.getLogger(__name__)
    browser_config = BrowserConfig()

    display = None
    if browser_config.getbool('use_headless_browser') and not browser_config.getbool('use_remote'):
        display = Display(visible=0, size=(1280, 1024))
        display.start()
        display_pid = display.pid

        def process_exists(pid):
            try:
                os.kill(pid, 0)
            except OSError:
                return False
            else:
                return True

        polling.poll(
            lambda: display.is_alive(),
            timeout=60,
            exception_message='Display was not alive; process was: {}'.format(display_pid),
            ontimeout=(
                lambda: logger.critical('Display process {} exists: {}'.format(
                    display_pid,
                    process_exists(display_pid))
                ),
            )
        )

        polling.poll(
            lambda: display.is_started,
            timeout=60,
            exception_message='Display was alive but not started; process was: {}'.format(display_pid)
        )

        # TODO: Is there a better condition we can check here?
        time.sleep(1.5)

    driver = new_driver()

    logging.getLogger(__name__).info('Browser successfully launched')

    action_callbacks = []
    # Fail if there are errors in the console
    if TestrunConfig().getbool('fail_on_console_errors'):
        action_callbacks.append(_log_fail_callback)

    driver_wrapper = CoyoteDriver(driver=driver, display=display, options={
        'timeout': 40,
        'page_load_timeout': 45,
        'ignore_page_load_timeouts': True,  # Prevent page timeouts from breaking out tests
        'action_callbacks': action_callbacks
    })
    driver.set_window_size(*(1280, 1024))
    return driver_wrapper
예제 #11
0
def main(i, backend, retries):
    retries = int(retries)
    kwargs = dict()
    if backend == "xvnc":
        kwargs["rfbport"] = 42000 + int(i)

    d = Display(backend=backend, retries=retries, **kwargs).start()
    print("my index:%s  backend:%s disp:%s retries:%s" %
          (i, backend, d.new_display_var, d._obj._retries_current))
    ok = d.is_alive()
    d.stop()
    assert ok
예제 #12
0
def main(i, backend, retries):
    retries = int(retries)
    kwargs = dict()
    if backend == "xvnc":
        kwargs["rfbport"] = 42000 + 100 * worker() + int(i)
    # print("$DISPLAY=%s" % (os.environ.get("DISPLAY")))
    d = Display(backend=backend, retries=retries, **kwargs).start()
    print("my index:%s  backend:%s disp:%s retries:%s" % (
        i,
        backend,
        d.new_display_var,
        d._obj._retries_current,
    ))
    ok = d.is_alive()
    d.stop()
    assert ok
예제 #13
0
class SeleniumExecutor(ScenarioExecutor, WidgetProvider, FileLister):
    """
    Selenium executor
    :type virtual_display: Display
    """
    SELENIUM_DOWNLOAD_LINK = "http://selenium-release.storage.googleapis.com/{version}/" \
                             "selenium-server-standalone-{version}.0.jar"
    SELENIUM_VERSION = "2.46"

    JUNIT_DOWNLOAD_LINK = "http://search.maven.org/remotecontent?filepath=junit/junit/{version}/junit-{version}.jar"
    JUNIT_VERSION = "4.12"
    JUNIT_MIRRORS_SOURCE = "http://search.maven.org/solrsearch/select?q=g%3A%22junit%22%20AND%20a%3A%22junit%22%20" \
                           "AND%20v%3A%22{version}%22&rows=20&wt=json".format(version=JUNIT_VERSION)

    HAMCREST_DOWNLOAD_LINK = "https://hamcrest.googlecode.com/files/hamcrest-core-1.3.jar"

    SUPPORTED_TYPES = [".py", ".jar", ".java"]

    def __init__(self):
        super(SeleniumExecutor, self).__init__()
        self.virtual_display = None
        self.start_time = None
        self.end_time = None
        self.runner = None
        self.widget = None
        self.reader = None
        self.kpi_file = None
        self.err_jtl = None
        self.runner_working_dir = None
        self.scenario = None

    def prepare(self):
        """
        1) Locate script or folder
        2) detect script type
        3) create runner instance, prepare runner
        """
        self.scenario = self.get_scenario()
        self._verify_script()
        self.kpi_file = self.engine.create_artifact("selenium_tests_report", ".csv")
        self.err_jtl = self.engine.create_artifact("selenium_tests_err", ".xml")
        script_type = self.detect_script_type(self.scenario.get(Scenario.SCRIPT))

        if script_type == ".py":
            self.runner = NoseTester
            runner_config = self.settings.get("selenium-tools").get("nose")
        elif script_type == ".jar" or script_type == ".java":
            self.runner = JunitTester
            runner_config = self.settings.get("selenium-tools").get("junit")
        else:
            raise ValueError("Unsupported script type: %s" % script_type)

        runner_config["script-type"] = script_type
        self.runner_working_dir = self.engine.create_artifact(runner_config.get("working-dir", "classes"), "")
        runner_config["working-dir"] = self.runner_working_dir
        runner_config.get("artifacts-dir", self.engine.artifacts_dir)
        runner_config.get("working-dir", self.runner_working_dir)
        runner_config.get("report-file", self.kpi_file)
        runner_config.get("err-file", self.err_jtl)
        runner_config.get("stdout", self.engine.create_artifact("junit", ".out"))
        runner_config.get("stderr", self.engine.create_artifact("junit", ".err"))

        self._cp_resource_files(self.runner_working_dir)

        self.runner = self.runner(runner_config, self.scenario, self.log)
        self.runner.prepare()
        self.reader = JTLReader(self.kpi_file, self.log, self.err_jtl)
        if isinstance(self.engine.aggregator, ConsolidatingAggregator):
            self.engine.aggregator.add_underling(self.reader)

        display_conf = self.settings.get("virtual-display")
        if display_conf:
            width = display_conf.get("width", 1024)
            height = display_conf.get("height", 768)
            self.virtual_display = Display(size=(width, height))

    def _verify_script(self):
        if not self.scenario.get("script"):
            if self.scenario.get("requests"):
                self.scenario["script"] = self.__tests_from_requests()
            else:
                raise RuntimeError("Nothing to test, no requests were provided in scenario")

    def _cp_resource_files(self, runner_working_dir):
        """
        :return:
        """
        script = self.scenario.get("script")

        if Scenario.SCRIPT in self.scenario:
            if os.path.isdir(script):
                shutil.copytree(script, runner_working_dir)
            else:
                os.makedirs(runner_working_dir)
                shutil.copy2(script, runner_working_dir)

    def detect_script_type(self, script_path):
        """
        checks if script is java or python
        if it's folder or single script
        :return:
        """
        if not isinstance(script_path, string_types) and not isinstance(script_path, text_type):
            raise RuntimeError("Nothing to test, no files were provided in scenario")
        test_files = []
        for dir_entry in os.walk(script_path):
            if dir_entry[2]:
                for test_file in dir_entry[2]:
                    if os.path.splitext(test_file)[1].lower() in SeleniumExecutor.SUPPORTED_TYPES:
                        test_files.append(test_file)

        if os.path.isdir(script_path):
            file_ext = os.path.splitext(test_files[0])[1].lower()
        else:
            file_ext = os.path.splitext(script_path)[1]

        if file_ext not in SeleniumExecutor.SUPPORTED_TYPES:
            raise RuntimeError("Supported tests types %s was not found" % SeleniumExecutor.SUPPORTED_TYPES)
        return file_ext

    def startup(self):
        """
        Start runner
        :return:
        """
        self.start_time = time.time()
        if self.virtual_display:
            msg = "Starting virtual display[%s]: %s"
            self.log.info(msg, self.virtual_display.size, self.virtual_display.new_display_var)
            self.virtual_display.start()
        self.runner.run_tests()

    def check(self):
        """
        check if test completed
        :return:
        """
        if self.widget:
            self.widget.update()

        if self.virtual_display and not self.virtual_display.is_alive():
            self.log.info("Virtual display out: %s", self.virtual_display.stdout)
            self.log.warning("Virtual display err: %s", self.virtual_display.stderr)
            raise RuntimeError("Virtual display failed: %s" % self.virtual_display.return_code)

        return self.runner.is_finished()

    def shutdown(self):
        """
        shutdown test_runner
        :return:
        """
        try:
            self.runner.shutdown()
        finally:
            if self.virtual_display and self.virtual_display.is_alive():
                self.virtual_display.stop()

        if self.start_time:
            self.end_time = time.time()
            self.log.debug("Selenium tests ran for %s seconds", self.end_time - self.start_time)

    def post_process(self):
        if self.reader and not self.reader.buffer:
            raise RuntimeWarning("Empty results, most likely Selenium failed")

    def get_widget(self):
        if not self.widget:
            self.widget = SeleniumWidget(self.scenario.get("script"), self.runner.settings.get("stdout"))
        return self.widget

    def resource_files(self):
        if not self.scenario:
            self.scenario = self.get_scenario()

        if "script" not in self.scenario:
            return []

        script = self.scenario.get("script")
        script_type = self.detect_script_type(script)

        if script_type == ".py":
            runner_config = self.settings.get("selenium-tools").get("nose")
        elif script_type == ".jar" or script_type == ".java":
            runner_config = self.settings.get("selenium-tools").get("junit")
        else:
            raise ValueError("Unsupported script type: %s" % script_type)

        if self.runner_working_dir is None:
            self.runner_working_dir = self.engine.create_artifact(runner_config.get("working-dir", "classes"), "")

        self._cp_resource_files(self.runner_working_dir)

        return [os.path.basename(self.runner_working_dir)]

    def __tests_from_requests(self):
        filename = self.engine.create_artifact("test_requests", ".py")
        nose_test = SeleniumScriptBuilder(self.scenario, self.log)
        nose_test.scenario = self.scenario
        nose_test.gen_test_case()
        nose_test.save(filename)
        return filename
예제 #14
0
파일: selenium.py 프로젝트: groyoh/taurus
class SeleniumExecutor(ScenarioExecutor, WidgetProvider, FileLister):
    """
    Selenium executor
    :type virtual_display: Display
    """
    SELENIUM_DOWNLOAD_LINK = "http://selenium-release.storage.googleapis.com/{version}/" \
                             "selenium-server-standalone-{version}.0.jar"
    SELENIUM_VERSION = "2.46"

    JUNIT_DOWNLOAD_LINK = "http://search.maven.org/remotecontent?filepath=junit/junit/{version}/junit-{version}.jar"
    JUNIT_VERSION = "4.12"
    JUNIT_MIRRORS_SOURCE = "http://search.maven.org/solrsearch/select?q=g%3A%22junit%22%20AND%20a%3A%22junit%22%20" \
                           "AND%20v%3A%22{version}%22&rows=20&wt=json".format(version=JUNIT_VERSION)

    HAMCREST_DOWNLOAD_LINK = "https://hamcrest.googlecode.com/files/hamcrest-core-1.3.jar"

    SUPPORTED_TYPES = [".py", ".jar", ".java"]

    def __init__(self):
        super(SeleniumExecutor, self).__init__()
        self.virtual_display = None
        self.start_time = None
        self.end_time = None
        self.runner = None
        self.widget = None
        self.reader = None
        self.kpi_file = None
        self.err_jtl = None
        self.runner_working_dir = None
        self.scenario = None

    def prepare(self):
        """
        1) Locate script or folder
        2) detect script type
        3) create runner instance, prepare runner
        """
        self.scenario = self.get_scenario()
        self._verify_script()
        self.kpi_file = self.engine.create_artifact("selenium_tests_report",
                                                    ".csv")
        self.err_jtl = self.engine.create_artifact("selenium_tests_err",
                                                   ".xml")
        script_type = self.detect_script_type(self.scenario.get("script"))

        if script_type == ".py":
            self.runner = NoseTester
            runner_config = self.settings.get("selenium-tools").get("nose")
        elif script_type == ".jar" or script_type == ".java":
            self.runner = JunitTester
            runner_config = self.settings.get("selenium-tools").get("junit")
        else:
            raise ValueError("Unsupported script type: %s" % script_type)

        runner_config["script-type"] = script_type
        self.runner_working_dir = self.engine.create_artifact(
            runner_config.get("working-dir", "classes"), "")
        runner_config["working-dir"] = self.runner_working_dir
        runner_config.get("artifacts-dir", self.engine.artifacts_dir)
        runner_config.get("working-dir", self.runner_working_dir)
        runner_config.get("report-file", self.kpi_file)
        runner_config.get("err-file", self.err_jtl)
        runner_config.get("stdout",
                          self.engine.create_artifact("junit", ".out"))
        runner_config.get("stderr",
                          self.engine.create_artifact("junit", ".err"))

        self._cp_resource_files(self.runner_working_dir)

        self.runner = self.runner(runner_config, self.scenario, self.log)
        self.runner.prepare()
        self.reader = JTLReader(self.kpi_file, self.log, self.err_jtl)
        if isinstance(self.engine.aggregator, ConsolidatingAggregator):
            self.engine.aggregator.add_underling(self.reader)

        display_conf = self.settings.get("virtual-display")
        if display_conf:
            width = display_conf.get("width", 1024)
            height = display_conf.get("height", 768)
            self.virtual_display = Display(size=(width, height))

    def _verify_script(self):
        if not self.scenario.get("script"):
            if self.scenario.get("requests"):
                self.scenario["script"] = self.__tests_from_requests()
            else:
                raise RuntimeError(
                    "Nothing to test, no requests were provided in scenario")

    def _cp_resource_files(self, runner_working_dir):
        """
        :return:
        """
        script = self.scenario.get("script")

        if Scenario.SCRIPT in self.scenario:
            if os.path.isdir(script):
                shutil.copytree(script, runner_working_dir)
            else:
                os.makedirs(runner_working_dir)
                shutil.copy2(script, runner_working_dir)

    def detect_script_type(self, script_path):
        """
        checks if script is java or python
        if it's folder or single script
        :return:
        """
        if not isinstance(script_path, string_types) and not isinstance(
                script_path, text_type):
            raise RuntimeError(
                "Nothing to test, no files were provided in scenario")
        test_files = []
        for dir_entry in os.walk(script_path):
            if dir_entry[2]:
                for test_file in dir_entry[2]:
                    if os.path.splitext(test_file)[1].lower(
                    ) in SeleniumExecutor.SUPPORTED_TYPES:
                        test_files.append(test_file)

        if os.path.isdir(script_path):
            file_ext = os.path.splitext(test_files[0])[1].lower()
        else:
            file_ext = os.path.splitext(script_path)[1]

        if file_ext not in SeleniumExecutor.SUPPORTED_TYPES:
            raise RuntimeError("Supported tests types %s was not found" %
                               SeleniumExecutor.SUPPORTED_TYPES)
        return file_ext

    def startup(self):
        """
        Start runner
        :return:
        """
        self.start_time = time.time()
        if self.virtual_display:
            msg = "Starting virtual display[%s]: %s"
            self.log.info(msg, self.virtual_display.size,
                          self.virtual_display.new_display_var)
            self.virtual_display.start()
        self.runner.run_tests()

    def check(self):
        """
        check if test completed
        :return:
        """
        if self.widget:
            self.widget.update()

        if self.virtual_display and not self.virtual_display.is_alive():
            self.log.info("Virtual display out: %s",
                          self.virtual_display.stdout)
            self.log.warning("Virtual display err: %s",
                             self.virtual_display.stderr)
            raise RuntimeError("Virtual display failed: %s" %
                               self.virtual_display.return_code)

        return self.runner.is_finished()

    def shutdown(self):
        """
        shutdown test_runner
        :return:
        """
        try:
            self.runner.shutdown()
        finally:
            if self.virtual_display and self.virtual_display.is_alive():
                self.virtual_display.stop()

        if self.start_time:
            self.end_time = time.time()
            self.log.debug("Selenium tests ran for %s seconds",
                           self.end_time - self.start_time)

    def post_process(self):
        if self.reader and not self.reader.buffer:
            raise RuntimeWarning("Empty results, most likely Selenium failed")

    def get_widget(self):
        if not self.widget:
            self.widget = SeleniumWidget(self.scenario.get("script"),
                                         self.runner.settings.get("stdout"))
        return self.widget

    def resource_files(self):
        if not self.scenario:
            self.scenario = self.get_scenario()

        if "script" not in self.scenario:
            return []

        script = self.scenario.get("script")
        script_type = self.detect_script_type(script)

        if script_type == ".py":
            runner_config = self.settings.get("selenium-tools").get("nose")
        elif script_type == ".jar" or script_type == ".java":
            runner_config = self.settings.get("selenium-tools").get("junit")
        else:
            raise ValueError("Unsupported script type: %s" % script_type)

        if self.runner_working_dir is None:
            self.runner_working_dir = self.engine.create_artifact(
                runner_config.get("working-dir", "classes"), "")

        self._cp_resource_files(self.runner_working_dir)

        return [os.path.basename(self.runner_working_dir)]

    def __tests_from_requests(self):
        filename = self.engine.create_artifact("test_requests", ".py")
        nose_test = SeleniumScriptBuilder(self.scenario, self.log)
        nose_test.scenario = self.scenario
        nose_test.gen_test_case()
        nose_test.save(filename)
        return filename
예제 #15
0
def test_random():
    r = Randomizer()
    vd = Display(randomizer=r).start().stop()
    assert vd.return_code == 0
    # assert r.min <= vd.display <= r.min + r.delta # can be auto nr
    assert not vd.is_alive()