main: make prefixOArgs errors testable

By returning an error instead of calling os.Exit,
error cases can be tested easily. Error cases
were not tested until now.
This commit is contained in:
Jakob Unterwurzacher 2018-06-05 21:02:35 +02:00
parent 98aa9cb176
commit e29a81efc3
3 changed files with 34 additions and 11 deletions

View File

@ -42,16 +42,16 @@ var flagSet *flag.FlagSet
// prefixOArgs transform options passed via "-o foo,bar" into regular options // prefixOArgs transform options passed via "-o foo,bar" into regular options
// like "-foo -bar" and prefixes them to the command line. // like "-foo -bar" and prefixes them to the command line.
// Testcases in TestPrefixOArgs(). // Testcases in TestPrefixOArgs().
func prefixOArgs(osArgs []string) []string { func prefixOArgs(osArgs []string) ([]string, error) {
// Need at least 3, example: gocryptfs -o foo,bar // Need at least 3, example: gocryptfs -o foo,bar
// ^ 0 ^ 1 ^ 2 // ^ 0 ^ 1 ^ 2
if len(osArgs) < 3 { if len(osArgs) < 3 {
return osArgs return osArgs, nil
} }
// Passing "--" disables "-o" parsing. Ignore element 0 (program name). // Passing "--" disables "-o" parsing. Ignore element 0 (program name).
for _, v := range osArgs[1:] { for _, v := range osArgs[1:] {
if v == "--" { if v == "--" {
return osArgs return osArgs, nil
} }
} }
// Find and extract "-o foo,bar" // Find and extract "-o foo,bar"
@ -60,8 +60,7 @@ func prefixOArgs(osArgs []string) []string {
if osArgs[i] == "-o" { if osArgs[i] == "-o" {
// Last argument? // Last argument?
if i+1 >= len(osArgs) { if i+1 >= len(osArgs) {
tlog.Fatal.Printf("The \"-o\" option requires an argument") return nil, fmt.Errorf("The \"-o\" option requires an argument")
os.Exit(exitcodes.Usage)
} }
oOpts = strings.Split(osArgs[i+1], ",") oOpts = strings.Split(osArgs[i+1], ",")
// Skip over the arguments to "-o" // Skip over the arguments to "-o"
@ -87,16 +86,20 @@ func prefixOArgs(osArgs []string) []string {
} }
// Add other arguments // Add other arguments
newArgs = append(newArgs, otherArgs...) newArgs = append(newArgs, otherArgs...)
return newArgs return newArgs, nil
} }
// parseCliOpts - parse command line options (i.e. arguments that start with "-") // parseCliOpts - parse command line options (i.e. arguments that start with "-")
func parseCliOpts() (args argContainer) { func parseCliOpts() (args argContainer) {
os.Args = prefixOArgs(os.Args)
var err error var err error
var opensslAuto string var opensslAuto string
os.Args, err = prefixOArgs(os.Args)
if err != nil {
tlog.Fatal.Println(err)
os.Exit(exitcodes.Usage)
}
flagSet = flag.NewFlagSet(tlog.ProgramName, flag.ContinueOnError) flagSet = flag.NewFlagSet(tlog.ProgramName, flag.ContinueOnError)
flagSet.Usage = helpShort flagSet.Usage = helpShort
flagSet.BoolVar(&args.debug, "d", false, "") flagSet.BoolVar(&args.debug, "d", false, "")

View File

@ -10,6 +10,8 @@ type testcase struct {
i []string i []string
// o is the expected output // o is the expected output
o []string o []string
// Do we expect an error?
e bool
} }
// TestPrefixOArgs checks that the "-o x,y,z" parsing works correctly. // TestPrefixOArgs checks that the "-o x,y,z" parsing works correctly.
@ -61,11 +63,17 @@ func TestPrefixOArgs(t *testing.T) {
i: []string{"gocryptfs", "--", "-o", "a"}, i: []string{"gocryptfs", "--", "-o", "a"},
o: []string{"gocryptfs", "--", "-o", "a"}, o: []string{"gocryptfs", "--", "-o", "a"},
}, },
// This should error out
{
i: []string{"gocryptfs", "foo", "bar", "-o"},
e: true,
},
} }
for _, tc := range testcases { for _, tc := range testcases {
o := prefixOArgs(tc.i) o, err := prefixOArgs(tc.i)
if !reflect.DeepEqual(o, tc.o) { e := (err != nil)
t.Errorf("\n in=%q\nwant=%q\n got=%q", tc.i, tc.o, o) if !reflect.DeepEqual(o, tc.o) || e != tc.e {
t.Errorf("\n in=%q\nwant=%q err=%v\n got=%q err=%v", tc.i, tc.o, tc.e, o, e)
} }
} }
} }

View File

@ -448,3 +448,15 @@ func TestMultipleOperationFlags(t *testing.T) {
} }
} }
} }
// Test that a missing argument to "-o" triggers exit code 1.
// See also cli_args_test.go for comprehensive tests of "-o" parsing.
func TestMissingOArg(t *testing.T) {
cmd := exec.Command(test_helpers.GocryptfsBinary, "foo", "bar", "-o")
err := cmd.Run()
exitCode := test_helpers.ExtractCmdExitCode(err)
if exitCode != exitcodes.Usage {
t.Fatalf("this should have failed with code %d, but returned %d",
exitcodes.Usage, exitCode)
}
}