diff --git a/cmd/slsa-provenance/cli/version.go b/cmd/slsa-provenance/cli/version.go index 31a2b1f9..f3ff2e9e 100644 --- a/cmd/slsa-provenance/cli/version.go +++ b/cmd/slsa-provenance/cli/version.go @@ -5,6 +5,7 @@ import ( "encoding/json" "flag" "fmt" + "io" "runtime" "strings" "text/tabwriter" @@ -30,11 +31,14 @@ var ( ) // Version creates an instance of *ffcli.Command to print version info -func Version() *ffcli.Command { +func Version(w io.Writer) *ffcli.Command { var ( flagset = flag.NewFlagSet("slsa-provenance version", flag.ExitOnError) outJSON = flagset.Bool("json", false, "print JSON instead of text") ) + + flagset.SetOutput(w) + return &ffcli.Command{ Name: "version", ShortUsage: "slsa-provenance version", @@ -51,7 +55,7 @@ func Version() *ffcli.Command { res = j } - fmt.Println(res) + fmt.Fprintln(w, res) return nil }, } diff --git a/cmd/slsa-provenance/cli/version_test.go b/cmd/slsa-provenance/cli/version_test.go new file mode 100644 index 00000000..ee054d29 --- /dev/null +++ b/cmd/slsa-provenance/cli/version_test.go @@ -0,0 +1,56 @@ +package cli_test + +import ( + "context" + "fmt" + "runtime" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/philips-labs/slsa-provenance-action/cmd/slsa-provenance/cli" +) + +func TestVersionCliText(t *testing.T) { + assert := assert.New(t) + + sb := strings.Builder{} + cli := cli.Version(&sb) + + expected := fmt.Sprintf(`GitVersion: devel +GitCommit: unknown +GitTreeState: unknown +BuildDate: unknown +GoVersion: %s +Compiler: %s +Platform: %s/%s + +`, runtime.Version(), runtime.Compiler, runtime.GOOS, runtime.GOARCH) + + err := cli.ParseAndRun(context.Background(), nil) + assert.NoError(err) + assert.Equal(expected, sb.String()) +} + +func TestVersionCliJson(t *testing.T) { + assert := assert.New(t) + + sb := strings.Builder{} + cli := cli.Version(&sb) + + expected := fmt.Sprintf(`{ + "git_version": "devel", + "git_commit": "unknown", + "git_tree_state": "unknown", + "build_date": "unknown", + "go_version": "%s", + "compiler": "%s", + "platform": "%s/%s" +} +`, runtime.Version(), runtime.Compiler, runtime.GOOS, runtime.GOARCH) + + err := cli.ParseAndRun(context.Background(), []string{"-json"}) + assert.NoError(err) + assert.Equal(expected, sb.String()) +} diff --git a/cmd/slsa-provenance/main.go b/cmd/slsa-provenance/main.go index f94ee0fa..b0a51972 100644 --- a/cmd/slsa-provenance/main.go +++ b/cmd/slsa-provenance/main.go @@ -15,18 +15,20 @@ import ( func main() { rootFlagSet := flag.NewFlagSet("slsa-provenance", flag.ExitOnError) + v := cli.Version(os.Stdout) + app := &ffcli.Command{ Name: "slsa-provenance [flags] ", FlagSet: rootFlagSet, Subcommands: []*ffcli.Command{ cli.Generate(os.Stdout), - cli.Version(), + v, }, Exec: func(ctx context.Context, args []string) error { fmt.Println("slsa-provenance") fmt.Println() - return cli.Version().Exec(ctx, args) + return v.Exec(ctx, args) }, }