automation-tests/common/libimage/runtime_test.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)
}