blob: f5296242fae9302346f077c5d80e3974808c4679 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package manifest_test
import (
"bytes"
"errors"
"fmt"
"strings"
"testing"
"testing/iotest"
)
import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/manifest"
)
func TestNewDigestBytes(t *testing.T) {
t.Parallel()
testInvalidDigestBytes(
t,
"empty",
"",
mustDigestShake256(t, nil).Bytes(),
)
testInvalidDigestBytes(
t,
"unsupported digest type",
"md5",
mustDigestShake256(t, nil).Bytes(),
)
testInvalidDigestBytes(
t,
"invalid digest",
manifest.DigestTypeShake256,
nil,
)
testInvalidDigestBytes(
t,
"invalid digest",
manifest.DigestTypeShake256,
mustDigestShake256(t, nil).Bytes()[:10],
)
}
func TestNewDigestHex(t *testing.T) {
t.Parallel()
testInvalidDigestHex(
t,
"empty",
"",
mustDigestShake256(t, nil).Hex(),
)
testInvalidDigestHex(
t,
"unsupported digest type",
"md5",
mustDigestShake256(t, nil).Hex(),
)
testInvalidDigestHex(
t,
"invalid digest",
manifest.DigestTypeShake256,
"",
)
testInvalidDigestHex(
t,
"encoding/hex",
manifest.DigestTypeShake256,
"not-a_hex/string",
)
testInvalidDigestHex(
t,
"invalid digest",
manifest.DigestTypeShake256,
mustDigestShake256(t, nil).Hex()[:10],
)
}
func TestNewDigestString(t *testing.T) {
t.Parallel()
testInvalidDigestString(
t,
"malformed",
"",
)
testInvalidDigestString(
t,
"malformed",
"foo",
)
testInvalidDigestString(
t,
"malformed",
"shake256 foo",
)
testInvalidDigestString(
t,
"encoding/hex",
"shake256:_",
)
validDigest := mustDigestShake256(t, nil)
testInvalidDigestString(
t,
"invalid digest",
fmt.Sprintf("%s:%s", validDigest.Type(), validDigest.Hex()[:10]),
)
testInvalidDigestString(
t,
"unsupported digest type",
fmt.Sprintf("md5:%s", validDigest.Hex()),
)
}
func TestNewDigester(t *testing.T) {
t.Parallel()
digester, err := manifest.NewDigester(manifest.DigestTypeShake256)
require.NoError(t, err)
require.NotNil(t, digester)
digester, err = manifest.NewDigester("some unrecognized digest type")
require.Error(t, err)
require.Nil(t, digester)
}
func TestDigesterDigest(t *testing.T) {
t.Parallel()
digester, err := manifest.NewDigester(manifest.DigestTypeShake256)
require.NoError(t, err)
digest, err := digester.Digest(strings.NewReader("some content"))
require.NoError(t, err)
assert.Equal(t, manifest.DigestTypeShake256, digest.Type())
assert.NotEmpty(t, digest.Bytes())
assert.NotEmpty(t, digest.String())
// failing digesting content
expectedErr := errors.New("testing error")
digest, err = digester.Digest(iotest.ErrReader(expectedErr))
assert.ErrorIs(t, err, expectedErr)
assert.Nil(t, digest)
}
func TestEqualDigests(t *testing.T) {
t.Parallel()
const fileContent = "one line\nanother line\nyet another one\n"
d1 := mustDigestShake256(t, []byte(fileContent))
d2 := mustDigestShake256(t, []byte(fileContent))
d3 := mustDigestShake256(t, []byte("some other content"))
assert.True(t, d1.Equal(*d2))
assert.True(t, d2.Equal(*d1))
assert.False(t, d1.Equal(*d3))
}
func mustDigestShake256(t *testing.T, content []byte) *manifest.Digest {
digester, err := manifest.NewDigester(manifest.DigestTypeShake256)
require.NoError(t, err)
require.NotNil(t, digester)
digest, err := digester.Digest(bytes.NewReader(content))
require.NoError(t, err)
return digest
}
func testInvalidDigestString(
t *testing.T,
desc string,
digest string,
) {
t.Helper()
t.Run(desc, func(t *testing.T) {
t.Parallel()
_, err := manifest.NewDigestFromString(digest)
assert.ErrorContains(t, err, desc)
})
}
func testInvalidDigestHex(
t *testing.T,
desc string,
dtype manifest.DigestType,
hexstr string,
) {
t.Helper()
t.Run(desc, func(t *testing.T) {
t.Parallel()
_, err := manifest.NewDigestFromHex(dtype, hexstr)
assert.ErrorContains(t, err, desc)
})
}
func testInvalidDigestBytes(
t *testing.T,
desc string,
dtype manifest.DigestType,
digest []byte,
) {
t.Helper()
t.Run(desc, func(t *testing.T) {
t.Parallel()
_, err := manifest.NewDigestFromBytes(dtype, digest)
assert.ErrorContains(t, err, desc)
})
}