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 }