]> source.dussan.org Git - rspamd.git/commitdiff
[Test] Extend milter tests
authorAndrew Lewis <nerf@judo.za.org>
Mon, 12 Feb 2018 08:19:10 +0000 (10:19 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Mon, 12 Feb 2018 11:43:21 +0000 (13:43 +0200)
test/functional/cases/180_milter.robot
test/functional/configs/milter.conf
test/functional/lua/miltertest/combined.lua [new file with mode: 0644]
test/functional/lua/miltertest/data.lua [new file with mode: 0644]
test/functional/lua/miltertest/lib.lua [new file with mode: 0644]
test/functional/lua/miltertest/mt1.lua
test/functional/lua/miltertest/mt2.lua [new file with mode: 0644]
test/functional/lua/miltertest/mt3.lua [new file with mode: 0644]
test/functional/lua/miltertest/mt4.lua [new file with mode: 0644]
test/functional/lua/params.lua [new file with mode: 0644]

index b597914abef4298fbcb8d05dc0215c64cdf1d133..6e8f0c36497f9283d9bdb1c5a57a589488625fdd 100644 (file)
@@ -8,16 +8,33 @@ Variables       ${TESTDIR}/lib/vars.py
 
 *** Variables ***
 ${RSPAMD_SCOPE}  Suite
-${URL_TLD}       ${TESTDIR}/../lua/unit/test_tld.dat
+${URL_TLD}      ${TESTDIR}/../lua/unit/test_tld.dat
 
 *** Test Cases ***
-SIMPLE MILTER TEST
-  ${result} =  Run Process  miltertest  -Dport\=${PORT_PROXY}  -Dhost\=${LOCAL_ADDR}  -s  ${TESTDIR}/lua/miltertest/mt1.lua
-  Follow Rspamd Log
-  Should Match Regexp  ${result.stderr}  ^$
-  Should Match Regexp  ${result.stdout}  ^$
-  Should Be Equal As Integers  ${result.rc}  0  msg=${result.stdout}  values=false
+ACCEPT
+  Milter Test  mt1.lua
+
+REJECT
+  Milter Test  mt2.lua
+
+REWRITE SUBJECT
+  Milter Test  mt3.lua
+
+DEFER
+  Milter Test  mt4.lua
+
+COMBINED TEST
+  [Tags]  isbroken
+  Milter Test  combined.lua
 
 *** Keywords ***
 Milter Setup
   Generic Setup  CONFIG=${TESTDIR}/configs/milter.conf
+
+Milter Test
+  [Arguments]  ${mtlua}
+  ${result} =  Run Process  miltertest  -Dport\=${PORT_PROXY}  -Dhost\=${LOCAL_ADDR}  -s  ${TESTDIR}/lua/miltertest/${mtlua}
+  ...  cwd=${TESTDIR}/lua/miltertest
+  Follow Rspamd Log
+  Should Match Regexp  ${result.stderr}  ^$
+  Should Be Equal As Integers  ${result.rc}  0  msg=${result.stdout}  values=false
index 306ad511d4062d971da2e953bdee333fee5b8441..004bf8b5f088b605564afcc75770bb41517f37e6 100644 (file)
@@ -51,6 +51,7 @@ modules {
     path = "${TESTDIR}/../../src/plugins/lua/"
 }
 lua = "${INSTALLROOT}/share/rspamd/rules/rspamd.lua"
+lua = "${TESTDIR}/lua/params.lua"
 milter_headers {
        extended_spam_headers = true;
        skip_local = false;
diff --git a/test/functional/lua/miltertest/combined.lua b/test/functional/lua/miltertest/combined.lua
new file mode 100644 (file)
index 0000000..8919294
--- /dev/null
@@ -0,0 +1,20 @@
+-- Combine tests
+
+require './lib'
+require './data'
+
+setup()
+
+local old_setup = setup
+local old_teardown = teardown
+
+local empty_function = function() end
+setup = empty_function
+teardown = empty_function
+
+dofile('mt1.lua')
+dofile('mt2.lua')
+dofile('mt3.lua')
+dofile('mt4.lua')
+
+old_teardown()
diff --git a/test/functional/lua/miltertest/data.lua b/test/functional/lua/miltertest/data.lua
new file mode 100644 (file)
index 0000000..84b953f
--- /dev/null
@@ -0,0 +1,26 @@
+innocuous_hdrs = {
+  ['Message-ID'] = '<20180202155326.Horde.GfEWpxCo_Dip2xJswIpQNgK@example.org>',
+  ['From'] = 'Andrew Lewis <nerf@example.org>',
+  ['To'] = 'nerf@example.org',
+  ['Subject'] = 'innocuous test message',
+  ['User-Agent'] = 'Horde Application Framework 5',
+  ['Content-Type'] = 'text/plain; charset=utf-8; format=flowed; DelSp=Yes',
+  ['MIME-Version'] = '1.0',
+  ['Content-Disposition'] = 'inline',
+  ['Date'] = 'Fri, 02 Feb 2018 15:53:26 +0200',
+}
+
+default_hdrs = {
+  ['Subject'] = 'spam message',
+}
+
+innocuous_msg = 'Hello Rupert'
+
+gtube = [[lo
+
+XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
+
+thx]]
+
+gtube_add_header = string.gsub(gtube, "XJS", "YJS")
+gtube_rw_subject = string.gsub(gtube, "XJS", "ZJS")
diff --git a/test/functional/lua/miltertest/lib.lua b/test/functional/lua/miltertest/lib.lua
new file mode 100644 (file)
index 0000000..f7dc3cc
--- /dev/null
@@ -0,0 +1,107 @@
+function setup(c_ip, helo, hn)
+  if not c_ip then c_ip = "127.0.0.1" end
+  if not helo then helo = "it.is.i" end
+  if not hn then hn = "localhost" end
+  conn = mt.connect("inet:" .. port .. "@" .. host)
+  if conn == nil then
+    error "mt.connect() failed"
+  end
+  if mt.conninfo(conn, hn, c_ip) then
+    error "mt.conninfo() failed"
+  end
+  if mt.getreply(conn) ~= SMFIR_CONTINUE then
+    error "mt.conninfo() unexpected reply"
+  end
+  if mt.helo(conn, helo) then
+    error "mt.helo() failed"
+  end
+  if mt.getreply(conn) ~= SMFIR_CONTINUE then
+    error "mt.helo() unexpected reply"
+  end
+end
+
+function teardown()
+  mt.disconnect(conn)
+end
+
+function send_message(body, hdrs, id, sender, rcpts)
+  mt.macro(conn, SMFIC_MAIL, "i", id or "test-id")
+  if mt.mailfrom(conn, sender or "sender@example.com") then
+    error "mt.mailfrom() failed"
+  end
+  if mt.getreply(conn) ~= SMFIR_CONTINUE then
+    error "mt.mailfrom() unexpected reply"
+  end
+  if not rcpts then
+    rcpts = {"rcpt@example.com"}
+  end
+  for _, r in ipairs(rcpts) do
+    mt.rcptto(conn, r)
+  end
+  if not hdrs then
+    hdrs = default_hdrs
+  end
+  if not hdrs['From'] then
+    hdrs['From'] = sender or "sender@example.com"
+  end
+  for k, v in pairs(hdrs) do
+    if mt.header(conn, k, v) then
+      error (string.format("mt.header(%s) failed", k))
+    end
+  end
+  if mt.eoh(conn) then
+    error "mt.eoh() failed"
+  end
+  if mt.getreply(conn) ~= SMFIR_CONTINUE then
+    error "mt.eoh() unexpected reply"
+  end
+  if mt.bodystring(conn, body .. "\r\n") then
+    error "mt.bodystring() failed"
+  end
+  if mt.getreply(conn) ~= SMFIR_CONTINUE then
+    error "mt.bodystring() unexpected reply"
+  end
+  if mt.eom(conn) then
+    error "mt.eom() failed"
+  end
+end
+
+function check_accept()
+  local rc = mt.getreply(conn)
+  if rc ~= SMFIR_ACCEPT then
+    error (string.format("mt.eom() unexpected reply: %s", rc))
+  end
+end
+
+function check_gtube(code, ecode, msg)
+  if not mt.eom_check(conn, MT_SMTPREPLY, code or '554', ecode or '5.7.1', msg or 'Gtube pattern') then
+    error "mt.eom_check() failed"
+  end
+  local rc = mt.getreply(conn)
+  if rc ~= SMFIR_REPLYCODE then
+    error (string.format("mt.eom() unexpected reply: %s", rc))
+  end
+end
+
+function check_defer(code, ecode, msg)
+  if not mt.eom_check(conn, MT_SMTPREPLY, code or '451', ecode or '4.7.1', msg or 'Try much later') then
+    error "mt.eom_check() failed"
+  end
+  local rc = mt.getreply(conn)
+  if rc ~= SMFIR_REPLYCODE then
+    error (string.format("mt.eom() unexpected reply: %s", rc))
+  end
+end
+
+function check_subject_rw(subj, tmpl)
+  if not subj then
+    subj = default_hdrs['Subject']
+  end
+  if not tmpl then
+    tmpl = "*** SPAM *** %s"
+  end
+  local new_subj = string.format(tmpl, subj)
+  if not mt.eom_check(conn, MT_HDRCHANGE, "Subject", new_subj) then
+    error "subject not rewritten"
+  end
+end
index a6f6722deb165325b747e5f2427a3db2677abfe2..20aa3262ffd3e387f721dfab69b3924e9f46e2c7 100644 (file)
@@ -1,59 +1,11 @@
--- Test one simple interaction
+print('Check we will accept a message')
 
-conn = mt.connect("inet:" .. port .. "@" .. host)
-if conn == nil then
-  error "mt.connect() failed"
-end
-if mt.conninfo(conn, "localhost", "127.0.0.1") then
-  error "mt.conninfo() failed"
-end
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.conninfo() unexpected reply"
-end
+require './lib'
+require './data'
 
-if mt.helo(conn, "it.is.i") then
-  error "mt.helo() failed"
-end
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.helo() unexpected reply"
-end
-mt.macro(conn, SMFIC_MAIL, "i", "test-id")
-if mt.mailfrom(conn, "sender@example.com") then
-  error "mt.mailfrom() failed"
-end
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.mailfrom() unexpected reply"
-end
-mt.rcptto(conn, "rcpt@example.com")
+setup()
 
-if mt.header(conn, "From", "honest@sender") then
-  error "mt.header(From) failed"
-end
+send_message(innocuous_msg, innocuous_hdrs, 'test-id', 'nerf@example.org', {'nerf@example.org'})
+check_accept()
 
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.header(From) unexpected reply"
-end
-
-if mt.eoh(conn) then
-  error "mt.eoh() failed"
-end
-
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.eoh() unexpected reply"
-end
-
-if mt.bodystring(conn, "This is a simple test!\r\n") then
-  error "mt.bodystring() failed"
-end
-if mt.getreply(conn) ~= SMFIR_CONTINUE then
-  error "mt.bodystring() unexpected reply"
-end
-
-if mt.eom(conn) then
-  error "mt.eom() failed"
-end
-if mt.getreply(conn) ~= SMFIR_ACCEPT then
-  error "mt.eom() unexpected reply"
-end
-
-mt.disconnect(conn)
+teardown()
diff --git a/test/functional/lua/miltertest/mt2.lua b/test/functional/lua/miltertest/mt2.lua
new file mode 100644 (file)
index 0000000..56ea6f6
--- /dev/null
@@ -0,0 +1,11 @@
+print('Check we will reject a message')
+
+require './lib'
+require './data'
+
+setup()
+
+send_message(gtube)
+check_gtube()
+
+teardown()
diff --git a/test/functional/lua/miltertest/mt3.lua b/test/functional/lua/miltertest/mt3.lua
new file mode 100644 (file)
index 0000000..1fc1cc4
--- /dev/null
@@ -0,0 +1,12 @@
+print('Check we will rewrite subjects')
+
+require './lib'
+require './data'
+
+setup()
+
+send_message(gtube_rw_subject)
+check_accept()
+check_subject_rw()
+
+teardown()
diff --git a/test/functional/lua/miltertest/mt4.lua b/test/functional/lua/miltertest/mt4.lua
new file mode 100644 (file)
index 0000000..0fc69e4
--- /dev/null
@@ -0,0 +1,11 @@
+print('Check we will defer messages')
+
+require './lib'
+require './data'
+
+setup()
+
+send_message(innocuous_msg, innocuous_hdrs, 'test-id', 'defer@example.org', {'nerf@example.org'})
+check_defer()
+
+teardown()
diff --git a/test/functional/lua/params.lua b/test/functional/lua/params.lua
new file mode 100644 (file)
index 0000000..2846527
--- /dev/null
@@ -0,0 +1,80 @@
+rspamd_config.TEST_RCPT = {
+  callback = function(task)
+    local l = {}
+    local rcpts = task:get_recipients(1)
+    if not rcpts then return end
+    for _, r in ipairs(rcpts) do
+      table.insert(l, r['addr'])
+    end
+    table.sort(l)
+    local t = table.concat(l, ",")
+    return true, t
+  end
+}
+
+rspamd_config.TEST_HELO = {
+  callback = function(task)
+    local helo = task:get_helo()
+    if not helo then return end
+    return true, helo
+  end
+}
+
+rspamd_config.TEST_HOSTNAME = {
+  callback = function(task)
+    local h = task:get_hostname()
+    if not h then return end
+    return true, h
+  end
+}
+
+rspamd_config.TEST_SMTP_FROM = {
+  callback = function(task)
+    local f = task:get_from('smtp')
+    if not (f and f[1] and f[1].addr) then return end
+    return true, f[1].addr
+  end
+}
+
+rspamd_config.TEST_MTA_TAG = {
+  callback = function(task)
+    local h = task:get_request_header('MTA-Tag')
+    if not h then return end
+    return true, tostring(h)
+  end
+}
+
+rspamd_config.TEST_USER = {
+  callback = function(task)
+    local u = task:get_user()
+    if not u then return end
+    return true, u
+  end
+}
+
+rspamd_config.TEST_QUEUEID = {
+  callback = function(task)
+    local q = task:get_queue_id()
+    if not q then return end
+    return true, q
+  end
+}
+
+rspamd_config.TEST_IPADDR = {
+  callback = function(task)
+    local i = task:get_from_ip()
+    if not (i and i:is_valid()) then return end
+    return true, tostring(i)
+  end
+}
+
+rspamd_config.FORCE_DEFER = {
+  callback = function(task)
+    local f = task:get_from('smtp')
+    if not (f and f[1] and f[1].addr) then return end
+    if f[1].addr == "defer@example.org" then
+      task:set_pre_result('soft reject', 'Try much later')
+      return true
+    end
+  end
+}