diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-10 23:49:07 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-11 00:44:30 -0600 |
commit | ad9ac6d07ce1819260c2b7f090fd4fe742c80d9f (patch) | |
tree | ab6a607ea8575382c978f07de943ccf6c077de7c /lib/btrfs/btrfsitem/items_test.go | |
parent | 41ef03aabf8d6db4f926480fc5ddfec014e342d3 (diff) |
Fuzz btrfsitem, and by consequence improve binstruct errors
Diffstat (limited to 'lib/btrfs/btrfsitem/items_test.go')
-rw-r--r-- | lib/btrfs/btrfsitem/items_test.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/btrfs/btrfsitem/items_test.go b/lib/btrfs/btrfsitem/items_test.go new file mode 100644 index 0000000..aba8ca2 --- /dev/null +++ b/lib/btrfs/btrfsitem/items_test.go @@ -0,0 +1,65 @@ +// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com> +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package btrfsitem_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/internal" +) + +func FuzzRoundTrip(f *testing.F) { + keySize := binstruct.StaticSize(internal.Key{}) + sumtypeSize := binstruct.StaticSize(btrfssum.CSumType(0)) + + f.Add(make([]byte, 256)) + + f.Fuzz(func(t *testing.T, inDat []byte) { + if len(inDat) < keySize+sumtypeSize { + t.Skip() + } + keyInDat, inDat := inDat[:keySize], inDat[keySize:] + sumtypeInDat, inDat := inDat[:sumtypeSize], inDat[sumtypeSize:] + itemInDat := inDat + + // key + + var key internal.Key + n, err := binstruct.Unmarshal(keyInDat, &key) + require.NoError(t, err, "binstruct.Unmarshal(dat, &key)") + require.Equal(t, keySize, n, "binstruct.Unmarshal(dat, &key)") + + keyOutDat, err := binstruct.Marshal(key) + require.NoError(t, err, "binstruct.Marshal(key)") + require.Equal(t, keyInDat, keyOutDat, "binstruct.Marshal(key)") + + // sumtype + + var sumtype btrfssum.CSumType + n, err = binstruct.Unmarshal(sumtypeInDat, &sumtype) + require.NoError(t, err, "binstruct.Unmarshal(dat, &sumtype)") + require.Equal(t, sumtypeSize, n, "binstruct.Unmarshal(dat, &sumtype)") + + sumtypeOutDat, err := binstruct.Marshal(sumtype) + require.NoError(t, err, "binstruct.Marshal(sumtype)") + require.Equal(t, sumtypeInDat, sumtypeOutDat, "binstruct.Marshal(sumtype)") + + // item + + t.Logf("key=%v sumtype=%v dat=%q", key, sumtype, itemInDat) + + item := btrfsitem.UnmarshalItem(key, sumtype, itemInDat) + require.NotNil(t, item, "btrfsitem.UnmarshalItem") + + itemOutDat, err := binstruct.Marshal(item) + require.NoError(t, err, "binstruct.Marshal(item)") + require.Equal(t, string(itemInDat), string(itemOutDat), "binstruct.Marshal(item)") + }) +} |