FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
python-fire/fire/parser_fuzz_test.py at master · google/python-fire · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
google
/
python-fire
Public
Notifications
You must be signed in to change notification settings
Fork
1.5k
Star
28.2k
Code
Issues
133
Pull requests
61
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
python-fire
/
fire
/
parser_fuzz_test.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
94 lines (83 loc) · 2.97 KB
Breadcrumbs
python-fire
/
fire
/
parser_fuzz_test.py
Copy path
File metadata and controls
94 lines (83 loc) · 2.97 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Copyright (C) 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Fuzz tests for the parser module."""
from
fire
import
parser
from
fire
import
testutils
from
hypothesis
import
example
from
hypothesis
import
given
from
hypothesis
import
settings
from
hypothesis
import
strategies
as
st
import
Levenshtein
class
ParserFuzzTest
(
testutils
.
BaseTestCase
):
@
settings
(
max_examples
=
10000
)
@
given
(
st
.
text
(
min_size
=
1
))
@
example
(
'True'
)
@
example
(
r'"test\t\t\a\\a"'
)
@
example
(
r' "test\t\t\a\\a" '
)
@
example
(
'"(1, 2)"'
)
@
example
(
'(1, 2)'
)
@
example
(
'(1, 2)'
)
@
example
(
'(1, 2) '
)
@
example
(
'a,b,c,d'
)
@
example
(
'(a,b,c,d)'
)
@
example
(
'[a,b,c,d]'
)
@
example
(
'{a,b,c,d}'
)
@
example
(
'test:(a,b,c,d)'
)
@
example
(
'{test:(a,b,c,d)}'
)
@
example
(
'{test:a,b,c,d}'
)
@
example
(
'{test:a,b:(c,d)}'
)
# Note: Edit distance may be high for dicts.
@
example
(
'0,'
)
@
example
(
'#'
)
@
example
(
'A#00000'
)
# Note: '#'' is treated as a comment.
@
example
(
'
\x80
'
)
# Note: Causes UnicodeDecodeError.
@
example
(
100
*
'['
+
'0'
)
# Note: Causes MemoryError.
@
example
(
'
\r
\r
\r
\r
1
\r
\r
'
)
def
testDefaultParseValueFuzz
(
self
,
value
):
try
:
result
=
parser
.
DefaultParseValue
(
value
)
except
TypeError
:
# It's OK to get a TypeError if the string has the null character.
if
'
\x00
'
in
value
:
return
raise
except
MemoryError
:
if
len
(
value
)
>
100
:
# This is not what we're testing.
return
raise
try
:
uvalue
=
str
(
value
)
uresult
=
str
(
result
)
except
UnicodeDecodeError
:
# This is not what we're testing.
return
# Check that the parsed value doesn't differ too much from the input.
distance
=
Levenshtein
.
distance
(
uresult
,
uvalue
)
max_distance
=
(
2
+
# Quotes or parenthesis can be implicit.
sum
(
c
.
isspace
()
for
c
in
value
)
+
value
.
count
(
'"'
)
+
value
.
count
(
"'"
)
+
3
*
(
value
.
count
(
','
)
+
1
)
+
# 'a,' can expand to "'a', "
3
*
(
value
.
count
(
':'
))
+
# 'a:' can expand to "'a': "
2
*
value
.
count
(
'
\\
'
))
if
'#'
in
value
:
max_distance
+=
len
(
value
)
-
value
.
index
(
'#'
)
if
not
isinstance
(
result
,
str
):
max_distance
+=
value
.
count
(
'0'
)
# Leading 0s are stripped.
# Note: We don't check distance for dicts since item order can be changed.
if
'{'
not
in
value
:
self
.
assertLessEqual
(
distance
,
max_distance
,
(
distance
,
max_distance
,
uvalue
,
uresult
))
if
__name__
==
'__main__'
:
testutils
.
main
()
Back
|
FazBrowse Home
|
New Git URL