| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package auth |
| |
| import ( |
| "strings" |
| "testing" |
| ) |
| |
| func TestParseGitAuth(t *testing.T) { |
| testCases := []struct { |
| gitauth string // contents of 'git credential fill' |
| wantPrefix string |
| wantUsername string |
| wantPassword string |
| }{ |
| { // Standard case. |
| gitauth: ` |
| protocol=https |
| host=example.com |
| username=bob |
| password=secr3t |
| `, |
| wantPrefix: "https://example.com", |
| wantUsername: "bob", |
| wantPassword: "secr3t", |
| }, |
| { // Should not use an invalid url. |
| gitauth: ` |
| protocol=https |
| host=example.com |
| username=bob |
| password=secr3t |
| url=invalid |
| `, |
| wantPrefix: "https://example.com", |
| wantUsername: "bob", |
| wantPassword: "secr3t", |
| }, |
| { // Should use the new url. |
| gitauth: ` |
| protocol=https |
| host=example.com |
| username=bob |
| password=secr3t |
| url=https://go.dev |
| `, |
| wantPrefix: "https://go.dev", |
| wantUsername: "bob", |
| wantPassword: "secr3t", |
| }, |
| { // Empty data. |
| gitauth: ` |
| `, |
| wantPrefix: "", |
| wantUsername: "", |
| wantPassword: "", |
| }, |
| { // Does not follow the '=' format. |
| gitauth: ` |
| protocol:https |
| host:example.com |
| username:bob |
| password:secr3t |
| `, |
| wantPrefix: "", |
| wantUsername: "", |
| wantPassword: "", |
| }, |
| } |
| for _, tc := range testCases { |
| parsedPrefix, username, password := parseGitAuth([]byte(tc.gitauth)) |
| if parsedPrefix != tc.wantPrefix { |
| t.Errorf("parseGitAuth(%s):\nhave %q\nwant %q", tc.gitauth, parsedPrefix, tc.wantPrefix) |
| } |
| if username != tc.wantUsername { |
| t.Errorf("parseGitAuth(%s):\nhave %q\nwant %q", tc.gitauth, username, tc.wantUsername) |
| } |
| if password != tc.wantPassword { |
| t.Errorf("parseGitAuth(%s):\nhave %q\nwant %q", tc.gitauth, password, tc.wantPassword) |
| } |
| } |
| } |
| |
| func BenchmarkParseGitAuth(b *testing.B) { |
| // Define different test scenarios to benchmark |
| testCases := []struct { |
| name string |
| data []byte |
| }{{ |
| // Standard scenario with all basic fields present |
| name: "standard", |
| data: []byte(` |
| protocol=https |
| host=example.com |
| username=bob |
| password=secr3t |
| `), |
| }, { |
| // Scenario with URL field included |
| name: "with_url", |
| data: []byte(` |
| protocol=https |
| host=example.com |
| username=bob |
| password=secr3t |
| url=https://example.com/repo |
| `), |
| }, { |
| // Minimal scenario with only required fields |
| name: "minimal", |
| data: []byte(` |
| protocol=https |
| host=example.com |
| `), |
| }, { |
| // Complex scenario with longer values and extra fields |
| name: "complex", |
| data: func() []byte { |
| var builder strings.Builder |
| builder.WriteString("protocol=https\n") |
| builder.WriteString("host=example.com\n") |
| builder.WriteString("username=longusernamenamename\n") |
| builder.WriteString("password=longpasswordwithmanycharacters123456789\n") |
| builder.WriteString("url=https://example.com/very/long/path/to/repository\n") |
| builder.WriteString("extra1=value1\n") |
| builder.WriteString("extra2=value2\n") |
| return []byte(builder.String()) |
| }(), |
| }, { |
| // Scenario with empty input |
| name: "empty", |
| data: []byte(``), |
| }, { |
| // Scenario with malformed input (using colon instead of equals) |
| name: "malformed", |
| data: []byte(` |
| protocol:https |
| host:example.com |
| username:bob |
| password:secr3t |
| `), |
| }} |
| |
| for _, tc := range testCases { |
| b.Run(tc.name, func(b *testing.B) { |
| b.ResetTimer() |
| for b.Loop() { |
| prefix, username, password := parseGitAuth(tc.data) |
| |
| _ = prefix |
| _ = username |
| _ = password |
| } |
| }) |
| } |
| } |