redact_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package logredact
  2. import (
  3. "strings"
  4. "testing"
  5. )
  6. func TestRedactText_JSONLike(t *testing.T) {
  7. in := `{"access_token":"ya29.a0AfH6SMDUMMY","refresh_token":"1//0gDUMMY","other":"ok"}`
  8. out := RedactText(in)
  9. if out == in {
  10. t.Fatalf("expected redaction, got unchanged")
  11. }
  12. if want := `"access_token":"***"`; !strings.Contains(out, want) {
  13. t.Fatalf("expected %q in %q", want, out)
  14. }
  15. if want := `"refresh_token":"***"`; !strings.Contains(out, want) {
  16. t.Fatalf("expected %q in %q", want, out)
  17. }
  18. }
  19. func TestRedactText_QueryLike(t *testing.T) {
  20. in := "access_token=ya29.a0AfH6SMDUMMY refresh_token=1//0gDUMMY"
  21. out := RedactText(in)
  22. if strings.Contains(out, "ya29") || strings.Contains(out, "1//0") {
  23. t.Fatalf("expected tokens redacted, got %q", out)
  24. }
  25. }
  26. func TestRedactText_GOCSPX(t *testing.T) {
  27. in := "client_secret=GOCSPX-your-client-secret"
  28. out := RedactText(in)
  29. if strings.Contains(out, "your-client-secret") {
  30. t.Fatalf("expected secret redacted, got %q", out)
  31. }
  32. if !strings.Contains(out, "client_secret=***") {
  33. t.Fatalf("expected key redacted, got %q", out)
  34. }
  35. }
  36. func TestRedactText_ExtraKeyCacheUsesNormalizedSortedKey(t *testing.T) {
  37. clearExtraTextPatternCache()
  38. out1 := RedactText("custom_secret=abc", "Custom_Secret", " custom_secret ")
  39. out2 := RedactText("custom_secret=xyz", "custom_secret")
  40. if !strings.Contains(out1, "custom_secret=***") {
  41. t.Fatalf("expected custom key redacted in first call, got %q", out1)
  42. }
  43. if !strings.Contains(out2, "custom_secret=***") {
  44. t.Fatalf("expected custom key redacted in second call, got %q", out2)
  45. }
  46. if got := countExtraTextPatternCacheEntries(); got != 1 {
  47. t.Fatalf("expected 1 cached pattern set, got %d", got)
  48. }
  49. }
  50. func TestRedactText_DefaultPathDoesNotUseExtraCache(t *testing.T) {
  51. clearExtraTextPatternCache()
  52. out := RedactText("access_token=abc")
  53. if !strings.Contains(out, "access_token=***") {
  54. t.Fatalf("expected default key redacted, got %q", out)
  55. }
  56. if got := countExtraTextPatternCacheEntries(); got != 0 {
  57. t.Fatalf("expected extra cache to remain empty, got %d", got)
  58. }
  59. }
  60. func clearExtraTextPatternCache() {
  61. extraTextPatternCache.Range(func(key, value any) bool {
  62. extraTextPatternCache.Delete(key)
  63. return true
  64. })
  65. }
  66. func countExtraTextPatternCacheEntries() int {
  67. count := 0
  68. extraTextPatternCache.Range(func(key, value any) bool {
  69. count++
  70. return true
  71. })
  72. return count
  73. }