blob: da9d6fc507ec2e3886d9c16453394f920ce4765d [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 buflock_test
import (
"bytes"
"context"
"path/filepath"
"testing"
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/buflock"
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufmodule/bufmoduletesting"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/encoding"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/manifest"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/storage"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/storage/storagemem"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/storage/storageos"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestReadConfigV1Beta1(t *testing.T) {
t.Parallel()
testReadConfig(t, "v1beta1")
}
func TestReadConfigV1(t *testing.T) {
t.Parallel()
testReadConfig(t, "v1")
}
func testReadConfig(t *testing.T, version string) {
successConfig := &buflock.Config{
Dependencies: []buflock.Dependency{
{
Remote: "bufbuild.test",
Owner: "acme",
Repository: "weather",
Commit: "e9191fcdc2294e2f8f3b82c528fc90a8",
},
},
}
ctx := context.Background()
provider := storageos.NewProvider()
readBucket, err := provider.NewReadWriteBucket(filepath.Join("testdata", version, "success"))
require.NoError(t, err)
config, err := buflock.ReadConfig(ctx, readBucket)
require.NoError(t, err)
require.Equal(t, successConfig, config)
readBucket, err = provider.NewReadWriteBucket(filepath.Join("testdata", version, "failure"))
require.NoError(t, err)
_, err = buflock.ReadConfig(ctx, readBucket)
require.Error(t, err)
}
func TestWriteReadConfig(t *testing.T) {
t.Parallel()
tmpDir := t.TempDir()
readWriteBucket, err := storageos.NewProvider().NewReadWriteBucket(tmpDir)
require.NoError(t, err)
testConfig := &buflock.Config{
Dependencies: []buflock.Dependency{
{
Remote: "buf.build",
Owner: "test1",
Repository: "foob1",
Commit: bufmoduletesting.TestCommit,
},
{
Remote: "buf.build",
Owner: "test2",
Repository: "foob2",
Commit: bufmoduletesting.TestCommit,
},
},
}
err = buflock.WriteConfig(context.Background(), readWriteBucket, testConfig)
require.NoError(t, err)
readConfig, err := buflock.ReadConfig(context.Background(), readWriteBucket)
require.NoError(t, err)
require.Equal(t, testConfig, readConfig)
}
func TestWriteReadEmptyConfig(t *testing.T) {
t.Parallel()
tmpDir := t.TempDir()
readWriteBucket, err := storageos.NewProvider().NewReadWriteBucket(tmpDir)
require.NoError(t, err)
err = buflock.WriteConfig(context.Background(), readWriteBucket, &buflock.Config{})
require.NoError(t, err)
readConfig, err := buflock.ReadConfig(context.Background(), readWriteBucket)
require.NoError(t, err)
require.Equal(t, &buflock.Config{}, readConfig)
}
// TODO: Write fuzz tester for the invariant ReadConfig(WriteConfig(file)) == file.
func TestParseV1Beta1Config(t *testing.T) {
t.Parallel()
tmpDir := t.TempDir()
readWriteBucket, err := storageos.NewProvider().NewReadWriteBucket(tmpDir)
require.NoError(t, err)
testConfig := &buflock.Config{
Dependencies: []buflock.Dependency{
{
Remote: "buf.build",
Owner: "test1",
Repository: "foob1",
Commit: bufmoduletesting.TestCommit,
},
{
Remote: "buf.build",
Owner: "test2",
Repository: "foob2",
Commit: bufmoduletesting.TestCommit,
},
},
}
writeObjectCloser, err := readWriteBucket.Put(context.Background(), buflock.ExternalConfigFilePath)
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, writeObjectCloser.Close())
})
v1beta1Config := &buflock.ExternalConfigV1Beta1{
Deps: []buflock.ExternalConfigDependencyV1Beta1{
buflock.ExternalConfigDependencyV1Beta1ForDependency(testConfig.Dependencies[0]),
buflock.ExternalConfigDependencyV1Beta1ForDependency(testConfig.Dependencies[1]),
},
}
err = encoding.NewYAMLEncoder(writeObjectCloser).Encode(v1beta1Config)
require.NoError(t, err)
readConfig, err := buflock.ReadConfig(context.Background(), readWriteBucket)
require.NoError(t, err)
require.Equal(t, testConfig, readConfig)
}
func TestParseNoConfig(t *testing.T) {
t.Parallel()
emptyReadBucket := storagemem.NewReadWriteBucket()
readConfig, err := buflock.ReadConfig(context.Background(), emptyReadBucket)
require.NoError(t, err)
require.Empty(t, readConfig)
}
func TestParseIncompleteConfig(t *testing.T) {
t.Parallel()
tmpDir := t.TempDir()
readWriteBucket, err := storageos.NewProvider().NewReadWriteBucket(tmpDir)
require.NoError(t, err)
testConfig := &buflock.Config{
Dependencies: []buflock.Dependency{
{
Remote: "buf.build",
Owner: "test1",
Repository: "foob1",
Commit: bufmoduletesting.TestCommit,
},
},
}
configBytes, err := encoding.MarshalYAML(&buflock.ExternalConfigV1{
Version: buflock.V1Version,
Deps: []buflock.ExternalConfigDependencyV1{
buflock.ExternalConfigDependencyV1ForDependency(testConfig.Dependencies[0]),
},
})
require.NoError(t, err)
err = storage.PutPath(context.Background(), readWriteBucket, buflock.ExternalConfigFilePath, configBytes)
require.NoError(t, err)
readConfig, err := buflock.ReadConfig(context.Background(), readWriteBucket)
require.NoError(t, err)
require.Equal(t, testConfig, readConfig)
err = buflock.WriteConfig(context.Background(), readWriteBucket, readConfig)
require.NoError(t, err)
// And again after using the proper WriteConfig
readConfig, err = buflock.ReadConfig(context.Background(), readWriteBucket)
require.NoError(t, err)
require.Equal(t, testConfig, readConfig)
}
func TestDependencyForExternalConfigDependencyV1(t *testing.T) {
t.Parallel()
digester, err := manifest.NewDigester(manifest.DigestTypeShake256)
require.NoError(t, err)
nullDigest, err := digester.Digest(&bytes.Buffer{})
require.NoError(t, err)
testDependencyForExternalConfigDependencyV1(
t,
"typical",
buflock.ExternalConfigDependencyV1{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: nullDigest.String(),
},
buflock.Dependency{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: nullDigest.String(),
},
)
testDependencyForExternalConfigDependencyV1(
t,
"no digest",
buflock.ExternalConfigDependencyV1{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
},
buflock.Dependency{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
},
)
testDependencyForExternalConfigDependencyV1(
t,
"filter out b1 hash",
buflock.ExternalConfigDependencyV1{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: "b1-gLO3B_5ClhdU52w1gMOxk4GokvCoM1OqjarxMfjStGQ=",
},
buflock.Dependency{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
},
)
testDependencyForExternalConfigDependencyV1(
t,
"filter out b3 hash",
buflock.ExternalConfigDependencyV1{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: "b3-j7iu4iVzYQUFr97mbq2PNAlM5UjEnjtwEas0q7g4DVM",
},
buflock.Dependency{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
},
)
testDependencyForExternalConfigDependencyV1(
t,
"don't filter out non-b1/b3 invalid hashes",
buflock.ExternalConfigDependencyV1{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: "shake256:abcd",
},
buflock.Dependency{
Remote: "remote",
Owner: "owner",
Repository: "repository",
Commit: "aabbccd",
Digest: "shake256:abcd",
},
)
}
func testDependencyForExternalConfigDependencyV1(
t *testing.T,
desc string,
in buflock.ExternalConfigDependencyV1,
expect buflock.Dependency,
) {
t.Helper()
t.Run(desc, func(t *testing.T) {
t.Parallel()
actual := buflock.DependencyForExternalConfigDependencyV1(in)
assert.Equal(t, expect, actual)
})
}