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

43 statements  

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 

14 

15import atheris 

16from fuzz_helpers import EnhancedFuzzedDataProvider 

17 

18with atheris.instrument_imports(): 

19 import dateparser 

20 

21import re 

22 

23import pytz 

24 

25import dateparser.data 

26import dateparser.parser 

27 

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] 

72 

73 

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 

79 

80 

81def TestOneInput(data): 

82 fdp = EnhancedFuzzedDataProvider(data) 

83 

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 } 

105 

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 

117 

118 

119def main(): 

120 atheris.Setup(sys.argv, TestOneInput) 

121 atheris.Fuzz() 

122 

123 

124if __name__ == "__main__": 

125 main()