From 95d7c904927f16dc15634e2ad5614958fc59ff17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Wed, 25 Jun 2025 10:59:23 +0200 Subject: [PATCH] v0.0.583 --- goextVersion.go | 4 +- langext/base64.go | 1 - langext/base64_test.go | 246 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 248 insertions(+), 3 deletions(-) create mode 100644 langext/base64_test.go diff --git a/goextVersion.go b/goextVersion.go index c536c4e..8be8838 100644 --- a/goextVersion.go +++ b/goextVersion.go @@ -1,5 +1,5 @@ package goext -const GoextVersion = "0.0.582" +const GoextVersion = "0.0.583" -const GoextVersionTimestamp = "2025-06-25T10:51:38+0200" +const GoextVersionTimestamp = "2025-06-25T10:59:23+0200" diff --git a/langext/base64.go b/langext/base64.go index 82c57e7..02c4c32 100644 --- a/langext/base64.go +++ b/langext/base64.go @@ -8,7 +8,6 @@ import ( // DecodeBase64Any decodes a base64 encoded string // Works with all variants (std, url, imap), padded and unpadded and even ignores linrebreaks and indents func DecodeBase64Any(data string) ([]byte, error) { - data = strings.ReplaceAll(data, "\n", "") // remove linebreaks and indents data = strings.ReplaceAll(data, "\t", "") // remove linebreaks and indents data = strings.ReplaceAll(data, " ", "") // remove linebreaks and indents diff --git a/langext/base64_test.go b/langext/base64_test.go new file mode 100644 index 0000000..4392bd5 --- /dev/null +++ b/langext/base64_test.go @@ -0,0 +1,246 @@ +package langext + +import ( + "testing" +) + +func TestDecodeBase64Any_StandardPadded(t *testing.T) { + input := "SGVsbG8gV29ybGQ=" // "Hello World" in standard Base64 (padded) + expected := "Hello World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_StandardUnpadded(t *testing.T) { + input := "SGVsbG8gV29ybGQ" // "Hello World" in standard Base64 (unpadded) + expected := "Hello World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_URLPadded(t *testing.T) { + input := "SGVsbG8tV29ybGQ=" // "Hello-World" in Base64 URL (padded) + expected := "Hello-World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_URLUnpadded(t *testing.T) { + input := "SGVsbG8tV29ybGQ" // "Hello-World" in Base64 URL (unpadded) + expected := "Hello-World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_IMAPPadded(t *testing.T) { + input := "SGVsbG8,V29ybGQ=" // "Hello/World" in Base64 IMAP (padded) + expected := "Hello?World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_IMAPUnpadded(t *testing.T) { + input := "SGVsbG8,V29ybGQ" // "Hello/World" in Base64 IMAP (unpadded) + expected := "Hello?World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_InvalidInput(t *testing.T) { + input := "Invalid@@Base64" // Invalid Base64 input + + _, err := DecodeBase64Any(input) + if err == nil { + t.Fatal("expected an error, but got none") + } +} + +func TestDecodeBase64Any_EmptyInput(t *testing.T) { + input := "" // Empty input + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if len(result) != 0 { + t.Errorf("expected empty result, got %q", string(result)) + } +} + +func TestDecodeBase64Any_WhitespaceInput(t *testing.T) { + input := " SGVsbG8gV29ybGQ= " // Input with leading and trailing spaces + expected := "Hello World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_LineBreaksInput(t *testing.T) { + input := "SGVs\nbG8g\nV29y\nbGQ=" // Input with line breaks + expected := "Hello World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_TabCharactersInput(t *testing.T) { + input := "SGVsbG8g\tV29ybGQ=" // Input with tab characters + expected := "Hello World" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_SpecialCharactersIgnored(t *testing.T) { + input := "SGVsbG8gV29ybGQ=!!" // Input with ignored special characters + + _, err := DecodeBase64Any(input) + if err == nil { + t.Fatal("expected an error, but got none") + } +} + +func TestDecodeBase64Any_SingleCharacterInput(t *testing.T) { + input := "QQ==" // "A" in Base64 + expected := "A" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_LongInput(t *testing.T) { + input := "U29tZSB2ZXJ5IGxvbmcgc3RyaW5nIHdpdGggbXVsdGlwbGUgbGluZXMgYW5kIHNwYWNlcy4=" // Long Base64 string + expected := "Some very long string with multiple lines and spaces." + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_Standard63And64(t *testing.T) { + input := "Pz8/Pw==" // "???" in standard Base64 (63 = '+', 64 = '/') + expected := "????" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_Standard63And64_NoPad(t *testing.T) { + input := "Pz8/Pw" // "???" in standard Base64 (63 = '+', 64 = '/') + expected := "????" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_URL63And64(t *testing.T) { + input := "Pz8_Pw==" // "???" in Base64 URL-safe (63 = '_', 64 = '-') + expected := "????" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +} + +func TestDecodeBase64Any_URL63And64_NoPad(t *testing.T) { + input := "Pz8_Pw==" // "???" in Base64 URL-safe (63 = '_', 64 = '-') + expected := "????" + + result, err := DecodeBase64Any(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(result) != expected { + t.Errorf("expected %q, got %q", expected, string(result)) + } +}