diff --git a/src/go/pt-mongodb-query-digest/main.go b/src/go/pt-mongodb-query-digest/main.go index f3a1021c..bc987612 100644 --- a/src/go/pt-mongodb-query-digest/main.go +++ b/src/go/pt-mongodb-query-digest/main.go @@ -508,28 +508,28 @@ func getOptions() (*options, error) { AuthDB: DEFAULT_AUTHDB, } - getopt.BoolVarLong(&opts.Help, "help", '?', "Show help") - getopt.BoolVarLong(&opts.Version, "version", 'v', "Show version & exit") - getopt.BoolVarLong(&opts.NoVersionCheck, "no-version-check", 'c', "Default: Don't check for updates") + gop := getopt.New() + gop.BoolVarLong(&opts.Help, "help", '?', "Show help") + gop.BoolVarLong(&opts.Version, "version", 'v', "Show version & exit") + gop.BoolVarLong(&opts.NoVersionCheck, "no-version-check", 'c', "Default: Don't check for updates") - getopt.IntVarLong(&opts.Limit, "limit", 'n', "Show the first n queries") + gop.IntVarLong(&opts.Limit, "limit", 'n', "Show the first n queries") - getopt.ListVarLong(&opts.OrderBy, "order-by", 'o', + gop.ListVarLong(&opts.OrderBy, "order-by", 'o', "Comma separated list of order by fields (max values): "+ "count,ratio,query-time,docs-scanned,docs-returned. "+ "- in front of the field name denotes reverse order. Default: "+DEFAULT_ORDERBY) - getopt.ListVarLong(&opts.SkipCollections, "skip-collections", 's', "A comma separated list of collections (namespaces) to skip."+ + gop.ListVarLong(&opts.SkipCollections, "skip-collections", 's', "A comma separated list of collections (namespaces) to skip."+ " Default: "+DEFAULT_SKIPCOLLECTIONS) - getopt.StringVarLong(&opts.AuthDB, "authenticationDatabase", 'a', "admin", "Database to use for optional MongoDB authentication. Default: admin") - getopt.StringVarLong(&opts.Database, "database", 'd', "", "MongoDB database to profile") - getopt.StringVarLong(&opts.LogLevel, "log-level", 'l', "Log level: error", "panic, fatal, error, warn, info, debug. Default: error") - getopt.StringVarLong(&opts.Password, "password", 'p', "", "Password to use for optional MongoDB authentication").SetOptional() - getopt.StringVarLong(&opts.User, "username", 'u', "Username to use for optional MongoDB authentication") + gop.StringVarLong(&opts.AuthDB, "authenticationDatabase", 'a', "admin", "Database to use for optional MongoDB authentication. Default: admin") + gop.StringVarLong(&opts.Database, "database", 'd', "", "MongoDB database to profile") + gop.StringVarLong(&opts.LogLevel, "log-level", 'l', "Log level: error", "panic, fatal, error, warn, info, debug. Default: error") + gop.StringVarLong(&opts.Password, "password", 'p', "", "Password to use for optional MongoDB authentication").SetOptional() + gop.StringVarLong(&opts.User, "username", 'u', "Username to use for optional MongoDB authentication") - getopt.SetParameters("host[:port]/database") + gop.SetParameters("host[:port]/database") - var gop = getopt.CommandLine gop.Parse(os.Args) if gop.NArgs() > 0 { opts.Host = gop.Arg(0) @@ -539,13 +539,7 @@ func getOptions() (*options, error) { return opts, nil } - //args := getopt.Args() // host is a positional arg - //if len(args) > 0 { - // opts.Host = args[0] - - //} - - if getopt.IsSet("order-by") { + if gop.IsSet("order-by") { validFields := []string{"count", "ratio", "query-time", "docs-scanned", "docs-returned"} for _, field := range opts.OrderBy { valid := false @@ -558,11 +552,9 @@ func getOptions() (*options, error) { return nil, fmt.Errorf("invalid sort field '%q'", field) } } - } else { - opts.OrderBy = []string{"count"} } - if getopt.IsSet("password") && opts.Password == "" { + if gop.IsSet("password") && opts.Password == "" { print("Password: ") pass, err := gopass.GetPasswd() if err != nil { diff --git a/src/go/pt-mongodb-query-digest/main_test.go b/src/go/pt-mongodb-query-digest/main_test.go index fbd0566b..264955ba 100644 --- a/src/go/pt-mongodb-query-digest/main_test.go +++ b/src/go/pt-mongodb-query-digest/main_test.go @@ -6,9 +6,11 @@ import ( "io/ioutil" "os" "reflect" + "strings" "testing" "time" + "github.com/pborman/getopt/v2" "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmgo" @@ -345,3 +347,44 @@ func TestIsProfilerEnabled(t *testing.T) { } } + +func TestParseArgs(t *testing.T) { + tests := []struct { + args []string + want *options + }{ + { + args: []string{TOOLNAME}, // arg[0] is the command itself + want: &options{ + Host: DEFAULT_HOST, + LogLevel: DEFAULT_LOGLEVEL, + OrderBy: strings.Split(DEFAULT_ORDERBY, ","), + SkipCollections: strings.Split(DEFAULT_SKIPCOLLECTIONS, ","), + AuthDB: DEFAULT_AUTHDB, + }, + }, + { + args: []string{TOOLNAME, "zapp.brannigan.net:27018/samples", "--help"}, + want: &options{ + Host: "zapp.brannigan.net:27018/samples", + LogLevel: DEFAULT_LOGLEVEL, + OrderBy: strings.Split(DEFAULT_ORDERBY, ","), + SkipCollections: strings.Split(DEFAULT_SKIPCOLLECTIONS, ","), + AuthDB: DEFAULT_AUTHDB, + Help: true, + }, + }, + } + for i, test := range tests { + getopt.Reset() + os.Args = test.args + got, err := getOptions() + if err != nil { + t.Errorf("error parsing command line arguments: %s", err.Error()) + } + if !reflect.DeepEqual(got, test.want) { + t.Errorf("invalid command line options test %d\ngot %+v\nwant %+v\n", i, got, test.want) + } + } + +}