浏览代码

Tests: Add tests for the quoted printable decoder

Luke 4 年之前
父节点
当前提交
a00b5fc7b7
共有 3 个文件被更改,包括 55 次插入0 次删除
  1. 1 0
      Tests/CMakeLists.txt
  2. 5 0
      Tests/LibIMAP/CMakeLists.txt
  3. 49 0
      Tests/LibIMAP/TestQuotedPrintable.cpp

+ 1 - 0
Tests/CMakeLists.txt

@@ -6,6 +6,7 @@ add_subdirectory(LibCore)
 add_subdirectory(LibCpp)
 add_subdirectory(LibCpp)
 add_subdirectory(LibELF)
 add_subdirectory(LibELF)
 add_subdirectory(LibGfx)
 add_subdirectory(LibGfx)
+add_subdirectory(LibIMAP)
 add_subdirectory(LibJS)
 add_subdirectory(LibJS)
 add_subdirectory(LibM)
 add_subdirectory(LibM)
 add_subdirectory(LibPthread)
 add_subdirectory(LibPthread)

+ 5 - 0
Tests/LibIMAP/CMakeLists.txt

@@ -0,0 +1,5 @@
+file(GLOB TEST_SOURCES CONFIGURE_DEPENDS "*.cpp")
+
+foreach(source ${TEST_SOURCES})
+    serenity_test(${source} LibIMAP LIBS LibIMAP)
+endforeach()

+ 49 - 0
Tests/LibIMAP/TestQuotedPrintable.cpp

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/CharacterTypes.h>
+#include <LibIMAP/QuotedPrintable.h>
+#include <LibTest/TestCase.h>
+
+TEST_CASE(test_decode)
+{
+    auto decode_equal = [](const char* input, const char* expected) {
+        auto decoded = IMAP::decode_quoted_printable(StringView(input));
+        EXPECT(String::copy(decoded) == String(expected));
+    };
+
+    auto decode_equal_byte_buffer = [](const char* input, const char* expected, size_t expected_length) {
+        auto decoded = IMAP::decode_quoted_printable(StringView(input));
+        EXPECT(decoded == ByteBuffer::copy(expected, expected_length));
+    };
+
+    decode_equal("hello world", "hello world");
+    decode_equal("=3D", "=");
+    decode_equal("hello=\r\n world", "hello world");
+    decode_equal("=68=65=6C=6C=6F=20=\r\n=77=6F=72=6C=64", "hello world");
+
+    // Doesn't mistake hex sequences without a preceding '=' as an escape sequence.
+    decode_equal("4A=4B=4C4D", "4AKL4D");
+
+    // Allows lowercase escape sequences.
+    decode_equal("=4a=4b=4c=4d=4e=4f", "JKLMNO");
+
+    // Bytes for U+1F41E LADY BEETLE
+    decode_equal_byte_buffer("=F0=9F=90=9E", "\xF0\x9F\x90\x9E", 4);
+
+    // Illegal characters. If these aren't escaped, they are simply ignored.
+    // Illegal characters are:
+    // - ASCII control bytes that aren't tab, carriage return or new line
+    // - Any byte above 0x7E
+    StringBuilder illegal_character_builder;
+    for (u16 byte = 0; byte <= 0xFF; ++byte) {
+        if (byte > 0x7E || (is_ascii_control(byte) && byte != '\t' && byte != '\r' && byte != '\n'))
+            illegal_character_builder.append(byte);
+    }
+
+    auto illegal_character_decode = IMAP::decode_quoted_printable(illegal_character_builder.to_string());
+    EXPECT(illegal_character_decode.is_empty());
+}