decoder_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package utf7_test
  2. import (
  3. "github.com/Jinnrry/pmail/utils/utf7"
  4. "strings"
  5. "testing"
  6. )
  7. var decode = []struct {
  8. in string
  9. out string
  10. ok bool
  11. }{
  12. // Basics (the inverse test on encode checks other valid inputs)
  13. {"", "", true},
  14. {"abc", "abc", true},
  15. {"&-abc", "&abc", true},
  16. {"abc&-", "abc&", true},
  17. {"a&-b&-c", "a&b&c", true},
  18. {"&ABk-", "\x19", true},
  19. {"&AB8-", "\x1F", true},
  20. {"ABk-", "ABk-", true},
  21. {"&-,&-&AP8-&-", "&,&\u00FF&", true},
  22. {"&-&-,&AP8-&-", "&&,\u00FF&", true},
  23. {"abc &- &AP8A,wD,- &- xyz", "abc & \u00FF\u00FF\u00FF & xyz", true},
  24. // Illegal code point in ASCII
  25. {"\x00", "", false},
  26. {"\x1F", "", false},
  27. {"abc\n", "", false},
  28. {"abc\x7Fxyz", "", false},
  29. // Invalid UTF-8
  30. {"\xc3\x28", "", false},
  31. {"\xe2\x82\x28", "", false},
  32. // Invalid Base64 alphabet
  33. {"&/+8-", "", false},
  34. {"&*-", "", false},
  35. {"&ZeVnLIqe -", "", false},
  36. // CR and LF in Base64
  37. {"&ZeVnLIqe\r\n-", "", false},
  38. {"&ZeVnLIqe\r\n\r\n-", "", false},
  39. {"&ZeVn\r\n\r\nLIqe-", "", false},
  40. // Padding not stripped
  41. {"&AAAAHw=-", "", false},
  42. {"&AAAAHw==-", "", false},
  43. {"&AAAAHwB,AIA=-", "", false},
  44. {"&AAAAHwB,AIA==-", "", false},
  45. // One byte short
  46. {"&2A-", "", false},
  47. {"&2ADc-", "", false},
  48. {"&AAAAHwB,A-", "", false},
  49. {"&AAAAHwB,A=-", "", false},
  50. {"&AAAAHwB,A==-", "", false},
  51. {"&AAAAHwB,A===-", "", false},
  52. {"&AAAAHwB,AI-", "", false},
  53. {"&AAAAHwB,AI=-", "", false},
  54. {"&AAAAHwB,AI==-", "", false},
  55. // Implicit shift
  56. {"&", "", false},
  57. {"&Jjo", "", false},
  58. {"Jjo&", "", false},
  59. {"&Jjo&", "", false},
  60. {"&Jjo!", "", false},
  61. {"&Jjo+", "", false},
  62. {"abc&Jjo", "", false},
  63. // Null shift
  64. {"&AGE-&Jjo-", "", false},
  65. {"&U,BTFw-&ZeVnLIqe-", "", false},
  66. // Long input with Base64 at the end
  67. {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &2D3eCg- &2D3eCw- &2D3eDg-",
  68. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \U0001f60a \U0001f60b \U0001f60e", true},
  69. // Long input in Base64 between short ASCII
  70. {"00000000000000000000 &MEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEIwQjBCMEI- 00000000000000000000",
  71. "00000000000000000000 " + strings.Repeat("\U00003042", 37) + " 00000000000000000000", true},
  72. // ASCII in Base64
  73. {"&AGE-", "", false}, // "a"
  74. {"&ACY-", "", false}, // "&"
  75. {"&AGgAZQBsAGwAbw-", "", false}, // "hello"
  76. {"&JjoAIQ-", "", false}, // "\u263a!"
  77. // Bad surrogate
  78. {"&2AA-", "", false}, // U+D800
  79. {"&2AD-", "", false}, // U+D800
  80. {"&3AA-", "", false}, // U+DC00
  81. {"&2AAAQQ-", "", false}, // U+D800 'A'
  82. {"&2AD,,w-", "", false}, // U+D800 U+FFFF
  83. {"&3ADYAA-", "", false}, // U+DC00 U+D800
  84. // Chinese
  85. {"&V4NXPpCuTvY-", "垃圾邮件", true},
  86. {"&UXZO1mWHTvZZOQ-", "其他文件夹", true},
  87. }
  88. func TestDecoder(t *testing.T) {
  89. for _, test := range decode {
  90. out, err := utf7.Decode(test.in)
  91. if out != test.out {
  92. t.Errorf("UTF7Decode(%+q) expected %+q; got %+q", test.in, test.out, out)
  93. }
  94. if test.ok {
  95. if err != nil {
  96. t.Errorf("UTF7Decode(%+q) unexpected error; %v", test.in, err)
  97. }
  98. } else if err == nil {
  99. t.Errorf("UTF7Decode(%+q) expected error", test.in)
  100. }
  101. }
  102. }