Files
lotus/build/genesis_test.go
Masih H. Derkani 48d0ab25a4 feat: automatically detect if genesis CAR is compressed (#12885)
Automatically detect if genesis CAR is compressed

When `--genesis` path is set, automatically detect if the genesis file
is ZSTD compressed and decompress it.
2025-02-11 10:20:29 +00:00

110 lines
2.6 KiB
Go

package build_test
import (
"bytes"
"errors"
"io"
"os"
"testing"
"github.com/klauspost/compress/zstd"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/lotus/build"
)
func TestGenesis(t *testing.T) {
for _, test := range []struct {
path string
}{
{path: "genesis/butterflynet.car.zst"},
{path: "genesis/calibnet.car.zst"},
{path: "genesis/interopnet.car.zst"},
{path: "genesis/mainnet.car.zst"},
} {
t.Run(test.path, func(t *testing.T) {
subject, err := os.Open(test.path)
require.NoError(t, err)
gotIsCompressed, err := build.IsZstdCompressed(subject)
require.NoError(t, err)
require.True(t, gotIsCompressed)
gotDecompressed, err := build.DecompressAsZstd(subject)
require.NoError(t, err)
require.NotEmpty(t, gotDecompressed)
gotIsCompressed, err = build.IsZstdCompressed(bytes.NewReader(gotDecompressed))
require.NoError(t, err)
require.False(t, gotIsCompressed)
})
}
}
func TestGenesis_ZstdCheck(t *testing.T) {
for _, test := range []struct {
name string
given func(t *testing.T) io.ReadSeeker
wantCompressed bool
wantErr bool
}{
{
name: "arbitraryLongEnough",
given: func(t *testing.T) io.ReadSeeker {
return bytes.NewReader([]byte("fish"))
},
},
{
name: "arbitraryShort",
given: func(t *testing.T) io.ReadSeeker {
return bytes.NewReader([]byte("🐠"))
},
},
{
name: "arbitraryZstdCompressed",
given: func(t *testing.T) io.ReadSeeker {
var buf bytes.Buffer
writer, err := zstd.NewWriter(&buf)
require.NoError(t, err)
written, err := writer.Write([]byte("fish"))
require.NoError(t, err)
require.NotZero(t, written)
require.NoError(t, writer.Close())
return bytes.NewReader(buf.Bytes())
},
wantCompressed: true,
},
{
name: "failingPositionReset",
given: func(t *testing.T) io.ReadSeeker { return failOnSeekStart{} },
wantErr: true,
},
} {
t.Run(test.name, func(t *testing.T) {
target := test.given(t)
gotCompressed, gotErr := build.IsZstdCompressed(target)
require.Equal(t, test.wantCompressed, gotCompressed)
require.Equal(t, test.wantErr, gotErr != nil)
if !test.wantErr {
gotPosition, err := target.Seek(0, io.SeekCurrent)
require.NoError(t, err)
require.Zero(t, gotPosition)
}
})
}
}
var _ io.ReadSeeker = (*failOnSeekStart)(nil)
type failOnSeekStart struct{}
func (failOnSeekStart) Read([]byte) (int, error) { return 0, nil }
func (failOnSeekStart) Seek(_ int64, whence int) (int64, error) {
if whence == io.SeekStart {
return 0, errors.New("pursue the horizon; forsake the dawn; the start is long gone")
}
return 0, nil
}