|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "flag" |
| 5 | + "os" |
| 6 | + "strings" |
| 7 | + "testing" |
| 8 | + |
| 9 | + "github.com/prometheus/client_golang/prometheus" |
| 10 | + |
| 11 | + "github.com/grafana/phlare/pkg/test" |
| 12 | +) |
| 13 | + |
| 14 | +func TestFlagParsing(t *testing.T) { |
| 15 | + for name, tc := range map[string]struct { |
| 16 | + arguments []string |
| 17 | + stdoutMessage string // string that must be included in stdout |
| 18 | + stderrMessage string // string that must be included in stderr |
| 19 | + stdoutExcluded string // string that must NOT be included in stdout |
| 20 | + stderrExcluded string // string that must NOT be included in stderr |
| 21 | + }{ |
| 22 | + "help-short": { |
| 23 | + arguments: []string{"-h"}, |
| 24 | + stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. |
| 25 | + stderrExcluded: "Usage of", |
| 26 | + }, |
| 27 | + "help": { |
| 28 | + arguments: []string{"-help"}, |
| 29 | + stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. |
| 30 | + stderrExcluded: "Usage of", |
| 31 | + }, |
| 32 | + "help-all": { |
| 33 | + arguments: []string{"-help-all"}, |
| 34 | + stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. |
| 35 | + stderrExcluded: "Usage of", |
| 36 | + }, |
| 37 | + "user visible module listing": { |
| 38 | + arguments: []string{"-modules"}, |
| 39 | + stdoutMessage: "ingester *\n", |
| 40 | + stderrExcluded: "ingester\n", |
| 41 | + }, |
| 42 | + "version": { |
| 43 | + arguments: []string{"-version"}, |
| 44 | + stdoutMessage: "phlare, version", |
| 45 | + stderrExcluded: "phlare, version", |
| 46 | + }, |
| 47 | + } { |
| 48 | + t.Run(name, func(t *testing.T) { |
| 49 | + _ = os.Setenv("TARGET", "ingester") |
| 50 | + oldDefaultRegistry := prometheus.DefaultRegisterer |
| 51 | + defer func() { |
| 52 | + prometheus.DefaultRegisterer = oldDefaultRegistry |
| 53 | + }() |
| 54 | + // We need to reset the default registry to avoid |
| 55 | + // "duplicate metrics collector registration attempted" errors. |
| 56 | + prometheus.DefaultRegisterer = prometheus.NewRegistry() |
| 57 | + testSingle(t, tc.arguments, tc.stdoutMessage, tc.stderrMessage, tc.stdoutExcluded, tc.stderrExcluded) |
| 58 | + }) |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +func testSingle(t *testing.T, arguments []string, stdoutMessage, stderrMessage, stdoutExcluded, stderrExcluded string) { |
| 63 | + t.Helper() |
| 64 | + oldArgs, oldStdout, oldStderr := os.Args, os.Stdout, os.Stderr |
| 65 | + restored := false |
| 66 | + restoreIfNeeded := func() { |
| 67 | + if restored { |
| 68 | + return |
| 69 | + } |
| 70 | + os.Stdout = oldStdout |
| 71 | + os.Stderr = oldStderr |
| 72 | + os.Args = oldArgs |
| 73 | + restored = true |
| 74 | + } |
| 75 | + defer restoreIfNeeded() |
| 76 | + |
| 77 | + arguments = append([]string{"./phlare"}, arguments...) |
| 78 | + |
| 79 | + os.Args = arguments |
| 80 | + co := test.CaptureOutput(t) |
| 81 | + |
| 82 | + // reset default flags |
| 83 | + flag.CommandLine = flag.NewFlagSet(arguments[0], flag.ExitOnError) |
| 84 | + |
| 85 | + main() |
| 86 | + |
| 87 | + stdout, stderr := co.Done() |
| 88 | + |
| 89 | + // Restore stdout and stderr before reporting errors to make them visible. |
| 90 | + restoreIfNeeded() |
| 91 | + if !strings.Contains(stdout, stdoutMessage) { |
| 92 | + t.Errorf("Expected on stdout: %q, stdout: %s\n", stdoutMessage, stdout) |
| 93 | + } |
| 94 | + if !strings.Contains(stderr, stderrMessage) { |
| 95 | + t.Errorf("Expected on stderr: %q, stderr: %s\n", stderrMessage, stderr) |
| 96 | + } |
| 97 | + if len(stdoutExcluded) > 0 && strings.Contains(stdout, stdoutExcluded) { |
| 98 | + t.Errorf("Unexpected output on stdout: %q, stdout: %s\n", stdoutExcluded, stdout) |
| 99 | + } |
| 100 | + if len(stderrExcluded) > 0 && strings.Contains(stderr, stderrExcluded) { |
| 101 | + t.Errorf("Unexpected output on stderr: %q, stderr: %s\n", stderrExcluded, stderr) |
| 102 | + } |
| 103 | +} |
0 commit comments