mirror of
https://github.com/filecoin-project/lotus.git
synced 2025-05-17 23:28:23 +08:00

Automatically detect if genesis CAR is compressed When `--genesis` path is set, automatically detect if the genesis file is ZSTD compressed and decompress it.
110 lines
2.6 KiB
Go
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
|
|
}
|