Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pkg/statusserver/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ func (p *projectedServiceAccountTokenAuthorizer) Authorize(ctx context.Context,
}

func extractRawToken(authHeader string) string {
parts := strings.Split(authHeader, " ")
parts := strings.Fields(authHeader)

if len(parts) != 2 || parts[0] != "Bearer" {
if len(parts) != 2 || !strings.EqualFold(parts[0], "Bearer") {
return ""
}

Expand Down
61 changes: 61 additions & 0 deletions pkg/statusserver/auth_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package statusserver

import "testing"

func TestExtractRawToken(t *testing.T) {
tests := []struct {
name string
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we please update these tests and the utils tests to use maps instead of slices, with the map key set to the name? This is the pattern used elsewhere in the project.

authHeader string
expected string
}{
{
name: "valid bearer token",
authHeader: "Bearer abc123",
expected: "abc123",
},
{
name: "empty header",
authHeader: "",
expected: "",
},
{
name: "missing token",
authHeader: "Bearer",
expected: "",
},
{
name: "wrong auth scheme",
authHeader: "Basic abc123",
expected: "",
},
{
name: "too many parts",
authHeader: "Bearer abc def",
expected: "",
},
{
name: "multiple spaces",
authHeader: "Bearer abc123",
expected: "abc123",
},
{
name: "lowercase bearer",
authHeader: "bearer abc123",
expected: "abc123",
},
{
name: "leading and trailing spaces",
authHeader: " Bearer abc123 ",
expected: "abc123",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := extractRawToken(tt.authHeader)
if got != tt.expected {
t.Fatalf("extractRawToken(%q) = %q, want %q", tt.authHeader, got, tt.expected)
}
})
}
}
65 changes: 65 additions & 0 deletions pkg/statusserver/utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package statusserver

import "testing"

func TestTokenAudience(t *testing.T) {
tests := []struct {
name string
namespace string
trainJob string
expected string
}{
{
name: "default namespace",
namespace: "default",
trainJob: "mnist",
expected: "trainer.kubeflow.org/v1alpha1/namespaces/default/trainjobs/mnist/status",
},
{
name: "kubeflow namespace",
namespace: "kubeflow",
trainJob: "llm-job",
expected: "trainer.kubeflow.org/v1alpha1/namespaces/kubeflow/trainjobs/llm-job/status",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := TokenAudience(tt.namespace, tt.trainJob)
if got != tt.expected {
t.Fatalf("TokenAudience(%q, %q) = %q, want %q", tt.namespace, tt.trainJob, got, tt.expected)
}
})
}
}

func TestStatusUrl(t *testing.T) {
tests := []struct {
name string
namespace string
trainJob string
expected string
}{
{
name: "default namespace",
namespace: "default",
trainJob: "mnist",
expected: "/apis/trainer.kubeflow.org/v1alpha1/namespaces/default/trainjobs/mnist/status",
},
{
name: "kubeflow namespace",
namespace: "kubeflow",
trainJob: "llm-job",
expected: "/apis/trainer.kubeflow.org/v1alpha1/namespaces/kubeflow/trainjobs/llm-job/status",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := StatusUrl(tt.namespace, tt.trainJob)
if got != tt.expected {
t.Fatalf("StatusUrl(%q, %q) = %q, want %q", tt.namespace, tt.trainJob, got, tt.expected)
}
})
}
}
Loading