147 lines
3.8 KiB
Go
147 lines
3.8 KiB
Go
//go:build !remote
|
|
|
|
package libimage
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/containers/common/pkg/config"
|
|
"github.com/containers/image/v5/types"
|
|
"github.com/containers/storage"
|
|
"github.com/containers/storage/pkg/reexec"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
if reexec.Init() {
|
|
return
|
|
}
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
type testNewRuntimeOptions struct {
|
|
registriesConfPath string
|
|
}
|
|
|
|
// Create a new Runtime that can be used for testing.
|
|
func testNewRuntime(t *testing.T, options ...testNewRuntimeOptions) *Runtime {
|
|
workdir := t.TempDir()
|
|
storeOptions := &storage.StoreOptions{
|
|
RunRoot: workdir,
|
|
GraphRoot: workdir,
|
|
GraphDriverName: "vfs",
|
|
}
|
|
|
|
// Make sure that the tests do not use the host's registries.conf.
|
|
systemContext := &types.SystemContext{
|
|
SystemRegistriesConfPath: "testdata/registries.conf",
|
|
SystemRegistriesConfDirPath: "/dev/null",
|
|
}
|
|
|
|
if len(options) == 1 && options[0].registriesConfPath != "" {
|
|
systemContext.SystemRegistriesConfPath = options[0].registriesConfPath
|
|
}
|
|
|
|
runtime, err := RuntimeFromStoreOptions(&RuntimeOptions{SystemContext: systemContext}, storeOptions)
|
|
require.NoError(t, err)
|
|
tmpd, err := tmpdir()
|
|
require.NoError(t, err)
|
|
require.Equal(t, runtime.systemContext.BigFilesTemporaryDir, tmpd)
|
|
|
|
t.Cleanup(func() { _ = runtime.Shutdown(true) })
|
|
|
|
sys := runtime.SystemContext()
|
|
require.NotNil(t, sys)
|
|
return runtime
|
|
}
|
|
|
|
func testRuntimePullImage(t *testing.T, r *Runtime, ctx context.Context, imageName string) {
|
|
pullOptions := &PullOptions{}
|
|
pullOptions.Writer = os.Stdout
|
|
_, err := r.Pull(ctx, imageName, config.PullPolicyMissing, pullOptions)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestTmpdir(t *testing.T) {
|
|
tmpStr := "TMPDIR"
|
|
confStr := "CONTAINERS_CONF"
|
|
|
|
t.Run(confStr, func(t *testing.T) {
|
|
// Note, Cleanup() must be called before Setenv() so it only
|
|
// runs after the Setenv() cleanup reset the env again.
|
|
t.Cleanup(func() {
|
|
_, err := config.Reload()
|
|
require.NoError(t, err)
|
|
})
|
|
t.Setenv(confStr, "testdata/containers.conf")
|
|
|
|
_, err := config.Reload()
|
|
require.NoError(t, err)
|
|
|
|
tmpd, err := tmpdir()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "/tmp/from/containers.conf", tmpd)
|
|
})
|
|
|
|
t.Run(tmpStr, func(t *testing.T) {
|
|
t.Setenv(tmpStr, "/tmp/test")
|
|
tmpd, err := tmpdir()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "/tmp/test", tmpd)
|
|
|
|
os.Unsetenv(tmpStr)
|
|
tmpd, err = tmpdir()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "/var/tmp", tmpd)
|
|
})
|
|
}
|
|
|
|
func TestRuntimeListImagesAllImages(t *testing.T) {
|
|
runtime := testNewRuntime(t)
|
|
ctx := context.Background()
|
|
|
|
// Prefetch alpine, busybox.
|
|
testRuntimePullImage(t, runtime, ctx, "quay.io/libpod/alpine:latest")
|
|
testRuntimePullImage(t, runtime, ctx, "quay.io/libpod/busybox:latest")
|
|
|
|
images, err := runtime.ListImages(ctx, nil)
|
|
require.NoError(t, err)
|
|
|
|
require.Len(t, images, 2)
|
|
var image_names []string
|
|
for _, i := range images {
|
|
image_names = append(image_names, i.Names()...)
|
|
}
|
|
assert.ElementsMatch(t,
|
|
image_names,
|
|
[]string{"quay.io/libpod/alpine:latest", "quay.io/libpod/busybox:latest"},
|
|
)
|
|
}
|
|
|
|
func TestRuntimeListImagesByNames(t *testing.T) {
|
|
runtime := testNewRuntime(t)
|
|
ctx := context.Background()
|
|
|
|
// Prefetch alpine, busybox.
|
|
testRuntimePullImage(t, runtime, ctx, "quay.io/libpod/alpine:latest")
|
|
testRuntimePullImage(t, runtime, ctx, "quay.io/libpod/busybox:latest")
|
|
|
|
for _, test := range []struct {
|
|
name string
|
|
fullName string
|
|
}{
|
|
{"alpine", "quay.io/libpod/alpine:latest"},
|
|
{"busybox", "quay.io/libpod/busybox:latest"},
|
|
} {
|
|
images, err := runtime.ListImagesByNames([]string{test.name})
|
|
require.NoError(t, err)
|
|
require.Len(t, images, 1)
|
|
require.Contains(t, images[0].Names(), test.fullName)
|
|
}
|
|
_, err := runtime.ListImagesByNames([]string{""})
|
|
require.Error(t, err)
|
|
}
|