package pflag import ( "encoding/base64" "fmt" "os" "testing" ) func setUpBytesHex(bytesHex *[]byte) *FlagSet { f := NewFlagSet("test", ContinueOnError) f.BytesHexVar(bytesHex, "bytes", []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "Some bytes in HEX") f.BytesHexVarP(bytesHex, "bytes2", "B", []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "Some bytes in HEX") return f } func TestBytesHex(t *testing.T) { testCases := []struct { input string success bool expected string }{ /// Positive cases {"", true, ""}, // Is empty string OK ? {"01", true, "01"}, {"0101", true, "0101"}, {"1234567890abcdef", true, "1234567890ABCDEF"}, {"1234567890ABCDEF", true, "1234567890ABCDEF"}, // Negative cases {"0", false, ""}, // Short string {"000", false, ""}, /// Odd-length string {"qq", false, ""}, /// non-hex character } devnull, _ := os.Open(os.DevNull) os.Stderr = devnull for i := range testCases { var bytesHex []byte f := setUpBytesHex(&bytesHex) tc := &testCases[i] // --bytes args := []string{ fmt.Sprintf("--bytes=%s", tc.input), fmt.Sprintf("-B %s", tc.input), fmt.Sprintf("--bytes2=%s", tc.input), } for _, arg := range args { err := f.Parse([]string{arg}) if err != nil && tc.success == true { t.Errorf("expected success, got %q", err) continue } else if err == nil && tc.success == false { // bytesHex, err := f.GetBytesHex("bytes") t.Errorf("expected failure while processing %q", tc.input) continue } else if tc.success { bytesHex, err := f.GetBytesHex("bytes") if err != nil { t.Errorf("Got error trying to fetch the 'bytes' flag: %v", err) } if fmt.Sprintf("%X", bytesHex) != tc.expected { t.Errorf("expected %q, got '%X'", tc.expected, bytesHex) } } } } } func setUpBytesBase64(bytesBase64 *[]byte) *FlagSet { f := NewFlagSet("test", ContinueOnError) f.BytesBase64Var(bytesBase64, "bytes", []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "Some bytes in Base64") f.BytesBase64VarP(bytesBase64, "bytes2", "B", []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "Some bytes in Base64") return f } func TestBytesBase64(t *testing.T) { testCases := []struct { input string success bool expected string }{ /// Positive cases {"", true, ""}, // Is empty string OK ? {"AQ==", true, "AQ=="}, // Negative cases {"AQ", false, ""}, // Padding removed {"ï", false, ""}, // non-base64 characters } devnull, _ := os.Open(os.DevNull) os.Stderr = devnull for i := range testCases { var bytesBase64 []byte f := setUpBytesBase64(&bytesBase64) tc := &testCases[i] // --bytes args := []string{ fmt.Sprintf("--bytes=%s", tc.input), fmt.Sprintf("-B %s", tc.input), fmt.Sprintf("--bytes2=%s", tc.input), } for _, arg := range args { err := f.Parse([]string{arg}) if err != nil && tc.success == true { t.Errorf("expected success, got %q", err) continue } else if err == nil && tc.success == false { // bytesBase64, err := f.GetBytesBase64("bytes") t.Errorf("expected failure while processing %q", tc.input) continue } else if tc.success { bytesBase64, err := f.GetBytesBase64("bytes") if err != nil { t.Errorf("Got error trying to fetch the 'bytes' flag: %v", err) } if base64.StdEncoding.EncodeToString(bytesBase64) != tc.expected { t.Errorf("expected %q, got '%X'", tc.expected, bytesBase64) } } } } }