def test_one_dependency(self):
     with script.Script(
             os.path.join(self.tmpdir.name, 'test_single_dependency.py'),
             SINGLE_REQUIREMENT) as test:
         config = {'resolver.references': [test.path]}
         suite = TestSuite.from_config(config=config)
         tests = suite.get_test_variants()
         graph = RuntimeTaskGraph(tests, suite.name, 1, "")
         runtime_tests = graph.get_tasks_in_topological_order()
         self.assertTrue(
             runtime_tests[0].task.identifier.name.endswith("test_a"))
         self.assertTrue(
             runtime_tests[1].task.identifier.name.endswith("hello"))
         self.assertTrue(
             runtime_tests[2].task.identifier.name.endswith("test_b"))
         self.assertTrue(
             runtime_tests[3].task.identifier.name.endswith("test_c"))
Esempio n. 2
0
 def test_multiple_dependencies(self):
     with script.Script(
             os.path.join(self.tmpdir.name,
                          "test_multiple_dependencies.py"),
             MULTIPLE_REQUIREMENT,
     ) as test:
         config = {"resolver.references": [test.path]}
         suite = TestSuite.from_config(config=config)
         tests = suite.get_test_variants()
         graph = RuntimeTaskGraph(tests, suite.name, 1, "")
         runtime_tests = graph.get_tasks_in_topological_order()
         self.assertTrue(
             runtime_tests[0].task.identifier.name.endswith("hello"))
         self.assertTrue(
             runtime_tests[1].task.identifier.name.endswith("test_a"))
         self.assertTrue(
             runtime_tests[2].task.identifier.name.endswith("test_b"))
         self.assertTrue(
             runtime_tests[3].task.identifier.name.endswith("hello"))
         self.assertTrue(
             runtime_tests[4].task.identifier.name.endswith("-foo-bar-"))
         self.assertTrue(
             runtime_tests[5].task.identifier.name.endswith("test_c"))
Esempio n. 3
0
    def run_suite(self, job, test_suite):
        summary = set()

        if not test_suite.enabled:
            job.interrupted_reason = f"Suite {test_suite.name} is disabled."
            return summary

        test_suite.tests, missing_requirements = nrunner.check_runnables_runner_requirements(
            test_suite.tests)
        self._abort_if_missing_runners(missing_requirements)

        job.result.tests_total = test_suite.variants.get_number_of_tests(
            test_suite.tests)

        self._create_status_server(test_suite, job)

        graph = RuntimeTaskGraph(test_suite.get_test_variants(),
                                 test_suite.name, self.status_server.uri,
                                 job.unique_id)
        # pylint: disable=W0201
        self.runtime_tasks = graph.get_tasks_in_topological_order()

        # Start the status server
        asyncio.ensure_future(self.status_server.serve_forever())

        if test_suite.config.get('nrunner.shuffle'):
            random.shuffle(self.runtime_tasks)
        test_ids = [
            rt.task.identifier for rt in self.runtime_tasks
            if rt.task.category == 'test'
        ]
        tsm = TaskStateMachine(self.runtime_tasks, self.status_repo)
        spawner_name = test_suite.config.get('nrunner.spawner')
        spawner = SpawnerDispatcher(test_suite.config, job)[spawner_name].obj
        max_running = min(test_suite.config.get('nrunner.max_parallel_tasks'),
                          len(self.runtime_tasks))
        timeout = test_suite.config.get('task.timeout.running')
        failfast = test_suite.config.get('run.failfast')
        workers = [
            Worker(state_machine=tsm,
                   spawner=spawner,
                   max_running=max_running,
                   task_timeout=timeout,
                   failfast=failfast).run() for _ in range(max_running)
        ]
        asyncio.ensure_future(self._update_status(job))
        loop = asyncio.get_event_loop()
        try:
            loop.run_until_complete(
                asyncio.wait_for(asyncio.gather(*workers), job.timeout
                                 or None))
        except (KeyboardInterrupt, asyncio.TimeoutError, TestFailFast) as ex:
            LOG_JOB.info(str(ex))
            job.interrupted_reason = str(ex)
            summary.add("INTERRUPTED")

        # Wait until all messages may have been processed by the
        # status_updater. This should be replaced by a mechanism
        # that only waits if there are missing status messages to
        # be processed, and, only for a given amount of time.
        # Tests with non received status will always show as SKIP
        # because of result reconciliation.
        loop.run_until_complete(asyncio.sleep(0.05))

        job.result.end_tests()
        self.status_server.close()
        if self.status_server_dir is not None:
            self.status_server_dir.cleanup()

        # Update the overall summary with found test statuses, which will
        # determine the Avocado command line exit status
        summary.update([
            status.upper()
            for status in self.status_repo.get_result_set_for_tasks(test_ids)
        ])
        return summary