]> source.dussan.org Git - rspamd.git/commitdiff
[Test] Add unit test for message to ucl function
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 24 Nov 2021 20:45:27 +0000 (20:45 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 24 Nov 2021 20:45:27 +0000 (20:45 +0000)
lualib/lua_mime.lua
test/lua/unit/lua_mime.message_to_ucl.lua [new file with mode: 0644]

index 8100a4f3ed1f9909798dbabf9b14bd2ec072c6fe..fe82fb717285a17c8a2f9477ba59abcb29f706cf 100644 (file)
@@ -573,11 +573,14 @@ exports.modify_headers = function(task, hdr_alterations)
 end
 
 --[[[
--- @function lua_mime.message_to_ucl(task)
+-- @function lua_mime.message_to_ucl(task, [stringify_content])
 -- Exports a message to an ucl object
 --]]
-exports.message_to_ucl = function(task)
+exports.message_to_ucl = function(task, stringify_content)
   local E = {}
+
+  local maybe_stringify_f = stringify_content and
+    tostring or function(t) return t  end
   local result = {
     size = task:get_size(),
     digest = task:get_digest(),
@@ -613,7 +616,7 @@ exports.message_to_ucl = function(task)
         type = string.format('%s/%s', part:get_type()),
         detected_type = string.format('%s/%s', part:get_detected_type()),
         filename = part:get_filename(),
-        content = part:get_content(),
+        content = maybe_stringify_f(part:get_content()),
         headers =  part:get_headers(true) or E,
         boundary = part:get_enclosing_boundary()
       }
diff --git a/test/lua/unit/lua_mime.message_to_ucl.lua b/test/lua/unit/lua_mime.message_to_ucl.lua
new file mode 100644 (file)
index 0000000..c97f387
--- /dev/null
@@ -0,0 +1,188 @@
+
+--[=========[ *******************  message  ******************* ]=========]
+local msg = [[
+Received: from mail0.mindspring.com (unknown [1.1.1.1])
+       (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))
+       (No client certificate requested)
+       by mail.example.com (Postfix) with ESMTPS id 88A0C6B332
+       for <example@example.com>; Wed, 24 Nov 2021 19:05:43 +0000 (GMT)
+From: <>
+To: <nobody@example.com>
+Subject: test
+Content-Type: multipart/alternative;
+    boundary="_000_6be055295eab48a5af7ad4022f33e2d0_"
+
+--_000_6be055295eab48a5af7ad4022f33e2d0_
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 7bit
+
+Hello world
+
+
+--_000_6be055295eab48a5af7ad4022f33e2d0_
+Content-Type: text/html; charset="utf-8"
+
+<html><body>
+lol
+</html>
+]]
+
+context("Task piecewise split", function()
+  local rspamd_task = require "rspamd_task"
+  local rspamd_util = require "rspamd_util"
+  local rspamd_test_helper = require "rspamd_test_helper"
+  local lua_mime = require "lua_mime"
+  local ucl = require "ucl"
+
+  rspamd_test_helper.init_url_parser()
+  local cfg = rspamd_util.config_from_ucl(rspamd_test_helper.default_config(),
+      "INIT_URL,INIT_LIBS,INIT_SYMCACHE,INIT_VALIDATE,INIT_PRELOAD_MAPS")
+
+  test("Simple message split", function()
+    local res,task = rspamd_task.load_from_string(msg, cfg)
+
+    if not res or not task then
+      assert_true(false, "failed to load message")
+    end
+
+    task:process_message()
+
+    local expected_json = [[
+{
+    "parts": [
+        {
+            "content": "Hello world\n\n\n",
+            "size": 14,
+            "type": "text/plain",
+            "boundary": "_000_6be055295eab48a5af7ad4022f33e2d0_",
+            "detected_type": "text/plain",
+            "headers": [
+                [
+                    {
+                        "order": 0,
+                        "raw": "Content-Type: text/plain; charset=\"utf-8\"\n",
+                        "empty_separator": false,
+                        "value": "text/plain; charset=\"utf-8\"",
+                        "separator": " ",
+                        "decoded": "text/plain; charset=\"utf-8\"",
+                        "name": "Content-Type",
+                        "tab_separated": false
+                    }
+                ],
+                [
+                    {
+                        "order": 1,
+                        "raw": "Content-Transfer-Encoding: 7bit\n",
+                        "empty_separator": false,
+                        "value": "7bit",
+                        "separator": " ",
+                        "decoded": "7bit",
+                        "name": "Content-Transfer-Encoding",
+                        "tab_separated": false
+                    }
+                ]
+            ]
+        },
+        {
+            "content": "<html><body>\nlol\n</html>\n",
+            "size": 25,
+            "type": "text/html",
+            "boundary": "_000_6be055295eab48a5af7ad4022f33e2d0_",
+            "detected_type": "text/html",
+            "headers": [
+                [
+                    {
+                        "order": 0,
+                        "raw": "Content-Type: text/html; charset=\"utf-8\"\n",
+                        "empty_separator": false,
+                        "value": "text/html; charset=\"utf-8\"",
+                        "separator": " ",
+                        "decoded": "text/html; charset=\"utf-8\"",
+                        "name": "Content-Type",
+                        "tab_separated": false
+                    }
+                ]
+            ]
+        }
+    ],
+    "newlines": "lf",
+    "digest": "043cf1a314d0a1af95951d6aec932faf",
+    "envelope": [],
+    "size": 666,
+    "headers": [
+        [
+            {
+                "order": 0,
+                "raw": "Received: from mail0.mindspring.com (unknown [1.1.1.1])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby mail.example.com (Postfix) with ESMTPS id 88A0C6B332\n\tfor <example@example.com>; Wed, 24 Nov 2021 19:05:43 +0000 (GMT)\n",
+                "empty_separator": false,
+                "value": "from mail0.mindspring.com (unknown [1.1.1.1]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.example.com (Postfix) with ESMTPS id 88A0C6B332 for <example@example.com>; Wed, 24 Nov 2021 19:05:43 +0000 (GMT)",
+                "separator": " ",
+                "decoded": "from mail0.mindspring.com (unknown [1.1.1.1]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.example.com (Postfix) with ESMTPS id 88A0C6B332 for <example@example.com>; Wed, 24 Nov 2021 19:05:43 +0000 (GMT)",
+                "name": "Received",
+                "tab_separated": false
+            }
+        ],
+        [
+            {
+                "order": 1,
+                "raw": "From: <>\n",
+                "empty_separator": false,
+                "value": "<>",
+                "separator": " ",
+                "decoded": "<>",
+                "name": "From",
+                "tab_separated": false
+            }
+        ],
+        [
+            {
+                "order": 2,
+                "raw": "To: <nobody@example.com>\n",
+                "empty_separator": false,
+                "value": "<nobody@example.com>",
+                "separator": " ",
+                "decoded": "<nobody@example.com>",
+                "name": "To",
+                "tab_separated": false
+            }
+        ],
+        [
+            {
+                "order": 3,
+                "raw": "Subject: test\n",
+                "empty_separator": false,
+                "value": "test",
+                "separator": " ",
+                "decoded": "test",
+                "name": "Subject",
+                "tab_separated": false
+            }
+        ],
+        [
+            {
+                "order": 4,
+                "raw": "Content-Type: multipart/alternative;\n    boundary=\"_000_6be055295eab48a5af7ad4022f33e2d0_\"\n",
+                "empty_separator": false,
+                "value": "multipart/alternative; boundary=\"_000_6be055295eab48a5af7ad4022f33e2d0_\"",
+                "separator": " ",
+                "decoded": "multipart/alternative; boundary=\"_000_6be055295eab48a5af7ad4022f33e2d0_\"",
+                "name": "Content-Type",
+                "tab_separated": false
+            }
+        ]
+    ]
+}
+]]
+    local parser = ucl.parser()
+    local res = parser:parse_string(expected_json)
+    assert_true(res)
+    local expected = parser:get_object()
+    local ucl_object = lua_mime.message_to_ucl(task, true)
+    assert_rspamd_table_eq({
+      actual = ucl_object,
+      expect = expected
+    })
+    task:destroy()
+  end)
+
+end)
\ No newline at end of file