Coverage for /pythoncovmergedfiles/medio/medio/src/icalendar/src/icalendar/fuzzing/ical_fuzzer.py: 42%

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

38 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 

12#!/usr/bin/python3 

13# Copyright 2023 Google LLC 

14# 

15# Licensed under the Apache License, Version 2.0 (the "License"); 

16# you may not use this file except in compliance with the License. 

17# You may obtain a copy of the License at 

18# 

19# http://www.apache.org/licenses/LICENSE-2.0 

20# 

21# Unless required by applicable law or agreed to in writing, software 

22# distributed under the License is distributed on an "AS IS" BASIS, 

23# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

24# See the License for the specific language governing permissions and 

25# limitations under the License. 

26# 

27################################################################################ 

28import base64 

29import contextlib 

30import sys 

31 

32import atheris 

33 

34with atheris.instrument_imports(): 

35 import icalendar.cal.calendar 

36 from icalendar.tests.fuzzed import fuzz_calendar_v1 

37 

38_value_error_matches = [ 

39 "component", 

40 "parse", 

41 "Expected", 

42 "Wrong date format", 

43 "END encountered", 

44 "vDDD", 

45 "recurrence", 

46 "Offset must", 

47 "Invalid iCalendar", 

48 "alue MUST", 

49 "Key name", 

50 "Invalid content line", 

51 "does not exist", 

52 "base 64", 

53 "must use datetime", 

54 "Unknown date type", 

55 "Wrong", 

56 "Start time", 

57 "iCalendar", 

58 "recurrence", 

59 "float, float", 

60 "utc offset", 

61 "parent", 

62 "MUST be a datetime", 

63] 

64 

65 

66@atheris.instrument_func 

67def TestOneInput(data): 

68 fdp = atheris.FuzzedDataProvider(data) 

69 try: 

70 multiple = fdp.ConsumeBool() 

71 should_walk = fdp.ConsumeBool() 

72 calendar_string = fdp.ConsumeString(fdp.remaining_bytes()) 

73 print("--- start calendar ---") 

74 with contextlib.suppress(UnicodeEncodeError): 

75 # print the ICS file for the test case extraction 

76 # see https://stackoverflow.com/a/27367173/1320237 

77 print( 

78 base64.b64encode( 

79 calendar_string.encode("UTF-8", "surrogateescape") 

80 ).decode("ASCII") 

81 ) 

82 print("--- end calendar ---") 

83 

84 fuzz_calendar_v1( 

85 icalendar.cal.calendar.Calendar.from_ical, 

86 calendar_string, 

87 multiple, 

88 should_walk, 

89 ) 

90 except (ValueError, TypeError) as e: 

91 if any(m in str(e) for m in _value_error_matches): 

92 return -1 

93 raise 

94 

95 

96def main(): 

97 atheris.Setup(sys.argv, TestOneInput) 

98 atheris.Fuzz() 

99 

100 

101if __name__ == "__main__": 

102 main()