Coverage for /pythoncovmergedfiles/medio/medio/src/websockets/fuzzing/fuzz_websocket_parser.py: 50%

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 

12import sys 

13 

14import atheris 

15 

16 

17with atheris.instrument_imports(): 

18 from websockets.exceptions import PayloadTooBig, ProtocolError 

19 from websockets.frames import Frame 

20 from websockets.streams import StreamReader 

21 

22 

23def test_one_input(data): 

24 fdp = atheris.FuzzedDataProvider(data) 

25 mask = fdp.ConsumeBool() 

26 max_size_enabled = fdp.ConsumeBool() 

27 max_size = fdp.ConsumeInt(4) 

28 payload = fdp.ConsumeBytes(atheris.ALL_REMAINING) 

29 

30 reader = StreamReader() 

31 reader.feed_data(payload) 

32 reader.feed_eof() 

33 

34 parser = Frame.parse( 

35 reader.read_exact, 

36 mask=mask, 

37 max_size=max_size if max_size_enabled else None, 

38 ) 

39 

40 try: 

41 next(parser) 

42 except StopIteration as exc: 

43 assert isinstance(exc.value, Frame) 

44 return # input accepted 

45 except ( 

46 EOFError, # connection is closed without a full WebSocket frame 

47 UnicodeDecodeError, # frame contains invalid UTF-8 

48 PayloadTooBig, # frame's payload size exceeds ``max_size`` 

49 ProtocolError, # frame contains incorrect values 

50 ): 

51 return # input rejected with a documented exception 

52 

53 raise RuntimeError("parsing didn't complete") 

54 

55 

56def main(): 

57 atheris.Setup(sys.argv, test_one_input) 

58 atheris.Fuzz() 

59 

60 

61if __name__ == "__main__": 

62 main()