Source file src/encoding/json/fuzz_test.go

     1  // Copyright 2021 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build !goexperiment.jsonv2
     6  
     7  package json
     8  
     9  import (
    10  	"bytes"
    11  	"io"
    12  	"testing"
    13  )
    14  
    15  func FuzzUnmarshalJSON(f *testing.F) {
    16  	f.Add([]byte(`{
    17  "object": {
    18  	"slice": [
    19  		1,
    20  		2.0,
    21  		"3",
    22  		[4],
    23  		{5: {}}
    24  	]
    25  },
    26  "slice": [[]],
    27  "string": ":)",
    28  "int": 1e5,
    29  "float": 3e-9"
    30  }`))
    31  
    32  	f.Fuzz(func(t *testing.T, b []byte) {
    33  		for _, typ := range []func() any{
    34  			func() any { return new(any) },
    35  			func() any { return new(map[string]any) },
    36  			func() any { return new([]any) },
    37  		} {
    38  			i := typ()
    39  			if err := Unmarshal(b, i); err != nil {
    40  				return
    41  			}
    42  
    43  			encoded, err := Marshal(i)
    44  			if err != nil {
    45  				t.Fatalf("failed to marshal: %s", err)
    46  			}
    47  
    48  			if err := Unmarshal(encoded, i); err != nil {
    49  				t.Fatalf("failed to roundtrip: %s", err)
    50  			}
    51  		}
    52  	})
    53  }
    54  
    55  func FuzzDecoderToken(f *testing.F) {
    56  	f.Add([]byte(`{
    57  "object": {
    58  	"slice": [
    59  		1,
    60  		2.0,
    61  		"3",
    62  		[4],
    63  		{5: {}}
    64  	]
    65  },
    66  "slice": [[]],
    67  "string": ":)",
    68  "int": 1e5,
    69  "float": 3e-9"
    70  }`))
    71  
    72  	f.Fuzz(func(t *testing.T, b []byte) {
    73  		r := bytes.NewReader(b)
    74  		d := NewDecoder(r)
    75  		for {
    76  			_, err := d.Token()
    77  			if err != nil {
    78  				if err == io.EOF {
    79  					break
    80  				}
    81  				return
    82  			}
    83  		}
    84  	})
    85  }
    86  

View as plain text