Coverage for /pythoncovmergedfiles/medio/medio/src/fuzz_attrs.py: 58%
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
12#!/usr/bin/python3
14# Copyright 2025 Google LLC
15#
16# Licensed under the Apache License, Version 2.0 (the "License");
17# you may not use this file except in compliance with the License.
18# You may obtain a copy of the License at
19#
20# http://www.apache.org/licenses/LICENSE-2.0
21#
22# Unless required by applicable law or agreed to in writing, software
23# distributed under the License is distributed on an "AS IS" BASIS,
24# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25# See the License for the specific language governing permissions and
26# limitations under the License.
27#
28##########################################################################
29import sys
30import atheris
32import attrs
33from string import ascii_letters
35def consumeIdentifier(fdp):
36 return fdp.ConsumeUnicode(8)
38@atheris.instrument_func
39def TestOneInput(data):
40 fdp = atheris.FuzzedDataProvider(data)
41 clsname = consumeIdentifier(fdp)
42 attrcount = fdp.ConsumeIntInRange(0, 12)
43 attrnames = [consumeIdentifier(fdp)
44 for _ in range(attrcount)]
45 attrvalues = [None] * attrcount
47 # Create class from attrs.make_class
48 try:
49 C0 = attrs.make_class(clsname, attrnames)
50 except Exception as e:
51 if any(not name.isidentifier() for name in [clsname] + attrnames):
52 return
53 raise
54 c0 = C0(**{k: v for k, v in zip(attrnames, attrvalues)})
55 d0 = attrs.asdict(c0)
56 c0_p = C0(**d0)
57 assert c0 == c0_p
59 # Create class from attrs.define
60 C1 = attrs.define(type(clsname, (), {f: attrs.field() for f in attrnames}))
61 c1 = C1(**{k: v for k, v in zip(attrnames, attrvalues)})
62 d1 = attrs.asdict(c1)
63 c1_p = C1(**d1)
64 assert c1 == c1_p
67def main():
68 atheris.instrument_all()
69 atheris.Setup(sys.argv, TestOneInput)
70 atheris.Fuzz()
73if __name__ == "__main__":
74 main()