check / check (push) Waiting to run
Error messages in mfer/ and internal/cli/ are lowercase except names and acronyms, carry no "failed to" or command-name prefix, and each wrap names only the operation and thing the wrapped error does not already name, so a stacked message names what failed once. Wraps around errors that already name their operation and path (os and afero path errors, url.Error, the builder's path errors, the gpg helpers' own errors) are dropped. gpg's stderr is appended to a gpg failure, and to the error for a signing key gpg did not report, only when gpg wrote some. errHTTPStatus reads "unexpected HTTP status"; both inner-not-set sentinels read "inner message not set". No sentinel, errors.Is result or exit status changes. Model: opus-5-5
55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
//nolint:testpackage // white-box tests exercise unexported internals
|
|
package mfer
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
"uuid"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// An inner message whose version is not VERSION_ONE, whether version 0 or a
|
|
// later one, is refused with the same error as an outer message's.
|
|
func TestDeserializeRefusesUnknownInnerVersion(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for _, version := range []MFFile_Version{MFFile_VERSION_NONE, MFFile_VERSION_ONE + 1} {
|
|
t.Run(version.String(), func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
id := uuid.NewV4()
|
|
inner, err := proto.Marshal(&MFFile{Version: version, Uuid: id[:]})
|
|
require.NoError(t, err)
|
|
|
|
_, err = NewManifestFromReader(bytes.NewReader(wrapInner(t, id, inner)))
|
|
require.ErrorIs(t, err, errUnknownVersion)
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestReadAtMost gives readAtMost exactly its maximum, which it must
|
|
// return whole, and twice its maximum, which it must refuse after reading
|
|
// one byte past the maximum, and no more. NewManifestFromReader reads
|
|
// through it with MaxManifestSize; the test uses 64 KiB, since reading
|
|
// MaxManifestSize under the race detector takes gigabytes of memory.
|
|
func TestReadAtMost(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
const maxSize = 64 << 10
|
|
|
|
dat, err := readAtMost(bytes.NewReader(make([]byte, maxSize)), maxSize)
|
|
require.NoError(t, err)
|
|
assert.Len(t, dat, maxSize)
|
|
|
|
input := bytes.NewReader(make([]byte, 2*maxSize))
|
|
|
|
_, err = readAtMost(input, maxSize)
|
|
require.ErrorIs(t, err, errManifestTooLarge)
|
|
require.EqualError(t, err,
|
|
"file exceeds maximum allowed size of 65536 bytes")
|
|
assert.Equal(t, maxSize-1, input.Len(), "bytes left unread")
|
|
}
|