gh-94675: Add a regression test for rjsmin re slowdown (GH-94685)

Adds a regression test for an re slowdown observed by rjsmin.
Uses multiprocessing to kill the test after SHORT_TIMEOUT.

Co-authored-by: Oleg Iarygin <dralife@yandex.ru>
Co-authored-by: Christian Heimes <christian@python.org>
This commit is contained in:
Miro Hrončok 2022-08-04 01:19:36 +02:00 committed by GitHub
parent dc2757accd
commit fe23c0061d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View file

@ -1,6 +1,7 @@
from test.support import (gc_collect, bigmemtest, _2G,
cpython_only, captured_stdout,
check_disallow_instantiation, is_emscripten, is_wasi)
check_disallow_instantiation, is_emscripten, is_wasi,
SHORT_TIMEOUT)
import locale
import re
import string
@ -11,6 +12,14 @@ import warnings
from re import Scanner
from weakref import proxy
# some platforms lack working multiprocessing
try:
import _multiprocessing
except ImportError:
multiprocessing = None
else:
import multiprocessing
# Misc tests from Tim Peters' re.doc
# WARNING: Don't change details in these tests if you don't know
@ -2407,6 +2416,26 @@ class ReTests(unittest.TestCase):
self.assertTrue(template_re1.match('ahoy'))
self.assertFalse(template_re1.match('nope'))
@unittest.skipIf(multiprocessing is None, 'test requires multiprocessing')
def test_regression_gh94675(self):
pattern = re.compile(r'(?<=[({}])(((//[^\n]*)?[\n])([\000-\040])*)*'
r'((/[^/\[\n]*(([^\n]|(\[\n]*(]*)*\]))'
r'[^/\[]*)*/))((((//[^\n]*)?[\n])'
r'([\000-\040]|(/\*[^*]*\*+'
r'([^/*]\*+)*/))*)+(?=[^\000-\040);\]}]))')
input_js = '''a(function() {
///////////////////////////////////////////////////////////////////
});'''
p = multiprocessing.Process(target=pattern.sub, args=('', input_js))
p.start()
p.join(SHORT_TIMEOUT)
try:
self.assertFalse(p.is_alive(), 'pattern.sub() timed out')
finally:
if p.is_alive():
p.terminate()
p.join()
def get_debug_out(pat):
with captured_stdout() as out:

View file

@ -0,0 +1 @@
Add a regression test for :mod:`re` exponentional slowdown when using rjsmin.