Coverage for /pythoncovmergedfiles/medio/medio/src/dateparser/fuzzing/dateparser_fuzzer.py: 30%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1###### Coverage stub
2import atexit
3import coverage
4cov = coverage.coverage(data_file='.coverage', cover_pylib=True)
5cov.start()
6# Register an exist handler that will print coverage
7def exit_handler():
8 cov.stop()
9 cov.save()
10atexit.register(exit_handler)
11####### End of coverage stub
12import sys
13from typing import List
15import atheris
16from fuzz_helpers import EnhancedFuzzedDataProvider
18with atheris.instrument_imports():
19 import dateparser
21import re
23import pytz
25import dateparser.data
26import dateparser.parser
28language_codes = dateparser.data.languages_info.language_order
29directives = [
30 "%a",
31 "%A",
32 "%w",
33 "%d",
34 "%b",
35 "%B",
36 "%m",
37 "%y",
38 "%Y",
39 "%H",
40 "%I",
41 "%p",
42 "%M",
43 "%S",
44 "%f",
45 "%z",
46 "%Z",
47 "%j",
48 "%U",
49 "%W",
50 "%c",
51 "%x",
52 "%X",
53 "%%",
54 "%G",
55 "%u",
56 "%V",
57 "%:Z",
58]
59locale_codes = ["fr-PF", "qu-EC", "af-NA"]
60date_order = list(dateparser.parser.date_order_chart.keys())
61timezone = list(pytz.all_timezones)
62preferred_date = ["last", "first", "current"]
63preferred_dates_from = ["past", "future", "current_period"]
64parsers = [
65 "timestamp",
66 "negative-timestamp",
67 "relative-time",
68 "custom-formats",
69 "absolute-time",
70 "no-spaces-time",
71]
74def _get_format_strings(fdp: EnhancedFuzzedDataProvider) -> List[str]:
75 format_strings = []
76 for _ in range(fdp.ConsumeIntInRange(0, 5)):
77 format_strings.append(fdp.ConsumeString(1).join(fdp.ConsumeSublist(directives)))
78 return format_strings
81def TestOneInput(data):
82 fdp = EnhancedFuzzedDataProvider(data)
84 settings = {
85 "DATE_ORDER": fdp.PickValueInList(date_order),
86 "PREFER_LOCALE_DATE_ORDER": fdp.ConsumeBool(),
87 "TIMEZONE": fdp.PickValueInList(timezone),
88 "TO_TIMEZONE": fdp.PickValueInList(timezone),
89 "RETURN_AS_TIMEZONE_AWARE": fdp.ConsumeBool(),
90 "PREFER_MONTH_OF_YEAR": fdp.PickValueInList(preferred_date),
91 "PREFER_DAY_OF_MONTH": fdp.PickValueInList(preferred_date),
92 "PREFER_DATES_FROM": fdp.PickValueInList(preferred_dates_from),
93 "RELATIVE_BASE": fdp.ConsumeDate(),
94 "STRICT_PARSING": fdp.ConsumeBool(),
95 "REQUIRE_PARTS": [],
96 "SKIP_TOKENS": [
97 fdp.ConsumeRandomString() for _ in range(fdp.ConsumeIntInRange(0, 3))
98 ],
99 "NORMALIZE": fdp.ConsumeBool(),
100 "RETURN_TIME_AS_PERIOD": fdp.ConsumeBool(),
101 "PARSERS": fdp.ConsumeSublist(parsers),
102 "DEFAULT_LANGUAGES": fdp.ConsumeSublist(language_codes),
103 "LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD": fdp.ConsumeProbability(),
104 }
106 try:
107 dateparser.parse(
108 fdp.ConsumeRandomString(),
109 date_formats=_get_format_strings(fdp),
110 languages=fdp.ConsumeSublist(language_codes),
111 locales=fdp.ConsumeSublist(locale_codes),
112 region=fdp.ConsumeString(2),
113 settings=settings,
114 )
115 except re.error:
116 return -1
119def main():
120 atheris.Setup(sys.argv, TestOneInput)
121 atheris.Fuzz()
124if __name__ == "__main__":
125 main()