blob: 5c8567ae675f6e6e7f94b898fe775818ffef79f8 [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 bufmanifest_test
import (
"bytes"
"context"
"testing"
)
import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufmanifest"
modulev1alpha1 "github.com/apache/dubbo-kubernetes/pkg/bufman/gen/proto/go/module/v1alpha1"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/manifest"
)
func TestDigestFromProtoDigest(t *testing.T) {
t.Parallel()
const (
fileContent = "one line\nanother line\nyet another one\n"
)
digestFromContent, err := manifest.NewDigestFromBytes(
manifest.DigestTypeShake256,
mustDigestShake256(t, []byte(fileContent)).Bytes(),
)
require.NoError(t, err)
assert.Equal(t, manifest.DigestTypeShake256, digestFromContent.Type())
protoDigest := modulev1alpha1.Digest{
DigestType: modulev1alpha1.DigestType_DIGEST_TYPE_SHAKE256,
Digest: digestFromContent.Bytes(),
}
digest, err := bufmanifest.NewDigestFromProtoDigest(&protoDigest)
require.NoError(t, err)
assert.Equal(t, digestFromContent.String(), digest.String())
}
func TestNewDigestFromProtoDigest(t *testing.T) {
t.Parallel()
digest := mustDigestShake256(t, []byte("my content"))
retDigest, err := bufmanifest.NewDigestFromProtoDigest(&modulev1alpha1.Digest{
DigestType: modulev1alpha1.DigestType_DIGEST_TYPE_SHAKE256,
Digest: digest.Bytes(),
})
require.NoError(t, err)
assert.True(t, digest.Equal(*retDigest))
}
func TestInvalidNewDigestFromProtoDigest(t *testing.T) {
t.Parallel()
_, err := bufmanifest.NewDigestFromProtoDigest(nil)
assert.Error(t, err)
_, err = bufmanifest.NewDigestFromProtoDigest(&modulev1alpha1.Digest{
DigestType: modulev1alpha1.DigestType_DIGEST_TYPE_UNSPECIFIED,
})
assert.Error(t, err)
_, err = bufmanifest.NewDigestFromProtoDigest(&modulev1alpha1.Digest{
DigestType: modulev1alpha1.DigestType_DIGEST_TYPE_SHAKE256,
Digest: []byte("invalid digest"),
})
assert.Error(t, err)
}
func TestProtoBlob(t *testing.T) {
t.Parallel()
content := []byte("hello world")
digester, err := manifest.NewDigester(manifest.DigestTypeShake256)
require.NoError(t, err)
digest, err := digester.Digest(bytes.NewReader(content))
require.NoError(t, err)
blob, err := manifest.NewMemoryBlob(*digest, content)
require.NoError(t, err)
ctx := context.Background()
protoBlob, err := bufmanifest.AsProtoBlob(ctx, blob)
require.NoError(t, err)
rtBlob, err := bufmanifest.NewBlobFromProto(protoBlob)
require.NoError(t, err)
equal, err := manifest.BlobEqual(ctx, blob, rtBlob)
require.NoError(t, err)
assert.True(t, equal)
}
func TestBlobFromReader(t *testing.T) {
t.Parallel()
testBlobFromReader(
t,
[]byte("hello"),
[]byte{
0x12, 0x34, 0x07, 0x5a, 0xe4, 0xa1, 0xe7, 0x73, 0x16, 0xcf, 0x2d,
0x80, 0x00, 0x97, 0x45, 0x81, 0xa3, 0x43, 0xb9, 0xeb, 0xbc, 0xa7,
0xe3, 0xd1, 0xdb, 0x83, 0x39, 0x4c, 0x30, 0xf2, 0x21, 0x62, 0x6f,
0x59, 0x4e, 0x4f, 0x0d, 0xe6, 0x39, 0x02, 0x34, 0x9a, 0x5e, 0xa5,
0x78, 0x12, 0x13, 0x21, 0x58, 0x13, 0x91, 0x9f, 0x92, 0xa4, 0xd8,
0x6d, 0x12, 0x74, 0x66, 0xe3, 0xd0, 0x7e, 0x8b, 0xe3,
},
)
}
func testBlobFromReader(t *testing.T, content []byte, digest []byte) {
t.Helper()
blob, err := manifest.NewMemoryBlobFromReader(bytes.NewReader(content))
require.NoError(t, err)
protoBlob, err := bufmanifest.AsProtoBlob(context.Background(), blob)
require.NoError(t, err)
expect := &modulev1alpha1.Blob{
Digest: &modulev1alpha1.Digest{
DigestType: modulev1alpha1.DigestType_DIGEST_TYPE_SHAKE256,
Digest: digest,
},
Content: content,
}
assert.Equal(t, expect, protoBlob)
}
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
}