check / check (push) Waiting to run
Nothing goes in the 1.0 manifest that 1.0 does not read or write, and mfer never wrote either field. mf.proto now reserves the numbers 301 and 303 and both names in MFFilePath, and mf.pb.go is regenerated. The decoded-size check counts only file entries, hashes and timestamps, and counts a file entry, 16 bytes smaller without the two fields, at 160 bytes. export prints no ctime, and FileEntry loses the Ctime nothing set. FORMAT.md and the README no longer describe either field. The test of entries that decode too large gives each entry a second, empty hash: an entry with one hash and a modification time can no longer reach 8 times its size. Model: opus-5-5
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package mfer_test
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
"sneak.berlin/go/mfer/mfer"
|
|
)
|
|
|
|
// mf.pb.go is generated from mf.proto and committed. `make generate`
|
|
// records the hash of the mf.proto it generated from in mf.proto.sha256.
|
|
func TestGeneratedCodeMatchesProto(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
proto, err := os.ReadFile("mf.proto")
|
|
require.NoError(t, err)
|
|
|
|
recorded, err := os.ReadFile("mf.proto.sha256")
|
|
require.NoError(t, err)
|
|
|
|
recordedHash, _, _ := strings.Cut(string(recorded), " ")
|
|
sum := sha256.Sum256(proto)
|
|
require.Equal(t, recordedHash, hex.EncodeToString(sum[:]),
|
|
"mfer/mf.proto has changed since mfer/mf.pb.go was generated "+
|
|
"from it: run `make generate` and commit the result")
|
|
}
|
|
|
|
// A file entry has exactly the fields docs/FORMAT.md lists for MFFilePath.
|
|
func TestFileEntryFieldsMatchSpec(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
want := map[string]protoreflect.FieldNumber{
|
|
"path": 1,
|
|
"size": 2,
|
|
"hashes": 3,
|
|
"mtime": 302,
|
|
"mode": 304,
|
|
}
|
|
|
|
got := map[string]protoreflect.FieldNumber{}
|
|
|
|
fields := (&mfer.MFFilePath{}).ProtoReflect().Descriptor().Fields()
|
|
for i := range fields.Len() {
|
|
got[string(fields.Get(i).Name())] = fields.Get(i).Number()
|
|
}
|
|
|
|
require.Equal(t, want, got)
|
|
}
|
|
|
|
// A file entry reserves the numbers 301 and 303 and the names mimeType and
|
|
// ctime, as docs/FORMAT.md says, so that no field can take them.
|
|
func TestFileEntryReservesMIMETypeAndCtime(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
desc := (&mfer.MFFilePath{}).ProtoReflect().Descriptor()
|
|
|
|
assert.True(t, desc.ReservedRanges().Has(301))
|
|
assert.True(t, desc.ReservedRanges().Has(303))
|
|
assert.True(t, desc.ReservedNames().Has("mimeType"))
|
|
assert.True(t, desc.ReservedNames().Has("ctime"))
|
|
}
|