| package cliplugins |
| |
| import ( |
| "regexp" |
| "testing" |
| |
| "gotest.tools/v3/assert" |
| is "gotest.tools/v3/assert/cmp" |
| "gotest.tools/v3/icmd" |
| ) |
| |
| // TestGlobalHelp ensures correct behaviour when running `docker help` |
| func TestGlobalHelp(t *testing.T) { |
| run, _, cleanup := prepare(t) |
| defer cleanup() |
| |
| res := icmd.RunCmd(run("help")) |
| res.Assert(t, icmd.Expected{ |
| ExitCode: 0, |
| }) |
| assert.Assert(t, is.Equal(res.Stderr(), "")) |
| output := res.Stdout() |
| |
| // Instead of baking in the full current output of `docker |
| // help`, which can be expected to change regularly, bake in |
| // some checkpoints. Key things we are looking for: |
| // |
| // - The top-level description |
| // - Each of the main headings |
| // - Some builtin commands under the main headings |
| // - The `helloworld` plugin in the appropriate place |
| // - The `badmeta` plugin under the "Invalid Plugins" heading. |
| // |
| // Regexps are needed because the width depends on `unix.TIOCGWINSZ` or similar. |
| for _, s := range []string{ |
| `Management Commands:`, |
| `\s+container\s+Manage containers`, |
| `\s+helloworld\*\s+A basic Hello World plugin for tests`, |
| `\s+image\s+Manage images`, |
| `Commands:`, |
| `\s+create\s+Create a new container`, |
| `Invalid Plugins:`, |
| `\s+badmeta\s+invalid metadata: invalid character 'i' looking for beginning of object key string`, |
| } { |
| expected, err := regexp.Compile(`(?m)^` + s + `$`) |
| assert.NilError(t, err) |
| matches := expected.FindAllString(output, -1) |
| assert.Equal(t, len(matches), 1, "Did not find expected number of matches for %q in `docker help` output", expected) |
| } |
| |
| // Running with `--help` should produce the same. |
| t.Run("help_flag", func(t *testing.T) { |
| res2 := icmd.RunCmd(run("--help")) |
| res2.Assert(t, icmd.Expected{ |
| ExitCode: 0, |
| }) |
| assert.Assert(t, is.Equal(res2.Stdout(), output)) |
| assert.Assert(t, is.Equal(res2.Stderr(), "")) |
| }) |
| |
| // Running just `docker` (without `help` nor `--help`) should produce the same thing, except on Stderr. |
| t.Run("bare", func(t *testing.T) { |
| res2 := icmd.RunCmd(run()) |
| res2.Assert(t, icmd.Expected{ |
| ExitCode: 0, |
| }) |
| assert.Assert(t, is.Equal(res2.Stdout(), "")) |
| assert.Assert(t, is.Equal(res2.Stderr(), output)) |
| }) |
| |
| t.Run("badopt", func(t *testing.T) { |
| // Running `docker --badopt` should also produce the |
| // same thing, give or take the leading error message |
| // and a trailing carriage return (due to main() using |
| // Println in the error case). |
| res2 := icmd.RunCmd(run("--badopt")) |
| res2.Assert(t, icmd.Expected{ |
| ExitCode: 125, |
| }) |
| assert.Assert(t, is.Equal(res2.Stdout(), "")) |
| assert.Assert(t, is.Contains(res2.Stderr(), "unknown flag: --badopt")) |
| assert.Assert(t, is.Contains(res2.Stderr(), "Run 'docker --help' for more information")) |
| }) |
| } |