mirror of
https://github.com/lukaszraczylo/traefikoidc.git
synced 2026-10-14 04:07:46 +00:00
198 lines
5.5 KiB
Go
198 lines
5.5 KiB
Go
package traefikoidc
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// TestChunkManagerValidateJWT tests JWT validation in chunk manager
|
|
func TestChunkManagerValidateJWT(t *testing.T) {
|
|
ts := NewTestSuite(t)
|
|
ts.Setup()
|
|
|
|
cm := NewChunkManager(ts.tOidc.logger)
|
|
|
|
// Test valid JWT format (using base64url encoded parts that are long enough)
|
|
validJWT := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
|
|
err := cm.validateJWTFormat(validJWT, "test")
|
|
if err != nil {
|
|
t.Errorf("Expected valid JWT to pass, got error: %v", err)
|
|
}
|
|
|
|
// Test invalid JWT format - too few parts
|
|
invalidJWT := "header.payload"
|
|
err = cm.validateJWTFormat(invalidJWT, "test")
|
|
if err == nil {
|
|
t.Error("Expected invalid JWT to fail validation")
|
|
}
|
|
|
|
// Test invalid JWT format - too many parts
|
|
invalidJWT2 := "header.payload.signature.extra"
|
|
err = cm.validateJWTFormat(invalidJWT2, "test")
|
|
if err == nil {
|
|
t.Error("Expected invalid JWT with extra parts to fail validation")
|
|
}
|
|
|
|
// Test empty JWT
|
|
err = cm.validateJWTFormat("", "test")
|
|
if err == nil {
|
|
t.Error("Expected empty JWT to fail validation")
|
|
}
|
|
}
|
|
|
|
// TestChunkManagerValidateOpaqueToken tests opaque token validation
|
|
func TestChunkManagerValidateOpaqueToken(t *testing.T) {
|
|
ts := NewTestSuite(t)
|
|
ts.Setup()
|
|
|
|
cm := NewChunkManager(ts.tOidc.logger)
|
|
|
|
// Test valid opaque token
|
|
validOpaque := "valid_opaque_token_that_is_long_enough"
|
|
err := cm.validateOpaqueToken(validOpaque, "test")
|
|
if err != nil {
|
|
t.Errorf("Expected valid opaque token to pass, got error: %v", err)
|
|
}
|
|
|
|
// Test too short opaque token
|
|
shortOpaque := "short"
|
|
err = cm.validateOpaqueToken(shortOpaque, "test")
|
|
if err == nil {
|
|
t.Error("Expected short opaque token to fail validation")
|
|
}
|
|
|
|
// Test empty opaque token
|
|
err = cm.validateOpaqueToken("", "test")
|
|
if err == nil {
|
|
t.Error("Expected empty opaque token to fail validation")
|
|
}
|
|
}
|
|
|
|
// TestChunkManagerValidateTokenSize tests token size validation
|
|
func TestChunkManagerValidateTokenSize(t *testing.T) {
|
|
ts := NewTestSuite(t)
|
|
ts.Setup()
|
|
|
|
cm := NewChunkManager(ts.tOidc.logger)
|
|
|
|
// Test normal token size
|
|
normalToken := strings.Repeat("a", 1000)
|
|
err := cm.validateTokenSize(normalToken, AccessTokenConfig)
|
|
if err != nil {
|
|
t.Errorf("Expected normal token to pass size validation, got error: %v", err)
|
|
}
|
|
|
|
// Test oversized token
|
|
oversizedToken := strings.Repeat("a", AccessTokenConfig.MaxLength+1)
|
|
err = cm.validateTokenSize(oversizedToken, AccessTokenConfig)
|
|
if err == nil {
|
|
t.Error("Expected oversized token to fail validation")
|
|
}
|
|
|
|
// Test undersized token
|
|
undersizedToken := "ab"
|
|
err = cm.validateTokenSize(undersizedToken, AccessTokenConfig)
|
|
if err == nil {
|
|
t.Error("Expected undersized token to fail validation")
|
|
}
|
|
}
|
|
|
|
// TestChunkManagerValidateTokenContent tests token content validation
|
|
func TestChunkManagerValidateTokenContent(t *testing.T) {
|
|
ts := NewTestSuite(t)
|
|
ts.Setup()
|
|
|
|
cm := NewChunkManager(ts.tOidc.logger)
|
|
|
|
// Test normal token content
|
|
normalToken := "normal_token_content_without_issues"
|
|
err := cm.validateTokenContent(normalToken, AccessTokenConfig)
|
|
if err != nil {
|
|
t.Errorf("Expected normal token to pass content validation, got error: %v", err)
|
|
}
|
|
|
|
// Test token with null bytes
|
|
nullByteToken := "token_with\x00null_byte"
|
|
err = cm.validateTokenContent(nullByteToken, AccessTokenConfig)
|
|
if err == nil {
|
|
t.Error("Expected token with null bytes to fail validation")
|
|
}
|
|
|
|
// Test token with control characters
|
|
controlCharToken := "token_with\x01control"
|
|
err = cm.validateTokenContent(controlCharToken, AccessTokenConfig)
|
|
if err == nil {
|
|
t.Error("Expected token with control characters to fail validation")
|
|
}
|
|
}
|
|
|
|
// TestChunkManagerSingleTokenValidation tests single token validation path
|
|
func TestChunkManagerSingleTokenValidation(t *testing.T) {
|
|
ts := NewTestSuite(t)
|
|
ts.Setup()
|
|
|
|
cm := NewChunkManager(ts.tOidc.logger)
|
|
|
|
// Create a valid JWT token
|
|
validToken, _ := createTestJWT(ts.rsaPrivateKey, "RS256", "test-key-id", map[string]interface{}{
|
|
"iss": "https://test-issuer.com",
|
|
"aud": "test-client-id",
|
|
"sub": "test-user",
|
|
"exp": time.Now().Add(1 * time.Hour).Unix(),
|
|
"iat": time.Now().Unix(),
|
|
})
|
|
|
|
// Test valid token processing
|
|
result := cm.processSingleToken(validToken, false, AccessTokenConfig)
|
|
if result.Error != nil {
|
|
t.Errorf("Expected valid token to process successfully, got error: %v", result.Error)
|
|
}
|
|
if result.Token != validToken {
|
|
t.Error("Expected token to be returned unchanged")
|
|
}
|
|
|
|
// Test invalid token processing
|
|
invalidToken := "invalid.token"
|
|
result = cm.processSingleToken(invalidToken, false, IDTokenConfig) // ID tokens require JWT format
|
|
if result.Error == nil {
|
|
t.Error("Expected invalid token to fail processing")
|
|
}
|
|
}
|
|
|
|
// TestTokenConfigValidation tests different token configurations
|
|
func TestTokenConfigValidation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
config TokenConfig
|
|
}{
|
|
{
|
|
name: "AccessTokenConfig",
|
|
config: AccessTokenConfig,
|
|
},
|
|
{
|
|
name: "RefreshTokenConfig",
|
|
config: RefreshTokenConfig,
|
|
},
|
|
{
|
|
name: "IDTokenConfig",
|
|
config: IDTokenConfig,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Verify config has expected fields
|
|
if tt.config.Type == "" {
|
|
t.Error("Expected config to have Type set")
|
|
}
|
|
if tt.config.MaxLength <= 0 {
|
|
t.Error("Expected config to have positive MaxLength")
|
|
}
|
|
if tt.config.MinLength <= 0 {
|
|
t.Error("Expected config to have positive MinLength")
|
|
}
|
|
})
|
|
}
|
|
}
|