test_basic.py 35.7 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
import glob
9

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

15
from avocado.core import exit_codes
16 17 18 19
from avocado.utils import process
from avocado.utils import script


20
basedir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..')
21 22 23
basedir = os.path.abspath(basedir)


24 25 26 27
PASS_SCRIPT_CONTENTS = """#!/bin/sh
true
"""

C
Cleber Rosa 已提交
28 29
PASS_SHELL_CONTENTS = "exit 0"

30 31 32 33
FAIL_SCRIPT_CONTENTS = """#!/bin/sh
false
"""

C
Cleber Rosa 已提交
34 35
FAIL_SHELL_CONTENTS = "exit 1"

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

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

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

59 60 61

class RunnerOperationTest(unittest.TestCase):

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

65
    @unittest.skip("Temporary plugin infrastructure removal")
66 67
    def test_runner_all_ok(self):
        os.chdir(basedir)
68
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest passtest' % self.tmpdir
69 70
        process.run(cmd_line)

71
    @unittest.skip("Temporary plugin infrastructure removal")
72 73
    def test_datadir_alias(self):
        os.chdir(basedir)
74
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s datadir' % self.tmpdir
75 76
        process.run(cmd_line)

77
    @unittest.skip("Temporary plugin infrastructure removal")
78 79
    def test_datadir_noalias(self):
        os.chdir(basedir)
80 81
        cmd_line = ('./scripts/avocado run --sysinfo=off --job-results-dir %s examples/tests/datadir.py '
                    'examples/tests/datadir.py' % self.tmpdir)
82 83
        process.run(cmd_line)

84
    @unittest.skip("Temporary plugin infrastructure removal")
85 86
    def test_runner_noalias(self):
        os.chdir(basedir)
87 88
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s examples/tests/passtest.py "
                    "examples/tests/passtest.py" % self.tmpdir)
89 90
        process.run(cmd_line)

91
    @unittest.skip("Temporary plugin infrastructure removal")
92 93
    def test_runner_tests_fail(self):
        os.chdir(basedir)
94
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest failtest passtest' % self.tmpdir
95
        result = process.run(cmd_line, ignore_status=True)
96
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
97 98 99
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

100
    @unittest.skip("Temporary plugin infrastructure removal")
101 102
    def test_runner_nonexistent_test(self):
        os.chdir(basedir)
103
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s bogustest' % self.tmpdir
104
        result = process.run(cmd_line, ignore_status=True)
105 106
        expected_rc = exit_codes.AVOCADO_JOB_FAIL
        unexpected_rc = exit_codes.AVOCADO_FAIL
107 108 109 110 111
        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))

112
    @unittest.skip("Temporary plugin infrastructure removal")
113 114
    def test_runner_doublefail(self):
        os.chdir(basedir)
115
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - doublefail' % self.tmpdir
116 117
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
118 119
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
        unexpected_rc = exit_codes.AVOCADO_FAIL
120 121 122 123
        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))
124
        self.assertIn("TestError: Failing during tearDown. Yay!", output,
125
                      "Cleanup exception not printed to log output")
126
        self.assertIn("TestFail: This test is supposed to fail",
127
                      output,
128
                      "Test did not fail with action exception:\n%s" % output)
129

130
    @unittest.skip("Temporary plugin infrastructure removal")
131 132 133 134 135
    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)
136
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
137 138 139 140 141
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "ERROR"', result.stdout)

142
    @unittest.skip("Temporary plugin infrastructure removal")
143
    def test_fail_on_exception(self):
144 145
        os.chdir(basedir)
        cmd_line = ("./scripts/avocado run --sysinfo=off --job-results-dir %s "
146
                    "--json - fail_on_exception" % self.tmpdir)
147
        result = process.run(cmd_line, ignore_status=True)
148
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
149 150 151 152 153
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "FAIL"', result.stdout)

154
    @unittest.skip("Temporary plugin infrastructure removal")
155 156
    def test_runner_timeout(self):
        os.chdir(basedir)
157
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - timeouttest' % self.tmpdir
158 159
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
160 161
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
        unexpected_rc = exit_codes.AVOCADO_FAIL
162 163 164 165
        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))
166
        self.assertIn("TestTimeoutError: Timeout reached waiting for", output,
167
                      "Test did not fail with timeout exception:\n%s" % output)
168 169
        # Ensure no test aborted error messages show up
        self.assertNotIn("TestAbortedError: Test aborted unexpectedly", output)
170

171
    @unittest.skip("Temporary plugin infrastructure removal")
172 173
    def test_runner_abort(self):
        os.chdir(basedir)
174
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s --xunit - abort' % self.tmpdir
175
        result = process.run(cmd_line, ignore_status=True)
176 177
        output = result.stdout
        excerpt = 'Test process aborted'
178 179
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
        unexpected_rc = exit_codes.AVOCADO_FAIL
180 181 182 183
        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))
184
        self.assertIn(excerpt, output)
185

186
    @unittest.skip("Temporary plugin infrastructure removal")
187 188
    def test_silent_output(self):
        os.chdir(basedir)
189
        cmd_line = './scripts/avocado run --sysinfo=off --job-results-dir %s passtest --silent' % self.tmpdir
190
        result = process.run(cmd_line, ignore_status=True)
191
        expected_rc = exit_codes.AVOCADO_ALL_OK
192 193 194 195
        expected_output = ''
        self.assertEqual(result.exit_status, expected_rc)
        self.assertEqual(result.stderr, expected_output)

196
    @unittest.skip("Temporary plugin infrastructure removal")
197 198 199 200
    def test_empty_args_list(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado'
        result = process.run(cmd_line, ignore_status=True)
201 202
        expected_rc = exit_codes.AVOCADO_JOB_FAIL
        expected_output = 'error: too few arguments'
203
        self.assertEqual(result.exit_status, expected_rc)
204
        self.assertIn(expected_output, result.stderr)
205

206
    @unittest.skip("Temporary plugin infrastructure removal")
207 208
    def test_empty_test_list(self):
        os.chdir(basedir)
209
        cmd_line = './scripts/avocado run --sysinfo=off'
210
        result = process.run(cmd_line, ignore_status=True)
211
        expected_rc = exit_codes.AVOCADO_JOB_FAIL
212
        expected_output = 'No tests found for given urls'
213
        self.assertEqual(result.exit_status, expected_rc)
214
        self.assertIn(expected_output, result.stderr)
215

216
    @unittest.skip("Temporary plugin infrastructure removal")
217 218
    def test_not_found(self):
        os.chdir(basedir)
219
        cmd_line = './scripts/avocado run --sysinfo=off sbrubles'
220
        result = process.run(cmd_line, ignore_status=True)
221
        expected_rc = exit_codes.AVOCADO_JOB_FAIL
222
        self.assertEqual(result.exit_status, expected_rc)
223 224
        self.assertIn('Unable to discover url', result.stderr)
        self.assertNotIn('Unable to discover url', result.stdout)
225

226
    @unittest.skip("Temporary plugin infrastructure removal")
227
    def test_invalid_unique_id(self):
228
        cmd_line = './scripts/avocado run --sysinfo=off --force-job-id foobar passtest'
229
        result = process.run(cmd_line, ignore_status=True)
230
        self.assertNotEqual(result.exit_status, exit_codes.AVOCADO_ALL_OK)
231
        self.assertIn('needs to be a 40 digit hex', result.stderr)
232
        self.assertNotIn('needs to be a 40 digit hex', result.stdout)
233

234
    @unittest.skip("Temporary plugin infrastructure removal")
235
    def test_valid_unique_id(self):
236
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off '
237
                    '--force-job-id 975de258ac05ce5e490648dec4753657b7ccc7d1 passtest' % self.tmpdir)
238
        result = process.run(cmd_line, ignore_status=True)
239
        self.assertEqual(result.exit_status, exit_codes.AVOCADO_ALL_OK)
240
        self.assertNotIn('needs to be a 40 digit hex', result.stderr)
241
        self.assertIn('PASS', result.stdout)
242

243
    @unittest.skip("Temporary plugin infrastructure removal")
244
    def test_automatic_unique_id(self):
245
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off passtest --json -' % self.tmpdir
246
        result = process.run(cmd_line, ignore_status=True)
247
        self.assertEqual(result.exit_status, exit_codes.AVOCADO_ALL_OK)
248 249 250 251
        r = json.loads(result.stdout)
        int(r['job_id'], 16)  # it's an hex number
        self.assertEqual(len(r['job_id']), 40)

252
    @unittest.skip("Temporary plugin infrastructure removal")
253 254 255 256 257
    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)
258
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
259 260 261 262 263
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc,
                                                                result))
        self.assertIn('"status": "ERROR"', result.stdout)

264
    @unittest.skip("Temporary plugin infrastructure removal")
265 266 267 268 269
    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 已提交
270 271
        cmd_line = ('./scripts/avocado run --sysinfo=off --job-results-dir %s '
                    'examples/tests/passtest.py' % self.tmpdir)
272 273 274 275 276 277
        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):
278
                avocado_process.wait()
279 280 281 282
                break
        self.assertTrue(os.path.exists(link))
        self.assertTrue(os.path.islink(link))

283
    @unittest.skip("Temporary plugin infrastructure removal")
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
    def test_dry_run(self):
        os.chdir(basedir)
        cmd = ("./scripts/avocado run --sysinfo=off passtest failtest "
               "errortest --json - --mux-inject foo:1 bar:2 baz:3 foo:foo:a "
               "foo:bar:b foo:baz:c bar:bar:bar --dry-run")
        result = json.loads(process.run(cmd).stdout)
        debuglog = result['debuglog']
        log = open(debuglog, 'r').read()
        # Remove the result dir
        shutil.rmtree(os.path.dirname(os.path.dirname(debuglog)))
        self.assertIn('/tmp', debuglog)   # Use tmp dir, not default location
        self.assertEqual(result['job_id'], u'0' * 40)
        # Check if all tests were skipped
        self.assertEqual(result['skip'], 3)
        for i in xrange(3):
            test = result['tests'][i]
            self.assertEqual(test['fail_reason'],
                             u'Test skipped due to --dry-run')
        # Check if all params are listed
        # The "/:bar ==> 2 is in the tree, but not in any leave so inaccessible
        # from test.
        for line in ("/:foo ==> 1", "/:baz ==> 3", "/foo:foo ==> a",
                     "/foo:bar ==> b", "/foo:baz ==> c", "/bar:bar ==> bar"):
            self.assertEqual(log.count(line), 3)

309 310 311
    def tearDown(self):
        shutil.rmtree(self.tmpdir)

312

313 314 315
class RunnerHumanOutputTest(unittest.TestCase):

    def setUp(self):
316
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
317

318
    @unittest.skip("Temporary plugin infrastructure removal")
319 320 321 322
    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)
323
        expected_rc = exit_codes.AVOCADO_ALL_OK
324 325 326 327 328
        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)

329
    @unittest.skip("Temporary plugin infrastructure removal")
330 331 332 333
    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)
334
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
335 336 337 338 339
        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)

340
    @unittest.skip("Temporary plugin infrastructure removal")
341 342 343 344
    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)
345
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
346 347 348 349 350
        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)

351
    @unittest.skip("Temporary plugin infrastructure removal")
352 353 354 355
    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)
356
        expected_rc = exit_codes.AVOCADO_ALL_OK
357 358 359
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
L
Lukáš Doktor 已提交
360 361
        self.assertIn('skiponsetup.py:SkipOnSetupTest.test_wont_be_executed:'
                      '  SKIP', result.stdout)
362

363
    @unittest.skip("Temporary plugin infrastructure removal")
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
    def test_ugly_echo_cmd(self):
        if not os.path.exists("/bin/echo"):
            self.skipTest("Program /bin/echo does not exist")
        os.chdir(basedir)
        cmd_line = ('./scripts/avocado run "/bin/echo -ne '
                    'foo\\\\\\n\\\'\\\\\\"\\\\\\nbar/baz" --job-results-dir %s'
                    ' --sysinfo=off  --show-job-log' % self.tmpdir)
        result = process.run(cmd_line, ignore_status=True)
        expected_rc = exit_codes.AVOCADO_ALL_OK
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %s:\n%s" %
                         (expected_rc, result))
        self.assertIn('[stdout] foo', result.stdout, result)
        self.assertIn('[stdout] \'"', result.stdout, result)
        self.assertIn('[stdout] bar/baz', result.stdout, result)
        self.assertIn('PASS /bin/echo -ne foo\\\\n\\\'\\"\\\\nbar/baz',
                      result.stdout, result)
        # logdir name should escape special chars (/)
        test_dirs = glob.glob(os.path.join(self.tmpdir, 'latest',
                                           'test-results', '*'))
        self.assertEqual(len(test_dirs), 1, "There are multiple directories in"
                         " test-results dir, but only one test was executed: "
                         "%s" % (test_dirs))
        self.assertEqual(os.path.basename(test_dirs[0]),
                         '_bin_echo -ne foo\\\\n\\\'\\"\\\\nbar_baz')

390 391 392
    def tearDown(self):
        shutil.rmtree(self.tmpdir)

393

394
class RunnerSimpleTest(unittest.TestCase):
395 396

    def setUp(self):
397
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
398 399 400
        self.pass_script = script.TemporaryScript(
            'avocado_pass.sh',
            PASS_SCRIPT_CONTENTS,
401
            'avocado_simpletest_functional')
402
        self.pass_script.save()
L
Lukáš Doktor 已提交
403 404 405 406
        self.fail_script = script.TemporaryScript('avocado_fail.sh',
                                                  FAIL_SCRIPT_CONTENTS,
                                                  'avocado_simpletest_'
                                                  'functional')
407
        self.fail_script.save()
408

409
    @unittest.skip("Temporary plugin infrastructure removal")
410
    def test_simpletest_pass(self):
411
        os.chdir(basedir)
L
Lukáš Doktor 已提交
412 413
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, self.pass_script.path))
414
        result = process.run(cmd_line, ignore_status=True)
415
        expected_rc = exit_codes.AVOCADO_ALL_OK
416 417 418 419
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

420
    @unittest.skip("Temporary plugin infrastructure removal")
421
    def test_simpletest_fail(self):
422
        os.chdir(basedir)
L
Lukáš Doktor 已提交
423 424
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, self.fail_script.path))
425
        result = process.run(cmd_line, ignore_status=True)
426
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
427 428 429 430
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

431
    @unittest.skip("Temporary plugin infrastructure removal")
432 433 434
    def test_runner_onehundred_fail_timing(self):
        """
        We can be pretty sure that a failtest should return immediattely. Let's
435
        run 100 of them and assure they not take more than 30 seconds to run.
436

437 438
        Notice: on a current machine this takes about 0.12s, so 30 seconds is
        considered to be pretty safe here.
439 440 441
        """
        os.chdir(basedir)
        one_hundred = 'failtest ' * 100
L
Lukáš Doktor 已提交
442 443
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' %s' % (self.tmpdir, one_hundred))
444 445 446
        initial_time = time.time()
        result = process.run(cmd_line, ignore_status=True)
        actual_time = time.time() - initial_time
447
        self.assertLess(actual_time, 30.0)
448
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
449 450 451
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

452
    @unittest.skip("Temporary plugin infrastructure removal")
453 454 455 456 457 458 459
    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 已提交
460 461
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off %s' % (
            self.tmpdir, sleep_fail_sleep)
462 463 464
        initial_time = time.time()
        result = process.run(cmd_line, ignore_status=True)
        actual_time = time.time() - initial_time
465
        self.assertLess(actual_time, 33.0)
466
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
467 468 469
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" % (expected_rc, result))

470
    @unittest.skip("Temporary plugin infrastructure removal")
471 472 473 474 475
    def test_simplewarning(self):
        """
        simplewarning.sh uses the avocado-bash-utils
        """
        os.chdir(basedir)
476 477
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off '
                    'examples/tests/simplewarning.sh --show-job-log' % self.tmpdir)
478
        result = process.run(cmd_line, ignore_status=True)
479 480 481 482
        expected_rc = exit_codes.AVOCADO_ALL_OK
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %s:\n%s" %
                         (expected_rc, result))
483 484 485 486 487 488 489
        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)

490
    def tearDown(self):
491 492
        self.pass_script.remove()
        self.fail_script.remove()
493
        shutil.rmtree(self.tmpdir)
494 495


496
class ExternalRunnerTest(unittest.TestCase):
C
Cleber Rosa 已提交
497 498

    def setUp(self):
499
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
C
Cleber Rosa 已提交
500 501 502
        self.pass_script = script.TemporaryScript(
            'pass',
            PASS_SHELL_CONTENTS,
503
            'avocado_externalrunner_functional')
C
Cleber Rosa 已提交
504 505 506 507
        self.pass_script.save()
        self.fail_script = script.TemporaryScript(
            'fail',
            FAIL_SHELL_CONTENTS,
508
            'avocado_externalrunner_functional')
C
Cleber Rosa 已提交
509 510
        self.fail_script.save()

511
    @unittest.skip("Temporary plugin infrastructure removal")
512
    def test_externalrunner_pass(self):
C
Cleber Rosa 已提交
513
        os.chdir(basedir)
514
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off --external-runner=/bin/sh %s'
C
Cleber Rosa 已提交
515 516
        cmd_line %= (self.tmpdir, self.pass_script.path)
        result = process.run(cmd_line, ignore_status=True)
517
        expected_rc = exit_codes.AVOCADO_ALL_OK
C
Cleber Rosa 已提交
518 519 520 521
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

522
    @unittest.skip("Temporary plugin infrastructure removal")
523
    def test_externalrunner_fail(self):
C
Cleber Rosa 已提交
524
        os.chdir(basedir)
525
        cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off --external-runner=/bin/sh %s'
C
Cleber Rosa 已提交
526 527
        cmd_line %= (self.tmpdir, self.fail_script.path)
        result = process.run(cmd_line, ignore_status=True)
528
        expected_rc = exit_codes.AVOCADO_TESTS_FAIL
C
Cleber Rosa 已提交
529 530 531 532
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))

533
    @unittest.skip("Temporary plugin infrastructure removal")
534
    def test_externalrunner_chdir_no_testdir(self):
C
Cleber Rosa 已提交
535
        os.chdir(basedir)
536 537
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off --external-runner=/bin/sh '
                    '--external-runner-chdir=test %s')
C
Cleber Rosa 已提交
538 539
        cmd_line %= (self.tmpdir, self.pass_script.path)
        result = process.run(cmd_line, ignore_status=True)
540 541
        expected_output = ('Option "--external-runner-chdir=test" requires '
                           '"--external-runner-testdir" to be set')
C
Cleber Rosa 已提交
542
        self.assertIn(expected_output, result.stderr)
543
        expected_rc = exit_codes.AVOCADO_JOB_FAIL
C
Cleber Rosa 已提交
544 545 546 547 548 549 550 551 552 553
        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)


554
class AbsPluginsTest(object):
555

556
    def setUp(self):
557
        self.base_outputdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
558

559 560 561 562 563 564
    def tearDown(self):
        shutil.rmtree(self.base_outputdir)


class PluginsTest(AbsPluginsTest, unittest.TestCase):

565
    @unittest.skip("Temporary plugin infrastructure removal")
566 567 568 569
    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)
570
        expected_rc = exit_codes.AVOCADO_ALL_OK
571 572 573 574 575 576
        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")

577
    @unittest.skip("Temporary plugin infrastructure removal")
578 579 580 581 582
    def test_list_plugin(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado list'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
583
        expected_rc = exit_codes.AVOCADO_ALL_OK
584 585 586 587 588
        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)

589
    @unittest.skip("Temporary plugin infrastructure removal")
590 591 592 593 594
    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
595
        expected_rc = exit_codes.AVOCADO_FAIL
596 597 598
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
599
        self.assertIn("Unable to discover url", output)
600

601
    @unittest.skip("Temporary plugin infrastructure removal")
602 603 604 605 606
    def test_plugin_list(self):
        os.chdir(basedir)
        cmd_line = './scripts/avocado plugins'
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
607
        expected_rc = exit_codes.AVOCADO_ALL_OK
608 609 610
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
611 612
        if sys.version_info[:2] >= (2, 7, 0):
            self.assertNotIn('Disabled', output)
613

614
    @unittest.skip("Temporary plugin infrastructure removal")
615
    def test_config_plugin(self):
616
        os.chdir(basedir)
617
        cmd_line = './scripts/avocado config --paginator off'
618 619
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
620
        expected_rc = exit_codes.AVOCADO_ALL_OK
621 622 623 624 625
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn('Disabled', output)

626
    @unittest.skip("Temporary plugin infrastructure removal")
627 628
    def test_config_plugin_datadir(self):
        os.chdir(basedir)
629
        cmd_line = './scripts/avocado config --datadir --paginator off'
630 631
        result = process.run(cmd_line, ignore_status=True)
        output = result.stdout
632
        expected_rc = exit_codes.AVOCADO_ALL_OK
633 634 635 636 637
        self.assertEqual(result.exit_status, expected_rc,
                         "Avocado did not return rc %d:\n%s" %
                         (expected_rc, result))
        self.assertNotIn('Disabled', output)

638
    @unittest.skip("Temporary plugin infrastructure removal")
639 640 641 642 643
    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
644
        expected_rc = exit_codes.AVOCADO_ALL_OK
645 646 647 648 649
        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)

650

651 652 653 654
class ParseXMLError(Exception):
    pass


655
class PluginsXunitTest(AbsPluginsTest, unittest.TestCase):
656

657
    def setUp(self):
658
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
659 660
        super(PluginsXunitTest, self).setUp()

661
    def run_and_check(self, testname, e_rc, e_ntests, e_nerrors,
662
                      e_nnotfound, e_nfailures, e_nskip):
663
        os.chdir(basedir)
L
Lukáš Doktor 已提交
664 665
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off'
                    ' --xunit - %s' % (self.tmpdir, testname))
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
        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]
681 682
        self.assertEqual(len(testsuite_tag.attributes), 7,
                         'The testsuite tag does not have 7 attributes. '
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
                         '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)

705
    @unittest.skip("Temporary plugin infrastructure removal")
706
    def test_xunit_plugin_passtest(self):
707 708
        self.run_and_check('passtest', exit_codes.AVOCADO_ALL_OK,
                           1, 0, 0, 0, 0)
709

710
    @unittest.skip("Temporary plugin infrastructure removal")
711
    def test_xunit_plugin_failtest(self):
712 713
        self.run_and_check('failtest', exit_codes.AVOCADO_TESTS_FAIL,
                           1, 0, 0, 1, 0)
714

715
    @unittest.skip("Temporary plugin infrastructure removal")
716
    def test_xunit_plugin_skiponsetuptest(self):
717 718
        self.run_and_check('skiponsetup', exit_codes.AVOCADO_ALL_OK,
                           1, 0, 0, 0, 1)
719

720
    @unittest.skip("Temporary plugin infrastructure removal")
721
    def test_xunit_plugin_errortest(self):
722 723
        self.run_and_check('errortest', exit_codes.AVOCADO_TESTS_FAIL,
                           1, 1, 0, 0, 0)
724

725 726 727 728
    def tearDown(self):
        shutil.rmtree(self.tmpdir)
        super(PluginsXunitTest, self).tearDown()

729 730 731 732 733

class ParseJSONError(Exception):
    pass


734
class PluginsJSONTest(AbsPluginsTest, unittest.TestCase):
735

736
    def setUp(self):
737
        self.tmpdir = tempfile.mkdtemp(prefix='avocado_' + __name__)
738 739
        super(PluginsJSONTest, self).setUp()

740
    def run_and_check(self, testname, e_rc, e_ntests, e_nerrors,
741 742
                      e_nfailures, e_nskip):
        os.chdir(basedir)
743 744
        cmd_line = ('./scripts/avocado run --job-results-dir %s --sysinfo=off --json - --archive %s' %
                    (self.tmpdir, testname))
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
        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")
770
        return json_data
771

772
    @unittest.skip("Temporary plugin infrastructure removal")
773
    def test_json_plugin_passtest(self):
774 775
        self.run_and_check('passtest', exit_codes.AVOCADO_ALL_OK,
                           1, 0, 0, 0)
776

777
    @unittest.skip("Temporary plugin infrastructure removal")
778
    def test_json_plugin_failtest(self):
779 780
        self.run_and_check('failtest', exit_codes.AVOCADO_TESTS_FAIL,
                           1, 0, 1, 0)
781

782
    @unittest.skip("Temporary plugin infrastructure removal")
783
    def test_json_plugin_skiponsetuptest(self):
784 785
        self.run_and_check('skiponsetup', exit_codes.AVOCADO_ALL_OK,
                           1, 0, 0, 1)
786

787
    @unittest.skip("Temporary plugin infrastructure removal")
788
    def test_json_plugin_errortest(self):
789 790
        self.run_and_check('errortest', exit_codes.AVOCADO_TESTS_FAIL,
                           1, 1, 0, 0)
791

792
    @unittest.skip("Temporary plugin infrastructure removal")
793 794 795 796 797 798 799 800 801 802 803 804 805
    def test_ugly_echo_cmd(self):
        if not os.path.exists("/bin/echo"):
            self.skipTest("Program /bin/echo does not exist")
        data = self.run_and_check('"/bin/echo -ne foo\\\\\\n\\\'\\\\\\"\\\\\\'
                                  'nbar/baz"', exit_codes.AVOCADO_ALL_OK, 1, 0,
                                  0, 0)
        # The executed test should be this
        self.assertEqual(data['tests'][0]['url'],
                         '/bin/echo -ne foo\\\\n\\\'\\"\\\\nbar/baz')
        # logdir name should escape special chars (/)
        self.assertEqual(os.path.basename(data['tests'][0]['logdir']),
                         '_bin_echo -ne foo\\\\n\\\'\\"\\\\nbar_baz')

806 807 808 809
    def tearDown(self):
        shutil.rmtree(self.tmpdir)
        super(PluginsJSONTest, self).tearDown()

810 811
if __name__ == '__main__':
    unittest.main()