[3.6] bpo-30523, bpo-30764, bpo-30776: Sync regrtest from master (#2441) · python/cpython@35d2ca2 (original) (raw)

`@@ -377,19 +377,19 @@ def parse_executed_tests(self, output):

`

377

377

`return list(match.group(1) for match in parser)

`

378

378

``

379

379

`def check_executed_tests(self, output, tests, skipped=(), failed=(),

`

380

``

`-

omitted=(), randomize=False, interrupted=False):

`

``

380

`+

env_changed=(), omitted=(),

`

``

381

`+

randomize=False, interrupted=False,

`

``

382

`+

fail_env_changed=False):

`

381

383

`if isinstance(tests, str):

`

382

384

`tests = [tests]

`

383

385

`if isinstance(skipped, str):

`

384

386

`skipped = [skipped]

`

385

387

`if isinstance(failed, str):

`

386

388

`failed = [failed]

`

``

389

`+

if isinstance(env_changed, str):

`

``

390

`+

env_changed = [env_changed]

`

387

391

`if isinstance(omitted, str):

`

388

392

`omitted = [omitted]

`

389

``

`-

ntest = len(tests)

`

390

``

`-

nskipped = len(skipped)

`

391

``

`-

nfailed = len(failed)

`

392

``

`-

nomitted = len(omitted)

`

393

393

``

394

394

`executed = self.parse_executed_tests(output)

`

395

395

`if randomize:

`

`@@ -415,11 +415,17 @@ def list_regex(line_format, tests):

`

415

415

`regex = list_regex('%s test%s failed', failed)

`

416

416

`self.check_line(output, regex)

`

417

417

``

``

418

`+

if env_changed:

`

``

419

`+

regex = list_regex('%s test%s altered the execution environment',

`

``

420

`+

env_changed)

`

``

421

`+

self.check_line(output, regex)

`

``

422

+

418

423

`if omitted:

`

419

424

`regex = list_regex('%s test%s omitted', omitted)

`

420

425

`self.check_line(output, regex)

`

421

426

``

422

``

`-

good = ntest - nskipped - nfailed - nomitted

`

``

427

`+

good = (len(tests) - len(skipped) - len(failed)

`

``

428

`+

`

423

429

`if good:

`

424

430

`regex = r'%s test%s OK.$' % (good, plural(good))

`

425

431

`if not skipped and not failed and good > 1:

`

`@@ -429,10 +435,12 @@ def list_regex(line_format, tests):

`

429

435

`if interrupted:

`

430

436

`self.check_line(output, 'Test suite interrupted by signal SIGINT.')

`

431

437

``

432

``

`-

if nfailed:

`

``

438

`+

if failed:

`

433

439

`result = 'FAILURE'

`

434

440

`elif interrupted:

`

435

441

`result = 'INTERRUPTED'

`

``

442

`+

elif fail_env_changed and env_changed:

`

``

443

`+

result = 'ENV CHANGED'

`

436

444

`else:

`

437

445

`result = 'SUCCESS'

`

438

446

`self.check_line(output, 'Tests result: %s' % result)

`

`@@ -604,7 +612,7 @@ def test_failing(self):

`

604

612

`test_failing = self.create_test('failing', code=code)

`

605

613

`tests = [test_ok, test_failing]

`

606

614

``

607

``

`-

output = self.run_tests(*tests, exitcode=1)

`

``

615

`+

output = self.run_tests(*tests, exitcode=2)

`

608

616

`self.check_executed_tests(output, tests, failed=test_failing)

`

609

617

``

610

618

`def test_resources(self):

`

`@@ -703,7 +711,7 @@ def test_fromfile(self):

`

703

711

`def test_interrupted(self):

`

704

712

`code = TEST_INTERRUPTED

`

705

713

`test = self.create_test('sigint', code=code)

`

706

``

`-

output = self.run_tests(test, exitcode=1)

`

``

714

`+

output = self.run_tests(test, exitcode=130)

`

707

715

`self.check_executed_tests(output, test, omitted=test,

`

708

716

`interrupted=True)

`

709

717

``

`@@ -732,7 +740,7 @@ def test_slow_interrupted(self):

`

732

740

`args = ("--slowest", "-j2", test)

`

733

741

`else:

`

734

742

`args = ("--slowest", test)

`

735

``

`-

output = self.run_tests(*args, exitcode=1)

`

``

743

`+

output = self.run_tests(*args, exitcode=130)

`

736

744

`self.check_executed_tests(output, test,

`

737

745

`omitted=test, interrupted=True)

`

738

746

``

`@@ -772,9 +780,43 @@ def test_run(self):

`

772

780

` builtins.dict['RUN'] = 1

`

773

781

` """)

`

774

782

`test = self.create_test('forever', code=code)

`

775

``

`-

output = self.run_tests('--forever', test, exitcode=1)

`

``

783

`+

output = self.run_tests('--forever', test, exitcode=2)

`

776

784

`self.check_executed_tests(output, [test]*3, failed=test)

`

777

785

``

``

786

`+

def check_leak(self, code, what):

`

``

787

`+

test = self.create_test('huntrleaks', code=code)

`

``

788

+

``

789

`+

filename = 'reflog.txt'

`

``

790

`+

self.addCleanup(support.unlink, filename)

`

``

791

`+

output = self.run_tests('--huntrleaks', '3:3:', test,

`

``

792

`+

exitcode=2,

`

``

793

`+

stderr=subprocess.STDOUT)

`

``

794

`+

self.check_executed_tests(output, [test], failed=test)

`

``

795

+

``

796

`+

line = 'beginning 6 repetitions\n123456\n......\n'

`

``

797

`+

self.check_line(output, re.escape(line))

`

``

798

+

``

799

`+

line2 = '%s leaked [1, 1, 1] %s, sum=3\n' % (test, what)

`

``

800

`+

self.assertIn(line2, output)

`

``

801

+

``

802

`+

with open(filename) as fp:

`

``

803

`+

reflog = fp.read()

`

``

804

`+

self.assertIn(line2, reflog)

`

``

805

+

``

806

`+

@unittest.skipUnless(Py_DEBUG, 'need a debug build')

`

``

807

`+

def test_huntrleaks(self):

`

``

808

`+

test --huntrleaks

`

``

809

`+

code = textwrap.dedent("""

`

``

810

`+

import unittest

`

``

811

+

``

812

`+

GLOBAL_LIST = []

`

``

813

+

``

814

`+

class RefLeakTest(unittest.TestCase):

`

``

815

`+

def test_leak(self):

`

``

816

`+

GLOBAL_LIST.append(object())

`

``

817

`+

""")

`

``

818

`+

self.check_leak(code, 'references')

`

``

819

+

778

820

`@unittest.skipUnless(Py_DEBUG, 'need a debug build')

`

779

821

`def test_huntrleaks_fd_leak(self):

`

780

822

`# test --huntrleaks for file descriptor leak

`

`@@ -799,24 +841,7 @@ def test_leak(self):

`

799

841

` fd = os.open(file, os.O_RDONLY)

`

800

842

` # bug: never cloes the file descriptor

`

801

843

` """)

`

802

``

`-

test = self.create_test('huntrleaks', code=code)

`

803

``

-

804

``

`-

filename = 'reflog.txt'

`

805

``

`-

self.addCleanup(support.unlink, filename)

`

806

``

`-

output = self.run_tests('--huntrleaks', '3:3:', test,

`

807

``

`-

exitcode=1,

`

808

``

`-

stderr=subprocess.STDOUT)

`

809

``

`-

self.check_executed_tests(output, [test], failed=test)

`

810

``

-

811

``

`-

line = 'beginning 6 repetitions\n123456\n......\n'

`

812

``

`-

self.check_line(output, re.escape(line))

`

813

``

-

814

``

`-

line2 = '%s leaked [1, 1, 1] file descriptors, sum=3\n' % test

`

815

``

`-

self.assertIn(line2, output)

`

816

``

-

817

``

`-

with open(filename) as fp:

`

818

``

`-

reflog = fp.read()

`

819

``

`-

self.assertIn(line2, reflog)

`

``

844

`+

self.check_leak(code, 'file descriptors')

`

820

845

``

821

846

`def test_list_tests(self):

`

822

847

`# test --list-tests

`

`@@ -837,19 +862,28 @@ def test_method2(self):

`

837

862

` pass

`

838

863

` """)

`

839

864

`testname = self.create_test(code=code)

`

``

865

+

``

866

`+

Test --list-cases

`

840

867

`all_methods = ['%s.Tests.test_method1' % testname,

`

841

868

`'%s.Tests.test_method2' % testname]

`

842

869

`output = self.run_tests('--list-cases', testname)

`

843

870

`self.assertEqual(output.splitlines(), all_methods)

`

844

871

``

``

872

`+

Test --list-cases with --match

`

``

873

`+

all_methods = ['%s.Tests.test_method1' % testname]

`

``

874

`+

output = self.run_tests('--list-cases',

`

``

875

`+

'-m', 'test_method1',

`

``

876

`+

testname)

`

``

877

`+

self.assertEqual(output.splitlines(), all_methods)

`

``

878

+

845

879

`def test_crashed(self):

`

846

880

`# Any code which causes a crash

`

847

881

`code = 'import faulthandler; faulthandler._sigsegv()'

`

848

882

`crash_test = self.create_test(name="crash", code=code)

`

849

883

`ok_test = self.create_test(name="ok")

`

850

884

``

851

885

`tests = [crash_test, ok_test]

`

852

``

`-

output = self.run_tests("-j2", *tests, exitcode=1)

`

``

886

`+

output = self.run_tests("-j2", *tests, exitcode=2)

`

853

887

`self.check_executed_tests(output, tests, failed=crash_test,

`

854

888

`randomize=True)

`

855

889

``

`@@ -898,6 +932,25 @@ def test_method4(self):

`

898

932

`subset = ['test_method1', 'test_method3']

`

899

933

`self.assertEqual(methods, subset)

`

900

934

``

``

935

`+

def test_env_changed(self):

`

``

936

`+

code = textwrap.dedent("""

`

``

937

`+

import unittest

`

``

938

+

``

939

`+

class Tests(unittest.TestCase):

`

``

940

`+

def test_env_changed(self):

`

``

941

`+

open("env_changed", "w").close()

`

``

942

`+

""")

`

``

943

`+

testname = self.create_test(code=code)

`

``

944

+

``

945

`+

don't fail by default

`

``

946

`+

output = self.run_tests(testname)

`

``

947

`+

self.check_executed_tests(output, [testname], env_changed=testname)

`

``

948

+

``

949

`+

fail with --fail-env-changed

`

``

950

`+

output = self.run_tests("--fail-env-changed", testname, exitcode=3)

`

``

951

`+

self.check_executed_tests(output, [testname], env_changed=testname,

`

``

952

`+

fail_env_changed=True)

`

``

953

+

901

954

``

902

955

`if name == 'main':

`

903

956

`unittest.main()

`