mirror of
https://github.com/containers/skopeo.git
synced 2025-06-28 07:37:41 +00:00
Add tests for contextFromGlobalOptions
Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
parent
761a6811c1
commit
5dec940523
122
cmd/skopeo/utils_test.go
Normal file
122
cmd/skopeo/utils_test.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/containers/image/types"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"github.com/urfave/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
// fakeContext creates inputs for contextFromGlobalOptions.
|
||||||
|
// NOTE: This is QUITE FAKE; none of the urfave/cli normalization and the like happens.
|
||||||
|
func fakeContext(t *testing.T, cmdName string, globalFlags []string, cmdFlags []string) *cli.Context {
|
||||||
|
app := createApp()
|
||||||
|
|
||||||
|
globalSet := flag.NewFlagSet(app.Name, flag.ContinueOnError)
|
||||||
|
for _, f := range app.Flags {
|
||||||
|
f.Apply(globalSet)
|
||||||
|
}
|
||||||
|
err := globalSet.Parse(globalFlags)
|
||||||
|
require.NoError(t, err)
|
||||||
|
globalCtx := cli.NewContext(app, globalSet, nil)
|
||||||
|
|
||||||
|
cmd := app.Command(cmdName)
|
||||||
|
require.NotNil(t, cmd)
|
||||||
|
cmdSet := flag.NewFlagSet(cmd.Name, flag.ContinueOnError)
|
||||||
|
for _, f := range cmd.Flags {
|
||||||
|
f.Apply(cmdSet)
|
||||||
|
}
|
||||||
|
err = cmdSet.Parse(cmdFlags)
|
||||||
|
require.NoError(t, err)
|
||||||
|
return cli.NewContext(app, cmdSet, globalCtx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestContextFromGlobalOptions(t *testing.T) {
|
||||||
|
// FIXME: All of this only tests (skopeo copy --dest)
|
||||||
|
// FIXME FIXME: Apparently BoolT values are set to false if the flag is not declared for the specific subcommand!!
|
||||||
|
|
||||||
|
// Default state
|
||||||
|
c := fakeContext(t, "copy", []string{}, []string{})
|
||||||
|
res, err := contextFromGlobalOptions(c, "dest-")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, &types.SystemContext{}, res)
|
||||||
|
|
||||||
|
// Explicitly set everything to default, except for when the default is “not present”
|
||||||
|
c = fakeContext(t, "copy", []string{}, []string{
|
||||||
|
"--dest-compress=false",
|
||||||
|
})
|
||||||
|
res, err = contextFromGlobalOptions(c, "dest-")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, &types.SystemContext{}, res)
|
||||||
|
|
||||||
|
// Set everything to non-default values.
|
||||||
|
c = fakeContext(t, "copy", []string{
|
||||||
|
"--registries.d", "/srv/registries.d",
|
||||||
|
"--override-arch", "overridden-arch",
|
||||||
|
"--override-os", "overridden-os",
|
||||||
|
}, []string{
|
||||||
|
"--authfile", "/srv/authfile",
|
||||||
|
"--dest-cert-dir", "/srv/cert-dir",
|
||||||
|
"--dest-ostree-tmp-dir", "/srv/ostree-tmp-dir",
|
||||||
|
"--dest-shared-blob-dir", "/srv/shared-blob-dir",
|
||||||
|
"--dest-compress=true",
|
||||||
|
"--dest-daemon-host", "daemon-host.example.com",
|
||||||
|
"--dest-tls-verify=false",
|
||||||
|
"--dest-creds", "creds-user:creds-password",
|
||||||
|
})
|
||||||
|
res, err = contextFromGlobalOptions(c, "dest-")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, &types.SystemContext{
|
||||||
|
RegistriesDirPath: "/srv/registries.d",
|
||||||
|
AuthFilePath: "/srv/authfile",
|
||||||
|
ArchitectureChoice: "overridden-arch",
|
||||||
|
OSChoice: "overridden-os",
|
||||||
|
OCISharedBlobDirPath: "/srv/shared-blob-dir",
|
||||||
|
DockerCertPath: "/srv/cert-dir",
|
||||||
|
DockerInsecureSkipTLSVerify: true,
|
||||||
|
DockerAuthConfig: &types.DockerAuthConfig{Username: "creds-user", Password: "creds-password"},
|
||||||
|
OSTreeTmpDirPath: "/srv/ostree-tmp-dir",
|
||||||
|
DockerDaemonCertPath: "/srv/cert-dir",
|
||||||
|
DockerDaemonHost: "daemon-host.example.com",
|
||||||
|
DockerDaemonInsecureSkipTLSVerify: true,
|
||||||
|
DirForceCompress: true,
|
||||||
|
}, res)
|
||||||
|
|
||||||
|
// Global/per-command tlsVerify behavior
|
||||||
|
for _, c := range []struct {
|
||||||
|
global, cmd string
|
||||||
|
expectedDocker, expectedDockerDaemon bool
|
||||||
|
}{
|
||||||
|
{"", "", false, false},
|
||||||
|
{"", "false", true, true},
|
||||||
|
{"", "true", false, false},
|
||||||
|
{"false", "", true, false},
|
||||||
|
{"false", "false", true, true},
|
||||||
|
{"false", "true", false, false},
|
||||||
|
{"true", "", false, false},
|
||||||
|
{"true", "false", true, true},
|
||||||
|
{"true", "true", false, false},
|
||||||
|
} {
|
||||||
|
globalFlags := []string{}
|
||||||
|
if c.global != "" {
|
||||||
|
globalFlags = append(globalFlags, "--tls-verify="+c.global)
|
||||||
|
}
|
||||||
|
cmdFlags := []string{}
|
||||||
|
if c.cmd != "" {
|
||||||
|
cmdFlags = append(cmdFlags, "--dest-tls-verify="+c.cmd)
|
||||||
|
}
|
||||||
|
ctx := fakeContext(t, "copy", globalFlags, cmdFlags)
|
||||||
|
res, err = contextFromGlobalOptions(ctx, "dest-")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, c.expectedDocker, res.DockerInsecureSkipTLSVerify, "%#v", c)
|
||||||
|
assert.Equal(t, c.expectedDockerDaemon, res.DockerDaemonInsecureSkipTLSVerify, "%#v", c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid option values
|
||||||
|
c = fakeContext(t, "copy", []string{}, []string{"--dest-creds", ""})
|
||||||
|
_, err = contextFromGlobalOptions(c, "dest-")
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user