--- /dev/null
+*** Settings ***
+Suite Setup Rspamd Setup
+Suite Teardown Rspamd Teardown
+Library ${RSPAMD_TESTDIR}/lib/rspamd.py
+Resource ${RSPAMD_TESTDIR}/lib/rspamd.robot
+Variables ${RSPAMD_TESTDIR}/lib/vars.py
+
+*** Variables ***
+${CONFIG} ${RSPAMD_TESTDIR}/configs/ratelimit.conf
+${MESSAGE} ${RSPAMD_TESTDIR}/messages/ham.eml
+${RSPAMD_SCOPE} Suite
+${SETTINGS_REPLIES} {symbols_enabled = [RATELIMIT_CHECK, RATELIMIT_UPDATE]}
+
+*** Keywords ***
+Recipient Test
+ [Arguments] ${from} ${rcpt} ${howmany}
+ FOR ${index} IN RANGE ${howmany}
+ Scan File ${HAM_MESSAGE}
+ ... From=${from}
+ ... IP=1.1.1.1
+ ... Settings=${SETTINGS_RATELIMIT}
+ ... Rcpt=${rcpt}
+ Expect Action no action
+ END
+ Scan File ${HAM_MESSAGE}
+ ... From=${from}
+ ... IP=1.1.1.1
+ ... Settings=${SETTINGS_RATELIMIT}
+ ... Rcpt=${rcpt}
+ Expect Action soft reject
+ Sleep 1s
+ Scan File ${HAM_MESSAGE}
+ ... From=${from}
+ ... IP=1.1.1.1
+ ... Settings=${SETTINGS_RATELIMIT}
+ ... Rcpt=${rcpt}
+ Expect Action no action
+
+*** Test Cases ***
+CHECK BASIC
+ Recipient Test ${EMPTY} foobar@example.net 4
+
+CHECK SELECTOR
+ Recipient Test foo@example.net special@example.net 2
--- /dev/null
+.include(duplicate=append,priority=0) "{= env.TESTDIR =}/configs/plugins.conf"
+
+lua = "{= env.LUA_SCRIPT =}";
+redis {
+ servers = "{= env.REDIS_ADDR =}:{= env.REDIS_PORT =}";
+}
+
+ratelimit {
+ bounce_to_ip {
+ bucket {
+ burst = 4;
+ rate = "1 / 1s";
+ }
+ }
+ to_selector {
+ selector = "to:in{special@example.net}";
+ burst = 2;
+ rate = "1 / 1s";
+ }
+}