44from mistune import create_markdown
55
66
7+ def _best_time (render , size ):
8+ return min (render (size ) for _ in range (3 ))
9+
10+
711class TestEdgeCaseSecurity (TestCase ):
812 def test_blank_list_continuations_are_near_linear (self ):
913 md = create_markdown ()
@@ -29,8 +33,8 @@ def render(size):
2933 return time .perf_counter () - started
3034
3135 render (1000 )
32- small = render ( 4000 )
33- large = render ( 8000 )
36+ small = _best_time ( render , 4000 )
37+ large = _best_time ( render , 8000 )
3438
3539 self .assertLess (large , small * 3.5 + 0.02 )
3640
@@ -40,3 +44,45 @@ def test_dense_emphasis_preserves_adjacent_tokens(self):
4044 md ("*a" * 6 + "\n " ),
4145 "<p><em>a</em>a<em>a</em>a<em>a</em>a</p>\n " ,
4246 )
47+
48+ def test_mixed_emphasis_delimiters_are_near_linear (self ):
49+ md = create_markdown ()
50+
51+ def render (size ):
52+ started = time .perf_counter ()
53+ md ("*a_b" * size )
54+ return time .perf_counter () - started
55+
56+ render (500 )
57+ small = _best_time (render , 2000 )
58+ large = _best_time (render , 4000 )
59+
60+ self .assertLess (large , small * 3 + 0.05 )
61+
62+ def test_malformed_images_are_near_linear (self ):
63+ md = create_markdown ()
64+
65+ def render (size ):
66+ started = time .perf_counter ()
67+ md ("![" * size + "x" + "]" * size )
68+ return time .perf_counter () - started
69+
70+ render (500 )
71+ small = _best_time (render , 2000 )
72+ large = _best_time (render , 4000 )
73+
74+ self .assertLess (large , small * 3 + 0.05 )
75+
76+ def test_unclosed_link_destinations_are_near_linear (self ):
77+ md = create_markdown ()
78+
79+ def render (size ):
80+ started = time .perf_counter ()
81+ md ("[](" * size )
82+ return time .perf_counter () - started
83+
84+ render (500 )
85+ small = _best_time (render , 2000 )
86+ large = _best_time (render , 4000 )
87+
88+ self .assertLess (large , small * 3 + 0.05 )
0 commit comments