def test_logger_job_hooks(self): jobdir = os.path.join(self.tmpdir, 'job') sysinfo_logger = sysinfo.SysInfo(basedir=jobdir) sysinfo_logger.start_job_hook() self.assertTrue(os.path.isdir(jobdir)) self.assertGreaterEqual(len(os.listdir(jobdir)), 1, "Job does not have 'pre' dir") job_predir = os.path.join(jobdir, 'pre') self.assertTrue(os.path.isdir(job_predir)) sysinfo_logger.end_job_hook() job_postdir = os.path.join(jobdir, 'post') self.assertTrue(os.path.isdir(job_postdir))
def runTest(self, result=None): """ Run test method, for compatibility with unittest.TestCase. :result: Unused param, compatibiltiy with :class:`unittest.TestCase`. """ sysinfo_logger = sysinfo.SysInfo(basedir=self.sysinfodir) self.start_logging() sysinfo_logger.start_job_hook() action_exception = None cleanup_exception = None try: self.setup() except Exception, details: log_exc_info(sys.exc_info()) raise exceptions.TestSetupFail(details)
def test_logger_test_hooks(self): testdir = os.path.join(self.tmpdir, 'job', 'test1') sysinfo_logger = sysinfo.SysInfo(basedir=testdir) sysinfo_logger.start_test_hook() self.assertTrue(os.path.isdir(testdir)) self.assertGreaterEqual(len(os.listdir(testdir)), 1, "Test does not have 'pre' dir") test_predir = os.path.join(testdir, 'pre') self.assertTrue(os.path.isdir(test_predir)) # By default, there are no pre test files self.assertEqual(len(os.listdir(test_predir)), 0, "Test pre dir is not empty") sysinfo_logger.end_test_hook() self.assertGreaterEqual(len(os.listdir(testdir)), 2, "Test does not have 'pre' dir") job_postdir = os.path.join(testdir, 'post') self.assertTrue(os.path.isdir(job_postdir)) # By default, there are no post test files self.assertEqual(len(os.listdir(job_postdir)), 0, "Test post dir is not empty")
def __init__(self, methodName='runTest', name=None, params=None, base_logdir=None, tag=None, job=None, runner_queue=None): """ Initializes the test. :param methodName: Name of the main method to run. For the sake of compatibility with the original unittest class, you should not set this. :param name: Pretty name of the test name. For normal tests, written with the avocado API, this should not be set, this is reserved for running random executables as tests. :param base_logdir: Directory where test logs should go. If None provided, it'll use :func:`avocado.core.data_dir.create_job_logs_dir`. :param tag: Tag that differentiates 2 executions of the same test name. Example: 'long', 'short', so we can differentiate 'sleeptest.long' and 'sleeptest.short'. :param job: The job that this test is part of. """ def record_and_warn(*args, **kwargs): """ Record call to this function and log warning """ if not self.__log_warn_used: self.__log_warn_used = True return original_log_warn(*args, **kwargs) if name is not None: self.name = name else: self.name = self.__class__.__name__ self.tag = tag or None self.job = job basename = os.path.basename(self.name) tmpdir = data_dir.get_tmp_dir() self.filename = inspect.getfile(self.__class__).rstrip('co') self.basedir = os.path.dirname(self.filename) self.datadir = self.filename + '.data' self.expected_stdout_file = os.path.join(self.datadir, 'stdout.expected') self.expected_stderr_file = os.path.join(self.datadir, 'stderr.expected') self.workdir = utils_path.init_dir(tmpdir, basename) self.srcdir = utils_path.init_dir(self.workdir, 'src') if base_logdir is None: base_logdir = data_dir.create_job_logs_dir() base_logdir = os.path.join(base_logdir, 'test-results') self.tagged_name = self.get_tagged_name(base_logdir) # Let's avoid trouble at logdir init time, since we're interested # in a relative directory here tagged_name = self.tagged_name if tagged_name.startswith('/'): tagged_name = tagged_name[1:] self.logdir = utils_path.init_dir(base_logdir, tagged_name) genio.set_log_file_dir(self.logdir) self.logfile = os.path.join(self.logdir, 'debug.log') self.stdout_file = os.path.join(self.logdir, 'stdout') self.stderr_file = os.path.join(self.logdir, 'stderr') self.outputdir = utils_path.init_dir(self.logdir, 'data') self.sysinfodir = utils_path.init_dir(self.logdir, 'sysinfo') self.sysinfo_logger = sysinfo.SysInfo(basedir=self.sysinfodir) self.log = logging.getLogger("avocado.test") original_log_warn = self.log.warning self.__log_warn_used = False self.log.warn = self.log.warning = record_and_warn self.stdout_log = logging.getLogger("avocado.test.stdout") self.stderr_log = logging.getLogger("avocado.test.stderr") mux_entry = ['/test/*'] if isinstance(params, dict): self.default_params = self.default_params.copy() self.default_params.update(params) params = [] elif params is None: params = [] elif isinstance(params, tuple): params, mux_entry = params[0], params[1] self.params = multiplexer.AvocadoParams(params, self.name, self.tag, mux_entry, self.default_params) self.log.info('START %s', self.tagged_name) self.log.debug('') self.debugdir = None self.resultsdir = None self.status = None self.fail_reason = None self.fail_class = None self.traceback = None self.text_output = None self.whiteboard = '' self.running = False self.time_start = None self.time_end = None self.paused = False self.paused_msg = '' self.runner_queue = runner_queue self.time_elapsed = None unittest.TestCase.__init__(self, methodName=methodName)
def _start_sysinfo(self): if hasattr(self.args, 'sysinfo'): if self.args.sysinfo == 'on': sysinfo_dir = path.init_dir(self.logdir, 'sysinfo') self.sysinfo = sysinfo.SysInfo(basedir=sysinfo_dir)
def __init__(self, methodName='runTest', name=None, params=None, base_logdir=None, tag=None, job=None, runner_queue=None): """ Initializes the test. :param methodName: Name of the main method to run. For the sake of compatibility with the original unittest class, you should not set this. :param name: Pretty name of the test name. For normal tests, written with the avocado API, this should not be set, this is reserved for running random executables as tests. :param base_logdir: Directory where test logs should go. If None provided, it'll use :func:`avocado.core.data_dir.get_job_logs_dir`. :param tag: Tag that differentiates 2 executions of the same test name. Example: 'long', 'short', so we can differentiate 'sleeptest.long' and 'sleeptest.short'. :param job: The job that this test is part of. """ def record_and_warn(*args, **kwargs): """ Record call to this function and log warning """ self.__log_warn_used = True return original_log_warn(*args, **kwargs) if name is not None: self.name = name else: self.name = self.__class__.__name__ if params is None: params = {} self.params = Params(params) self._raw_params = params self.tag = tag or self.params.get('tag') self.job = job basename = os.path.basename(self.name) tmpdir = data_dir.get_tmp_dir() self.basedir = os.path.dirname(inspect.getfile(self.__class__)) self.datadir = os.path.join(self.basedir, '%s.data' % basename) self.expected_stdout_file = os.path.join(self.datadir, 'stdout.expected') self.expected_stderr_file = os.path.join(self.datadir, 'stderr.expected') self.workdir = utils_path.init_dir(tmpdir, basename) self.srcdir = utils_path.init_dir(self.workdir, 'src') if base_logdir is None: base_logdir = data_dir.get_job_logs_dir() base_logdir = os.path.join(base_logdir, 'test-results') self.tagged_name = self.get_tagged_name(base_logdir) # Let's avoid trouble at logdir init time, since we're interested # in a relative directory here tagged_name = self.tagged_name if tagged_name.startswith('/'): tagged_name = tagged_name[1:] self.logdir = utils_path.init_dir(base_logdir, tagged_name) io.set_log_file_dir(self.logdir) self.logfile = os.path.join(self.logdir, 'debug.log') self.stdout_file = os.path.join(self.logdir, 'stdout') self.stderr_file = os.path.join(self.logdir, 'stderr') self.outputdir = utils_path.init_dir(self.logdir, 'data') self.sysinfodir = utils_path.init_dir(self.logdir, 'sysinfo') self.sysinfo_logger = sysinfo.SysInfo(basedir=self.sysinfodir) self.log = logging.getLogger("avocado.test") original_log_warn = self.log.warning self.__log_warn_used = False self.log.warn = self.log.warning = record_and_warn self.stdout_log = logging.getLogger("avocado.test.stdout") self.stderr_log = logging.getLogger("avocado.test.stderr") self.log.info('START %s', self.tagged_name) self.log.debug('') self.log.debug('Test instance parameters:') # Set the helper set_default to the params object setattr(self.params, 'set_default', self._set_default) # Apply what comes from the params dict for key in sorted(self.params.keys()): self.log.debug(' %s = %s', key, self.params.get(key)) self.log.debug('') # Apply what comes from the default_params dict self.log.debug('Default parameters:') for key in sorted(self.default_params.keys()): self.log.debug(' %s = %s', key, self.default_params.get(key)) self.params.set_default(key, self.default_params[key]) self.log.debug('') self.log.debug( 'Test instance params override defaults whenever available') self.log.debug('') # If there's a timeout set, log a timeout reminder if self.params.timeout: self.log.info( 'Test timeout set. Will wait %.2f s for ' 'PID %s to end', float(self.params.timeout), os.getpid()) self.log.info('') self.debugdir = None self.resultsdir = None self.status = None self.fail_reason = None self.fail_class = None self.traceback = None self.text_output = None self.whiteboard = '' self.running = False self.time_start = None self.time_end = None self.paused = False self.paused_msg = '' self.runner_queue = runner_queue self.time_elapsed = None unittest.TestCase.__init__(self)