github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/amino/tests/fuzz/binary/init-corpus/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"math"
     8  	"os"
     9  	"path/filepath"
    10  	"time"
    11  
    12  	amino "github.com/gnolang/gno/tm2/pkg/amino"
    13  	"github.com/gnolang/gno/tm2/pkg/amino/tests"
    14  )
    15  
    16  func main() {
    17  	corpusParentDir := flag.String("corpus-parent", ".", "the directory in which we should place the corpus directory")
    18  	flag.Parse()
    19  
    20  	corpusDir := filepath.Join(*corpusParentDir, "corpus")
    21  	if err := os.MkdirAll(corpusDir, 0o755); err != nil {
    22  		log.Fatalf("Cannot mkdirAll: %q err: %v", corpusDir, err)
    23  	}
    24  
    25  	// Let's seed the fuzzer by filling in the tests
    26  	// manually.
    27  	ps := tests.PrimitivesStruct{
    28  		Int8:        0x7F,
    29  		Int16:       0x7FFF,
    30  		Int32:       0x1EADBEEF,
    31  		Int32Fixed:  0x7FFFFFFF,
    32  		Int64:       0x00,
    33  		Int64Fixed:  0x00,
    34  		Int:         0x7FFFFFFF,
    35  		Byte:        0xCD,
    36  		Uint8:       0xFF,
    37  		Uint16:      0xFFFF,
    38  		Uint32:      0xFFFFFFFF,
    39  		Uint32Fixed: 0xFFFFFFFF,
    40  		Uint64:      0x8000000000000000,
    41  		Uint64Fixed: 0x8000000000000000,
    42  		Uint:        0x80000000,
    43  		Str:         "Tendermint!",
    44  		Bytes:       []byte("DEEZMINTS"),
    45  		Time:        time.Date(2018, 3, 2, 21, 10, 12, 1e5, time.UTC),
    46  	}
    47  
    48  	hour := 60 * time.Minute
    49  	as := tests.ArraysStruct{
    50  		Int8Ar:   [4]int8{0x7F, 0x6F, 0x5F, 0x4F},
    51  		Int16Ar:  [4]int16{0x7FFF, 0x6FFF, 0x5FFF, 0x00},
    52  		Int32Ar:  [4]int32{0x7FFFFFFF, 0x6FFFFFFF, 0x5FFFFFFF, 0x77777777},
    53  		Int64Ar:  [4]int64{0x7FFFFFFFFFFFF, 0x6FFFFFFFFFFFF, 0x5FFFFFFFFFFFF, 0x80808000FFFFF},
    54  		IntAr:    [4]int{0x7FFFFFFF, 0x6FFFFFFF, 0x5FFFFFFF, math.MaxInt32},
    55  		ByteAr:   [4]byte{0xDE, 0xAD, 0xBE, 0xEF},
    56  		Uint8Ar:  [4]uint8{0xFF, 0xFF, 0x00, 0x88},
    57  		Uint16Ar: [4]uint16{0xFFFF, 0xFFFF, 0xFF00, 0x8800},
    58  		Uint32Ar: [4]uint32{0x80808080, 0x110202FF, 0xAE21FF00, 0x10458800},
    59  		Uint64Ar: [4]uint64{0x80808080FFFFFF77, 0x110202FFFFFFFF77, 0xAE21FF0051F23F77, 0x1045880011AABBCC},
    60  		UintAr:   [4]uint{0x80808080, 0x110202FF, 0xAE21FF00, 0x10458800},
    61  		StrAr:    [4]string{"Tendermint", "Fuzzing", "Blue", "410DDC670CF9BFD7"},
    62  		TimeAr:   [4]time.Time{{}, time.Time{}.Add(1000 * hour * 24), time.Time{}.Add(20 * time.Minute)},
    63  	}
    64  
    65  	ss := tests.SlicesStruct{
    66  		Int8Sl:   []int8{0x6F, 0x5F, 0x7F, 0x4F},
    67  		Int16Sl:  []int16{0x6FFF, 0x5FFF, 0x7FFF, 0x00},
    68  		Int32Sl:  []int32{0x6FFFFFFF, 0x5FFFFFFF, 0x7FFFFFFF, 0x7F000000},
    69  		Int64Sl:  []int64{0x6FFFFFFFFFFFF, 0x5FFFFFFFFFFFF, 0x7FFFFFFFFFFFF, 0x80808000FFFFF},
    70  		IntSl:    []int{0x6FFFFFFF, 0x7FFFFFFF, math.MaxInt32, 0x5FFFFFFF},
    71  		ByteSl:   []byte{0xAD, 0xBE, 0xDE, 0xEF},
    72  		Uint8Sl:  []uint8{0xFF, 0x00, 0x88, 0xFF},
    73  		Uint16Sl: []uint16{0xFFFF, 0xFFFF, 0xFF00, 0x8800},
    74  		Uint32Sl: []uint32{0x110202FF, 0xAE21FF00, 0x80808080, 0x10458800},
    75  		Uint64Sl: []uint64{0x110202FFFFFFFF77, 0xAE21FF0051F23F77, 0x80808080FFFFFF77, 0x1045880011AABBCC},
    76  		UintSl:   []uint{0x80808080, 0x110202FF, 0xAE21FF00, 0x10458800},
    77  		StrSl:    []string{"Tendermint", "Fuzzing", "Blue", "410DDC670CF9BFD7"},
    78  		TimeSl: []time.Time{
    79  			(time.Time{}).Add(60 * 24 * time.Minute), (time.Time{}).Add(1000 * hour * 24), time.Time{}.Add(20 * time.Minute),
    80  		},
    81  	}
    82  
    83  	bslice := []byte("VIVA LA VIDA!")
    84  	pts1 := tests.PointersStruct{}
    85  	pts2 := tests.PointersStruct{
    86  		Int8Pt:   new(int8),
    87  		Int16Pt:  &ss.Int16Sl[0],
    88  		Int32Pt:  new(int32),
    89  		Int64Pt:  &ss.Int64Sl[2],
    90  		IntPt:    &as.IntAr[3],
    91  		BytePt:   &ss.ByteSl[0],
    92  		Uint8Pt:  new(uint8),
    93  		Uint16Pt: &ss.Uint16Sl[2],
    94  		Uint32Pt: &ss.Uint32Sl[1],
    95  		Uint64Pt: &ss.Uint64Sl[0],
    96  		UintPt:   &ss.UintSl[2],
    97  		StrPt:    &as.StrAr[1],
    98  		BytesPt:  &bslice,
    99  		TimePt:   &ss.TimeSl[2],
   100  	}
   101  
   102  	seeds := []*tests.ComplexSt{
   103  		{PrField: ps, ArField: tests.ArraysStruct{}, SlField: tests.SlicesStruct{}, PtField: tests.PointersStruct{}},
   104  		{PrField: ps, ArField: as, SlField: tests.SlicesStruct{}, PtField: tests.PointersStruct{}},
   105  		{PrField: ps, ArField: as, SlField: ss, PtField: tests.PointersStruct{}},
   106  		{PrField: ps, ArField: as, SlField: ss, PtField: pts1},
   107  		{PrField: ps, ArField: as, SlField: ss, PtField: pts2},
   108  
   109  		{PrField: tests.PrimitivesStruct{}, ArField: as, SlField: tests.SlicesStruct{}, PtField: tests.PointersStruct{}},
   110  		{PrField: ps, ArField: as, SlField: tests.SlicesStruct{}, PtField: tests.PointersStruct{}},
   111  		{PrField: ps, ArField: as, SlField: ss, PtField: tests.PointersStruct{}},
   112  		{PrField: ps, ArField: as, SlField: ss, PtField: pts1},
   113  		{PrField: ps, ArField: as, SlField: ss, PtField: pts2},
   114  
   115  		{PrField: tests.PrimitivesStruct{}, ArField: tests.ArraysStruct{}, SlField: ss, PtField: tests.PointersStruct{}},
   116  		{PrField: ps, ArField: tests.ArraysStruct{}, SlField: ss, PtField: tests.PointersStruct{}},
   117  		{PrField: ps, ArField: as, SlField: ss, PtField: tests.PointersStruct{}},
   118  		{PrField: ps, ArField: as, SlField: ss, PtField: pts1},
   119  		{PrField: ps, ArField: as, SlField: ss, PtField: pts2},
   120  
   121  		{PrField: tests.PrimitivesStruct{}, ArField: tests.ArraysStruct{}, SlField: tests.SlicesStruct{}, PtField: pts2},
   122  		{PrField: ps, ArField: tests.ArraysStruct{}, SlField: tests.SlicesStruct{}, PtField: pts2},
   123  		{PrField: ps, ArField: as, SlField: tests.SlicesStruct{}, PtField: pts2},
   124  		{PrField: ps, ArField: as, SlField: ss, PtField: pts2},
   125  
   126  		{PrField: tests.PrimitivesStruct{}, ArField: tests.ArraysStruct{}, SlField: tests.SlicesStruct{}, PtField: pts1},
   127  		{PrField: ps, ArField: tests.ArraysStruct{}, SlField: tests.SlicesStruct{}, PtField: pts1},
   128  		{PrField: ps, ArField: as, SlField: tests.SlicesStruct{}, PtField: pts1},
   129  		{PrField: ps, ArField: as, SlField: ss, PtField: pts1},
   130  	}
   131  
   132  	cdc := amino.NewCodec()
   133  	cdc.RegisterPackage(tests.Package)
   134  
   135  	for i, seed := range seeds {
   136  		blob, err := cdc.MarshalSized(seed)
   137  		if err != nil {
   138  			log.Fatalf("Failed to Marshal on seed: %d", i)
   139  		}
   140  
   141  		fullPath := filepath.Join(corpusDir, fmt.Sprintf("%d", i))
   142  		f, err := os.Create(fullPath)
   143  		if err != nil {
   144  			log.Fatalf("Failed to create path: %q", fullPath)
   145  		}
   146  		_, err = f.Write(blob)
   147  		if err != nil {
   148  			log.Fatalf("failed to write to file")
   149  		}
   150  		_ = f.Close()
   151  	}
   152  }