Skip to content

Commit

Permalink
nydusify: add unit test for nydusify
Browse files Browse the repository at this point in the history
We had removed the tests files(e2e) in nydusify, we need add the unit tests
to improve test coverage.

Signed-off-by: Yadong Ding <ding_yadong@foxmail.com>
  • Loading branch information
Desiki-high committed Dec 22, 2023
1 parent c85b365 commit af8ef5b
Show file tree
Hide file tree
Showing 11 changed files with 747 additions and 22 deletions.
253 changes: 253 additions & 0 deletions contrib/nydusify/cmd/nydusify_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ package main

import (
"encoding/json"
"flag"
"os"
"testing"

"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"
)

func TestIsPossibleValue(t *testing.T) {
Expand All @@ -35,6 +37,12 @@ func TestAddReferenceSuffix(t *testing.T) {
_, err = addReferenceSuffix(source, suffix)
require.Error(t, err)
require.Contains(t, err.Error(), "invalid source image reference")

source = "localhost:5000/nginx:latest@sha256:757574c5a2102627de54971a0083d4ecd24eb48fdf06b234d063f19f7bbc22fb"
suffix = "-suffix"
_, err = addReferenceSuffix(source, suffix)
require.Error(t, err)
require.Contains(t, err.Error(), "unsupported digested image reference")
}

func TestParseBackendConfig(t *testing.T) {
Expand Down Expand Up @@ -65,4 +73,249 @@ func TestParseBackendConfig(t *testing.T) {
// Failure situation
_, err = parseBackendConfig(configJSON, file.Name())
require.Error(t, err)

_, err = parseBackendConfig("", "non-existent.json")
require.Error(t, err)
}

func TestGetBackendConfig(t *testing.T) {
app := &cli.App{
Flags: []cli.Flag{
&cli.StringFlag{
Name: "prefixbackend-type",
Value: "",
},
&cli.StringFlag{
Name: "prefixbackend-config",
Value: "",
},
&cli.StringFlag{
Name: "prefixbackend-config-file",
Value: "",
},
},
}
ctx := cli.NewContext(app, nil, nil)

backendType, backendConfig, err := getBackendConfig(ctx, "prefix", false)
require.NoError(t, err)
require.Empty(t, backendType)
require.Empty(t, backendConfig)

backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.Error(t, err)
require.Contains(t, err.Error(), "backend type is empty, please specify option")
require.Empty(t, backendType)
require.Empty(t, backendConfig)

flagSet := flag.NewFlagSet("test1", flag.PanicOnError)
flagSet.String("prefixbackend-type", "errType", "")
ctx = cli.NewContext(app, flagSet, nil)
backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.Error(t, err)
require.Contains(t, err.Error(), "backend-type should be one of")
require.Empty(t, backendType)
require.Empty(t, backendConfig)

flagSet = flag.NewFlagSet("test2", flag.PanicOnError)
flagSet.String("prefixbackend-type", "oss", "")
ctx = cli.NewContext(app, flagSet, nil)
backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.Error(t, err)
require.Contains(t, err.Error(), "backend configuration is empty, please specify option")
require.Empty(t, backendType)
require.Empty(t, backendConfig)

configJSON := `
{
"bucket_name": "test",
"endpoint": "region.oss.com",
"access_key_id": "testAK",
"access_key_secret": "testSK",
"meta_prefix": "meta",
"blob_prefix": "blob"
}`
require.True(t, json.Valid([]byte(configJSON)))

flagSet = flag.NewFlagSet("test3", flag.PanicOnError)
flagSet.String("prefixbackend-type", "oss", "")
flagSet.String("prefixbackend-config", configJSON, "")
ctx = cli.NewContext(app, flagSet, nil)
backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.NoError(t, err)
require.Equal(t, "oss", backendType)
require.Equal(t, configJSON, backendConfig)

file, err := os.CreateTemp("", "nydusify-backend-config-test.json")
require.NoError(t, err)
defer os.RemoveAll(file.Name())

_, err = file.WriteString(configJSON)
require.NoError(t, err)
file.Sync()

flagSet = flag.NewFlagSet("test4", flag.PanicOnError)
flagSet.String("prefixbackend-type", "oss", "")
flagSet.String("prefixbackend-config-file", file.Name(), "")
ctx = cli.NewContext(app, flagSet, nil)
backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.NoError(t, err)
require.Equal(t, "oss", backendType)
require.Equal(t, configJSON, backendConfig)

flagSet = flag.NewFlagSet("test5", flag.PanicOnError)
flagSet.String("prefixbackend-type", "oss", "")
flagSet.String("prefixbackend-config", configJSON, "")
flagSet.String("prefixbackend-config-file", file.Name(), "")
ctx = cli.NewContext(app, flagSet, nil)
backendType, backendConfig, err = getBackendConfig(ctx, "prefix", true)
require.Error(t, err)
require.Contains(t, err.Error(), "--backend-config conflicts with --backend-config-file")
require.Empty(t, backendType)
require.Empty(t, backendConfig)
}

func TestGetTargetReference(t *testing.T) {
app := &cli.App{
Flags: []cli.Flag{
&cli.StringFlag{
Name: "target",
Value: "",
},
&cli.StringFlag{
Name: "target-suffix",
Value: "",
},
&cli.StringFlag{
Name: "source",
Value: "",
},
},
}
ctx := cli.NewContext(app, nil, nil)

target, err := getTargetReference(ctx)
require.Error(t, err)
require.Contains(t, err.Error(), "--target or --target-suffix is required")
require.Empty(t, target)

flagSet := flag.NewFlagSet("test1", flag.PanicOnError)
flagSet.String("target", "testTarget", "")
flagSet.String("target-suffix", "testSuffix", "")
ctx = cli.NewContext(app, flagSet, nil)
target, err = getTargetReference(ctx)
require.Error(t, err)
require.Contains(t, err.Error(), "-target conflicts with --target-suffix")
require.Empty(t, target)

flagSet = flag.NewFlagSet("test2", flag.PanicOnError)
flagSet.String("target-suffix", "-nydus", "")
flagSet.String("source", "localhost:5000/nginx:latest", "")
ctx = cli.NewContext(app, flagSet, nil)
target, err = getTargetReference(ctx)
require.NoError(t, err)
require.Equal(t, "localhost:5000/nginx:latest-nydus", target)

flagSet = flag.NewFlagSet("test3", flag.PanicOnError)
flagSet.String("target-suffix", "-nydus", "")
flagSet.String("source", "localhost:5000\nginx:latest", "")
ctx = cli.NewContext(app, flagSet, nil)
target, err = getTargetReference(ctx)
require.Error(t, err)
require.Contains(t, err.Error(), "invalid source image reference")
require.Empty(t, target)

flagSet = flag.NewFlagSet("test4", flag.PanicOnError)
flagSet.String("target", "testTarget", "")
ctx = cli.NewContext(app, flagSet, nil)
target, err = getTargetReference(ctx)
require.NoError(t, err)
require.Equal(t, "testTarget", target)
}

func TestGetCacheReferencet(t *testing.T) {
app := &cli.App{
Flags: []cli.Flag{
&cli.StringFlag{
Name: "build-cache",
Value: "",
},
&cli.StringFlag{
Name: "build-cache-tag",
Value: "",
},
},
}
ctx := cli.NewContext(app, nil, nil)

cache, err := getCacheReference(ctx, "")
require.NoError(t, err)
require.Empty(t, cache)

flagSet := flag.NewFlagSet("test1", flag.PanicOnError)
flagSet.String("build-cache", "cache", "")
flagSet.String("build-cache-tag", "cacheTag", "")
ctx = cli.NewContext(app, flagSet, nil)
cache, err = getCacheReference(ctx, "")
require.Error(t, err)
require.Contains(t, err.Error(), "--build-cache conflicts with --build-cache-tag")
require.Empty(t, cache)

flagSet = flag.NewFlagSet("test2", flag.PanicOnError)
flagSet.String("build-cache-tag", "cacheTag", "errTarget")
ctx = cli.NewContext(app, flagSet, nil)
cache, err = getCacheReference(ctx, "")
require.Error(t, err)
require.Contains(t, err.Error(), "invalid target image reference: invalid reference format")
require.Empty(t, cache)

flagSet = flag.NewFlagSet("test2", flag.PanicOnError)
flagSet.String("build-cache-tag", "latest-cache", "")
ctx = cli.NewContext(app, flagSet, nil)
cache, err = getCacheReference(ctx, "localhost:5000/nginx:latest")
require.NoError(t, err)
require.Equal(t, "localhost:5000/nginx:latest-cache", cache)
}

func TestGetPrefetchPatterns(t *testing.T) {
app := &cli.App{
Flags: []cli.Flag{
&cli.StringFlag{
Name: "prefetch-dir",
Value: "",
},
&cli.BoolFlag{
Name: "prefetch-patterns",
Value: false,
},
},
}
ctx := cli.NewContext(app, nil, nil)

patterns, err := getPrefetchPatterns(ctx)
require.NoError(t, err)
require.Equal(t, "/", patterns)

flagSet := flag.NewFlagSet("test1", flag.PanicOnError)
flagSet.String("prefetch-dir", "/etc/passwd", "")
ctx = cli.NewContext(app, flagSet, nil)
patterns, err = getPrefetchPatterns(ctx)
require.NoError(t, err)
require.Equal(t, "/etc/passwd", patterns)

flagSet = flag.NewFlagSet("test2", flag.PanicOnError)
flagSet.String("prefetch-dir", "/etc/passwd", "")
flagSet.Bool("prefetch-patterns", true, "")
ctx = cli.NewContext(app, flagSet, nil)
patterns, err = getPrefetchPatterns(ctx)
require.Error(t, err)
require.Contains(t, err.Error(), "--prefetch-dir conflicts with --prefetch-patterns")
require.Empty(t, patterns)

flagSet = flag.NewFlagSet("test3", flag.PanicOnError)
flagSet.Bool("prefetch-patterns", true, "")
ctx = cli.NewContext(app, flagSet, nil)
patterns, err = getPrefetchPatterns(ctx)
require.NoError(t, err)
require.Equal(t, "/", patterns)
}
62 changes: 62 additions & 0 deletions contrib/nydusify/pkg/backend/backend_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package backend

import (
"encoding/json"
"testing"

"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/provider"
"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/utils"
"github.com/stretchr/testify/require"
)

func TestBlobDesc(t *testing.T) {
desc := blobDesc(123456, "205eed24cbec29ad9cb4593a73168ef1803402370a82f7d51ce25646fc2f943a")
require.Equal(t, int64(123456), desc.Size)
require.Equal(t, "sha256:205eed24cbec29ad9cb4593a73168ef1803402370a82f7d51ce25646fc2f943a", desc.Digest.String())
require.Equal(t, utils.MediaTypeNydusBlob, desc.MediaType)
require.Equal(t, map[string]string{
utils.LayerAnnotationUncompressed: "sha256:205eed24cbec29ad9cb4593a73168ef1803402370a82f7d51ce25646fc2f943a",
utils.LayerAnnotationNydusBlob: "true",
}, desc.Annotations)
}

func TestNewBackend(t *testing.T) {
ossConfigJSON := `
{
"bucket_name": "test",
"endpoint": "region.oss.com",
"access_key_id": "testAK",
"access_key_secret": "testSK",
"object_prefix": "blob"
}`
require.True(t, json.Valid([]byte(ossConfigJSON)))
backend, err := NewBackend("oss", []byte(ossConfigJSON), nil)
require.NoError(t, err)
require.Equal(t, OssBackend, backend.Type())

s3ConfigJSON := `
{
"bucket_name": "test",
"endpoint": "s3.amazonaws.com",
"access_key_id": "testAK",
"access_key_secret": "testSK",
"object_prefix": "blob",
"scheme": "https",
"region": "region1"
}`
require.True(t, json.Valid([]byte(s3ConfigJSON)))
backend, err = NewBackend("s3", []byte(s3ConfigJSON), nil)
require.NoError(t, err)
require.Equal(t, S3backend, backend.Type())

testRegistryRemote, err := provider.DefaultRemote("test", false)
require.NoError(t, err)
backend, err = NewBackend("registry", nil, testRegistryRemote)
require.NoError(t, err)
require.Equal(t, RegistryBackend, backend.Type())

backend, err = NewBackend("errBackend", nil, testRegistryRemote)
require.Error(t, err)
require.Contains(t, err.Error(), "unsupported backend type")
require.Nil(t, backend)
}
Loading

0 comments on commit af8ef5b

Please sign in to comment.