test_basic.py 29.5 KB
Newer Older
1
import json
2
import os
3
import shutil
4
import time
5
import sys
6
import tempfile
7
import xml.dom.minidom
8

9 10 11 12 13
if sys.version_info[:2] == (2, 6):
    import unittest2 as unittest
else:
    import unittest

14 15 16 17
from avocado.utils import process
from avocado.utils import script


18
basedir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..')
19 20 21
basedir = os.path.abspath(basedir)


22 23 24 25
PASS_SCRIPT_CONTENTS = """#!/bin/sh
true
"""

C
Cleber Rosa 已提交
26 27
PASS_SHELL_CONTENTS = "exit 0"

28 29 30 31
FAIL_SCRIPT_CONTENTS = """#!/bin/sh
false
"""

C
Cleber Rosa 已提交
32 33
FAIL_SHELL_CONTENTS = "exit 1"

34
VOID_PLUGIN_CONTENTS = """#!/usr/bin/env python
35
from avocado.core.plugins.plugin import Plugin
36 37 38 39 40
class VoidPlugin(Plugin):
    pass
"""

SYNTAX_ERROR_PLUGIN_CONTENTS = """#!/usr/bin/env python
41
from avocado.core.plugins.plugin import Plugin
42 43 44
class VoidPlugin(Plugin)
"""

45
HELLO_PLUGIN_CONTENTS = """#!/usr/bin/env python
46
from avocado.core.plugins.plugin import Plugin
47 48 49
class HelloWorld(Plugin):
    name = 'hello'
    enabled = True
50 51 52 53
    def configure(self, parser):
        self.parser = parser.subcommands.add_parser('hello')
        super(HelloWorld, self).configure(self.parser)
    def run(self, args):
54
        print('Hello World!')
55 56
"""

57 58 59

class RunnerOperationTest(unittest.TestCase):

60
    def setUp(self):
61
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
62

63 64
    def test_runner_all_ok(self):
        os.chdir(basedir)
65
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest passtest' % self.tmpdir
66 67
        process.run(cmd_line)

68 69
    def test_datadir_alias(self):
        os.chdir(basedir)
70
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s datadir' % self.tmpdir
71 72 73 74
        process.run(cmd_line)

    def test_datadir_noalias(self):
        os.chdir(basedir)
75 76
        cmd_line = ('./scripts/avocado run --sysinfo=off --job-results-dir %s examples/tests/datadir.py '
                    'examples/tests/datadir.py' % self.tmpdir)
77 78
        process.run(cmd_line)

79 80
    def test_runner_noalias(self):
        os.chdir(basedir)
81 82
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s examples/tests/passtest.py "
                    "examples/tests/passtest.py" % self.tmpdir)
83 84
        process.run(cmd_line)

85 86
    def test_runner_tests_fail(self):
        os.chdir(basedir)
87
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest failtest passtest' % self.tmpdir
88 89 90 91 92 93 94
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

    def test_runner_nonexistent_test(self):
        os.chdir(basedir)
95
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s bogustest' % self.tmpdir
96
        result = process.run(cmd_line, ignore_status=True)
97
        expected_rc = 2
98 99 100 101 102 103
        unexpected_rc = 3
        self.assertNotEqual(result.exit_status, unexpected_rc,
                            "Avocado crashed (rc %d):\n%s" % (unexpected_rc, result))
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

104 105
    def test_runner_doublefail(self):
        os.chdir(basedir)
106
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - doublefail' % self.tmpdir
107 108 109 110 111 112 113 114
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 1
        unexpected_rc = 3
        self.assertNotEqual(result.exit_status, unexpected_rc,
                            "Avocado crashed (rc %d):\n%s" % (unexpected_rc, result))
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))
115
        self.assertIn("TestError: Failing during tearDown. Yay!", output,
116
                      "Cleanup exception not printed to log output")
117
        self.assertIn("TestFail: This test is supposed to fail",
118
                      output,
119
                      "Test did not fail with action exception:\n%s" % output)
120

121 122 123 124 125 126 127 128 129 130 131
    def test_uncaught_exception(self):
        os.chdir(basedir)
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s "
                    "--json - uncaught_exception" % self.tmpdir)
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "ERROR"', result.stdout)

132
    def test_fail_on_exception(self):
133 134
        os.chdir(basedir)
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s "
135
                    "--json - fail_on_exception" % self.tmpdir)
136 137 138 139 140 141 142
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "FAIL"', result.stdout)

143 144
    def test_runner_timeout(self):
        os.chdir(basedir)
145
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - timeouttest' % self.tmpdir
146 147 148 149 150 151 152 153
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 1
        unexpected_rc = 3
        self.assertNotEqual(result.exit_status, unexpected_rc,
                            "Avocado crashed (rc %d):\n%s" % (unexpected_rc, result))
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))
154
        self.assertIn("TestTimeoutError: Timeout reached waiting for", output,
155
                      "Test did not fail with timeout exception:\n%s" % output)
156 157
        # Ensure no test aborted error messages show up
        self.assertNotIn("TestAbortedError: Test aborted unexpectedly", output)
158

159 160
    def test_runner_abort(self):
        os.chdir(basedir)
161
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - abort' % self.tmpdir
162
        result = process.run(cmd_line, ignore_status=True)
163 164
        output = result.stdout
        excerpt = 'Test process aborted'
165 166 167 168 169 170
        expected_rc = 1
        unexpected_rc = 3
        self.assertNotEqual(result.exit_status, unexpected_rc,
                            "Avocado crashed (rc %d):\n%s" % (unexpected_rc, result))
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))
171
        self.assertIn(excerpt, output)
172

173 174
    def test_silent_output(self):
        os.chdir(basedir)
175
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest --silent' % self.tmpdir
176 177 178 179 180 181
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        expected_output = ''
        self.assertEqual(result.exit_status, expected_rc)
        self.assertEqual(result.stderr, expected_output)

182 183 184 185 186 187 188 189 190
    def test_empty_args_list(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado'
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        unexpected_output = 'too few arguments'
        self.assertEqual(result.exit_status, expected_rc)
        self.assertNotIn(unexpected_output, result.stdout)

191 192
    def test_empty_test_list(self):
        os.chdir(basedir)
193
        cmd_line = './scripts/avocado run --sysinfo=off'
194 195
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 2
196
        expected_output = 'No tests found for given urls'
197
        self.assertEqual(result.exit_status, expected_rc)
198
        self.assertIn(expected_output, result.stderr)
199

200 201
    def test_not_found(self):
        os.chdir(basedir)
202
        cmd_line = './scripts/avocado run --sysinfo=off sbrubles'
203
        result = process.run(cmd_line, ignore_status=True)
204
        expected_rc = 2
205
        self.assertEqual(result.exit_status, expected_rc)
206 207
        self.assertIn('Unable to discover url', result.stderr)
        self.assertNotIn('Unable to discover url', result.stdout)
208

209
    def test_invalid_unique_id(self):
210
        cmd_line = './scripts/avocado run --sysinfo=off --force-job-id foobar passtest'
211 212
        result = process.run(cmd_line, ignore_status=True)
        self.assertNotEqual(0, result.exit_status)
213
        self.assertIn('needs to be a 40 digit hex', result.stderr)
214
        self.assertNotIn('needs to be a 40 digit hex', result.stdout)
215 216

    def test_valid_unique_id(self):
217
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off '
218
                    '--force-job-id 975de258ac05ce5e490648dec4753657b7ccc7d1 passtest' % self.tmpdir)
219 220
        result = process.run(cmd_line, ignore_status=True)
        self.assertEqual(0, result.exit_status)
221
        self.assertNotIn('needs to be a 40 digit hex', result.stderr)
222
        self.assertIn('PASS', result.stdout)
223

224
    def test_automatic_unique_id(self):
225
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off passtest --json -' % self.tmpdir
226 227 228 229 230 231
        result = process.run(cmd_line, ignore_status=True)
        self.assertEqual(0, result.exit_status)
        r = json.loads(result.stdout)
        int(r['job_id'], 16)  # it's an hex number
        self.assertEqual(len(r['job_id']), 40)

232 233 234 235 236 237 238 239 240 241 242
    def test_skip_outside_setup(self):
        os.chdir(basedir)
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s "
                    "--json - skip_outside_setup" % self.tmpdir)
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "ERROR"', result.stdout)

243 244 245 246 247
    def test_early_latest_result(self):
        """
        Tests that the `latest` link to the latest job results is created early
        """
        os.chdir(basedir)
L
Lukáš Doktor 已提交
248 249
        cmd_line = ('./scripts/avocado run --sysinfo=off --job-results-dir %s '
                    'examples/tests/passtest.py' % self.tmpdir)
250 251 252 253 254 255
        avocado_process = process.SubProcess(cmd_line)
        avocado_process.start()
        link = os.path.join(self.tmpdir, 'latest')
        for trial in xrange(0, 50):
            time.sleep(0.1)
            if os.path.exists(link) and os.path.islink(link):
256
                avocado_process.wait()
257 258 259 260
                break
        self.assertTrue(os.path.exists(link))
        self.assertTrue(os.path.islink(link))

261 262 263
    def tearDown(self):
        shutil.rmtree(self.tmpdir)

264

265 266 267
class RunnerHumanOutputTest(unittest.TestCase):

    def setUp(self):
268
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307

    def test_output_pass(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest' % self.tmpdir
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertIn('passtest.py:PassTest.test:  PASS', result.stdout)

    def test_output_fail(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s failtest' % self.tmpdir
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertIn('failtest.py:FailTest.test:  FAIL', result.stdout)

    def test_output_error(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s errortest' % self.tmpdir
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertIn('errortest.py:ErrorTest.test:  ERROR', result.stdout)

    def test_output_skip(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s skiponsetup' % self.tmpdir
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
L
Lukáš Doktor 已提交
308 309
        self.assertIn('skiponsetup.py:SkipOnSetupTest.test_wont_be_executed:'
                      '  SKIP', result.stdout)
310

311 312 313
    def tearDown(self):
        shutil.rmtree(self.tmpdir)

314

315
class RunnerSimpleTest(unittest.TestCase):
316 317

    def setUp(self):
318
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
319 320 321
        self.pass_script = script.TemporaryScript(
            'avocado_pass.sh',
            PASS_SCRIPT_CONTENTS,
322
            'avocado_simpletest_functional')
323
        self.pass_script.save()
L
Lukáš Doktor 已提交
324 325 326 327
        self.fail_script = script.TemporaryScript('avocado_fail.sh',
                                                  FAIL_SCRIPT_CONTENTS,
                                                  'avocado_simpletest_'
                                                  'functional')
328
        self.fail_script.save()
329

330
    def test_simpletest_pass(self):
331
        os.chdir(basedir)
L
Lukáš Doktor 已提交
332 333
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, self.pass_script.path))
334 335 336 337 338 339
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

340
    def test_simpletest_fail(self):
341
        os.chdir(basedir)
L
Lukáš Doktor 已提交
342 343
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, self.fail_script.path))
344 345 346 347 348 349
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

350 351 352
    def test_runner_onehundred_fail_timing(self):
        """
        We can be pretty sure that a failtest should return immediattely. Let's
353
        run 100 of them and assure they not take more than 30 seconds to run.
354

355 356
        Notice: on a current machine this takes about 0.12s, so 30 seconds is
        considered to be pretty safe here.
357 358 359
        """
        os.chdir(basedir)
        one_hundred = 'failtest ' * 100
L
Lukáš Doktor 已提交
360 361
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, one_hundred))
362 363 364
        initial_time = time.time()
        result = process.run(cmd_line, ignore_status=True)
        actual_time = time.time() - initial_time
365
        self.assertLess(actual_time, 30.0)
366 367 368 369 370 371 372 373 374 375 376
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

    def test_runner_sleep_fail_sleep_timing(self):
        """
        Sleeptest is supposed to take 1 second, let's make a sandwich of
        100 failtests and check the test runner timing.
        """
        os.chdir(basedir)
        sleep_fail_sleep = 'sleeptest ' + 'failtest ' * 100 + 'sleeptest'
L
Lukáš Doktor 已提交
377 378
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off %s' % (
            self.tmpdir, sleep_fail_sleep)
379 380 381
        initial_time = time.time()
        result = process.run(cmd_line, ignore_status=True)
        actual_time = time.time() - initial_time
382
        self.assertLess(actual_time, 33.0)
383 384 385 386
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

387 388 389 390 391
    def test_simplewarning(self):
        """
        simplewarning.sh uses the avocado-bash-utils
        """
        os.chdir(basedir)
392 393
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off '
                    'examples/tests/simplewarning.sh --show-job-log' % self.tmpdir)
394 395 396 397 398 399 400 401 402 403 404
        result = process.run(cmd_line, ignore_status=True)
        self.assertEqual(result.exit_status, 0,
                         "Avocado did not return rc 0:\n%s" %
                         (result))
        self.assertIn('DEBUG| Debug message', result.stdout, result)
        self.assertIn('INFO | Info message', result.stdout, result)
        self.assertIn('WARN | Warning message (should cause this test to '
                      'finish with warning)', result.stdout, result)
        self.assertIn('ERROR| Error message (ordinary message not changing '
                      'the results)', result.stdout, result)

405
    def tearDown(self):
406 407
        self.pass_script.remove()
        self.fail_script.remove()
408
        shutil.rmtree(self.tmpdir)
409 410


C
Cleber Rosa 已提交
411 412 413
class InnerRunnerTest(unittest.TestCase):

    def setUp(self):
414
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
C
Cleber Rosa 已提交
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
        self.pass_script = script.TemporaryScript(
            'pass',
            PASS_SHELL_CONTENTS,
            'avocado_innerrunner_functional')
        self.pass_script.save()
        self.fail_script = script.TemporaryScript(
            'fail',
            FAIL_SHELL_CONTENTS,
            'avocado_innerrunner_functional')
        self.fail_script.save()

    def test_innerrunner_pass(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off --inner-runner=/bin/sh %s'
        cmd_line %= (self.tmpdir, self.pass_script.path)
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

    def test_innerrunner_fail(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off --inner-runner=/bin/sh %s'
        cmd_line %= (self.tmpdir, self.fail_script.path)
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 1
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

    def test_innerrunner_chdir_no_testdir(self):
        os.chdir(basedir)
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off --inner-runner=/bin/sh '
                    '--inner-runner-chdir=test %s')
        cmd_line %= (self.tmpdir, self.pass_script.path)
        result = process.run(cmd_line, ignore_status=True)
452 453
        expected_output = ('Option "--inner-runner-chdir=test" requires '
                           '"--inner-runner-testdir" to be set')
C
Cleber Rosa 已提交
454
        self.assertIn(expected_output, result.stderr)
455
        expected_rc = 2
C
Cleber Rosa 已提交
456 457 458 459 460 461 462 463 464 465
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

    def tearDown(self):
        self.pass_script.remove()
        self.fail_script.remove()
        shutil.rmtree(self.tmpdir)


466
class ExternalPluginsTest(unittest.TestCase):
467 468

    def setUp(self):
469 470
        self.base_sourcedir = tempfile.mkdtemp(prefix='avocado_' + __name__)
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
471 472

    def test_void_plugin(self):
473 474 475
        self.void_plugin = script.make_script(
            os.path.join(self.base_sourcedir, 'avocado_void.py'),
            VOID_PLUGIN_CONTENTS)
476 477 478 479
        os.chdir(basedir)
        cmd_line = './scripts/avocado --plugins %s plugins' % self.base_sourcedir
        result = process.run(cmd_line, ignore_status=True)
        expected_output = 'noname'
480
        self.assertIn(expected_output, result.stdout)
481 482

    def test_syntax_error_plugin(self):
483 484 485
        self.syntax_err_plugin = script.make_script(
            os.path.join(self.base_sourcedir, 'avocado_syntax_err.py'),
            SYNTAX_ERROR_PLUGIN_CONTENTS)
486 487 488
        os.chdir(basedir)
        cmd_line = './scripts/avocado --plugins %s' % self.base_sourcedir
        result = process.run(cmd_line, ignore_status=True)
489
        expected_output = 'invalid syntax'
490 491
        self.assertIn(expected_output, result.stderr)

492
    def test_hello_plugin(self):
493 494 495
        self.hello_plugin = script.make_script(
            os.path.join(self.base_sourcedir, 'avocado_hello.py'),
            HELLO_PLUGIN_CONTENTS)
496
        os.chdir(basedir)
497
        cmd_line = './scripts/avocado --plugins %s hello' % self.base_sourcedir
498
        result = process.run(cmd_line, ignore_status=True)
499 500 501 502
        expected_output = 'Hello World!'
        self.assertIn(expected_output, result.stdout)

    def tearDown(self):
503
        shutil.rmtree(self.tmpdir)
504 505 506 507
        if os.path.isdir(self.base_sourcedir):
            shutil.rmtree(self.base_sourcedir, ignore_errors=True)


508
class AbsPluginsTest(object):
509

510
    def setUp(self):
511
        self.base_outputdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
512

513 514 515 516 517 518
    def tearDown(self):
        shutil.rmtree(self.base_outputdir)


class PluginsTest(AbsPluginsTest, unittest.TestCase):

519 520 521 522 523 524 525 526 527 528 529
    def test_sysinfo_plugin(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado sysinfo %s' % self.base_outputdir
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        sysinfo_files = os.listdir(self.base_outputdir)
        self.assertGreater(len(sysinfo_files), 0, "Empty sysinfo files dir")

530 531 532 533 534 535 536 537 538 539 540
    def test_list_plugin(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado list'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn('No tests were found on current tests dir', output)

541 542 543 544 545 546 547 548 549
    def test_list_error_output(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado list sbrubles'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stderr
        expected_rc = 3
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
550
        self.assertIn("Unable to discover url", output)
551

552 553 554 555 556 557 558 559 560
    def test_plugin_list(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado plugins'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
561 562
        if sys.version_info[:2] >= (2, 7, 0):
            self.assertNotIn('Disabled', output)
563

564
    def test_config_plugin(self):
565
        os.chdir(basedir)
566
        cmd_line = './scripts/avocado config --paginator off'
567 568 569 570 571 572 573 574 575 576
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn('Disabled', output)

    def test_config_plugin_datadir(self):
        os.chdir(basedir)
577
        cmd_line = './scripts/avocado config --datadir --paginator off'
578 579 580 581 582 583 584 585
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn('Disabled', output)

586 587 588 589 590 591 592 593 594 595 596
    def test_Namespace_object_has_no_attribute(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado plugins'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stderr
        expected_rc = 0
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn("'Namespace' object has no attribute", output)

597

598 599 600 601
class ParseXMLError(Exception):
    pass


602
class PluginsXunitTest(AbsPluginsTest, unittest.TestCase):
603

604
    def setUp(self):
605
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
606 607
        super(PluginsXunitTest, self).setUp()

608
    def run_and_check(self, testname, e_rc, e_ntests, e_nerrors,
609
                      e_nnotfound, e_nfailures, e_nskip):
610
        os.chdir(basedir)
L
Lukáš Doktor 已提交
611 612
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' --xunit - %s' % (self.tmpdir, testname))
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627
        result = process.run(cmd_line, ignore_status=True)
        xml_output = result.stdout
        self.assertEqual(result.exit_status, e_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (e_rc, result))
        try:
            xunit_doc = xml.dom.minidom.parseString(xml_output)
        except Exception, detail:
            raise ParseXMLError("Failed to parse content: %s\n%s" %
                                (detail, xml_output))

        testsuite_list = xunit_doc.getElementsByTagName('testsuite')
        self.assertEqual(len(testsuite_list), 1, 'More than one testsuite tag')

        testsuite_tag = testsuite_list[0]
628 629
        self.assertEqual(len(testsuite_tag.attributes), 7,
                         'The testsuite tag does not have 7 attributes. '
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
                         'XML:\n%s' % xml_output)

        n_tests = int(testsuite_tag.attributes['tests'].value)
        self.assertEqual(n_tests, e_ntests,
                         "Unexpected number of executed tests, "
                         "XML:\n%s" % xml_output)

        n_errors = int(testsuite_tag.attributes['errors'].value)
        self.assertEqual(n_errors, e_nerrors,
                         "Unexpected number of test errors, "
                         "XML:\n%s" % xml_output)

        n_failures = int(testsuite_tag.attributes['failures'].value)
        self.assertEqual(n_failures, e_nfailures,
                         "Unexpected number of test failures, "
                         "XML:\n%s" % xml_output)

        n_skip = int(testsuite_tag.attributes['skip'].value)
        self.assertEqual(n_skip, e_nskip,
                         "Unexpected number of test skips, "
                         "XML:\n%s" % xml_output)

652 653
    def test_xunit_plugin_passtest(self):
        self.run_and_check('passtest', 0, 1, 0, 0, 0, 0)
654 655

    def test_xunit_plugin_failtest(self):
656
        self.run_and_check('failtest', 1, 1, 0, 0, 1, 0)
657

658 659 660
    def test_xunit_plugin_skiponsetuptest(self):
        self.run_and_check('skiponsetup', 0, 1, 0, 0, 0, 1)

661
    def test_xunit_plugin_errortest(self):
662 663
        self.run_and_check('errortest', 1, 1, 1, 0, 0, 0)

664 665 666 667
    def tearDown(self):
        shutil.rmtree(self.tmpdir)
        super(PluginsXunitTest, self).tearDown()

668 669 670 671 672

class ParseJSONError(Exception):
    pass


673
class PluginsJSONTest(AbsPluginsTest, unittest.TestCase):
674

675
    def setUp(self):
676
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
677 678
        super(PluginsJSONTest, self).setUp()

679
    def run_and_check(self, testname, e_rc, e_ntests, e_nerrors,
680 681
                      e_nfailures, e_nskip):
        os.chdir(basedir)
682 683
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off --json - --archive %s' %
                    (self.tmpdir, testname))
684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
        result = process.run(cmd_line, ignore_status=True)
        json_output = result.stdout
        self.assertEqual(result.exit_status, e_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (e_rc, result))
        try:
            json_data = json.loads(json_output)
        except Exception, detail:
            raise ParseJSONError("Failed to parse content: %s\n%s" %
                                 (detail, json_output))
        self.assertTrue(json_data, "Empty JSON result:\n%s" % json_output)
        self.assertIsInstance(json_data['tests'], list,
                              "JSON result lacks 'tests' list")
        n_tests = len(json_data['tests'])
        self.assertEqual(n_tests, e_ntests,
                         "Different number of expected tests")
        n_errors = json_data['errors']
        self.assertEqual(n_errors, e_nerrors,
                         "Different number of expected tests")
        n_failures = json_data['failures']
        self.assertEqual(n_failures, e_nfailures,
                         "Different number of expected tests")
        n_skip = json_data['skip']
        self.assertEqual(n_skip, e_nskip,
                         "Different number of skipped tests")

710
    def test_json_plugin_passtest(self):
711
        self.run_and_check('passtest', 0, 1, 0, 0, 0)
712 713

    def test_json_plugin_failtest(self):
714
        self.run_and_check('failtest', 1, 1, 0, 1, 0)
715

716 717 718
    def test_json_plugin_skiponsetuptest(self):
        self.run_and_check('skiponsetup', 0, 1, 0, 0, 1)

719
    def test_json_plugin_errortest(self):
720
        self.run_and_check('errortest', 1, 1, 1, 0, 0)
721

722 723 724 725
    def tearDown(self):
        shutil.rmtree(self.tmpdir)
        super(PluginsJSONTest, self).tearDown()

726 727
if __name__ == '__main__':
    unittest.main()