diff options
Diffstat (limited to 'test/functional/cases/110_statistics/multiclass_lib.robot')
-rw-r--r-- | test/functional/cases/110_statistics/multiclass_lib.robot | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/test/functional/cases/110_statistics/multiclass_lib.robot b/test/functional/cases/110_statistics/multiclass_lib.robot new file mode 100644 index 000000000..9f70e05fb --- /dev/null +++ b/test/functional/cases/110_statistics/multiclass_lib.robot @@ -0,0 +1,169 @@ +*** Settings *** +Library OperatingSystem +Resource lib.robot + +*** Variables *** +${CONFIG} ${RSPAMD_TESTDIR}/configs/multiclass_bayes.conf +${MESSAGE_HAM} ${RSPAMD_TESTDIR}/messages/ham.eml +${MESSAGE_SPAM} ${RSPAMD_TESTDIR}/messages/spam_message.eml +${MESSAGE_NEWSLETTER} ${RSPAMD_TESTDIR}/messages/newsletter.eml +${REDIS_SCOPE} Suite +${RSPAMD_REDIS_SERVER} null +${RSPAMD_SCOPE} Suite +${RSPAMD_STATS_BACKEND} redis +${RSPAMD_STATS_HASH} null +${RSPAMD_STATS_KEY} null +${RSPAMD_STATS_PER_USER} ${EMPTY} + +*** Keywords *** +Learn Multiclass + [Arguments] ${user} ${class} ${message} + # Extract filename from message path for queue-id + ${path} ${filename} = Split Path ${message} + IF "${user}" + ${result} = Run Rspamc -d ${user} -h ${RSPAMD_LOCAL_ADDR}:${RSPAMD_PORT_CONTROLLER} learn_class:${class} ${message} + ELSE + ${result} = Run Rspamc -h ${RSPAMD_LOCAL_ADDR}:${RSPAMD_PORT_CONTROLLER} learn_class:${class} ${message} + END + Check Rspamc ${result} + +Learn Multiclass Legacy + [Arguments] ${user} ${class} ${message} + # Test backward compatibility with old learn_spam/learn_ham commands + # Extract filename from message path for queue-id + ${path} ${filename} = Split Path ${message} + IF "${user}" + ${result} = Run Rspamc -d ${user} -h ${RSPAMD_LOCAL_ADDR}:${RSPAMD_PORT_CONTROLLER} learn_${class} ${message} + ELSE + ${result} = Run Rspamc -h ${RSPAMD_LOCAL_ADDR}:${RSPAMD_PORT_CONTROLLER} learn_${class} ${message} + END + Check Rspamc ${result} + +Multiclass Basic Learn Test + [Arguments] ${user}=${EMPTY} + Set Suite Variable ${RSPAMD_STATS_LEARNTEST} 0 + Set Test Variable ${kwargs} &{EMPTY} + IF "${user}" + Set To Dictionary ${kwargs} Deliver-To=${user} + END + + # Learn all classes + Learn Multiclass ${user} spam ${MESSAGE_SPAM} + Learn Multiclass ${user} ham ${MESSAGE_HAM} + Learn Multiclass ${user} newsletter ${MESSAGE_NEWSLETTER} + + # Test classification + Scan File ${MESSAGE_SPAM} &{kwargs} + Expect Symbol BAYES_SPAM + + Scan File ${MESSAGE_HAM} &{kwargs} + Expect Symbol BAYES_HAM + + Scan File ${MESSAGE_NEWSLETTER} &{kwargs} + Expect Symbol BAYES_NEWSLETTER + + Set Suite Variable ${RSPAMD_STATS_LEARNTEST} 1 + +Multiclass Legacy Compatibility Test + [Arguments] ${user}=${EMPTY} + Set Test Variable ${kwargs} &{EMPTY} + IF "${user}" + Set To Dictionary ${kwargs} Deliver-To=${user} + END + + # Test legacy learn_spam and learn_ham commands still work + Learn Multiclass Legacy ${user} spam ${MESSAGE_SPAM} + Learn Multiclass Legacy ${user} ham ${MESSAGE_HAM} + + # Should still classify correctly + Scan File ${MESSAGE_SPAM} &{kwargs} + Expect Symbol BAYES_SPAM + + Scan File ${MESSAGE_HAM} &{kwargs} + Expect Symbol BAYES_HAM + +Multiclass Relearn Test + [Arguments] ${user}=${EMPTY} + IF ${RSPAMD_STATS_LEARNTEST} == 0 + Fail "Learn test was not run" + END + + Set Test Variable ${kwargs} &{EMPTY} + IF "${user}" + Set To Dictionary ${kwargs} Deliver-To=${user} + END + + # Relearn spam message as ham + Learn Multiclass ${user} ham ${MESSAGE_SPAM} + + # Should now classify as ham or at least not spam + Scan File ${MESSAGE_SPAM} &{kwargs} + ${pass} = Run Keyword And Return Status Expect Symbol BAYES_HAM + IF ${pass} + Pass Execution Successfully reclassified spam as ham + END + Do Not Expect Symbol BAYES_SPAM + +Multiclass Cross-Learn Test + [Arguments] ${user}=${EMPTY} + Set Test Variable ${kwargs} &{EMPTY} + IF "${user}" + Set To Dictionary ${kwargs} Deliver-To=${user} + END + + # Learn newsletter message as ham to test cross-class learning + Learn Multiclass ${user} ham ${MESSAGE_NEWSLETTER} + + # Should classify as ham, not newsletter (since we trained it as ham) + Scan File ${MESSAGE_NEWSLETTER} &{kwargs} + Expect Symbol BAYES_HAM + Do Not Expect Symbol BAYES_NEWSLETTER + +Multiclass Unlearn Test + [Arguments] ${user}=${EMPTY} + Set Test Variable ${kwargs} &{EMPTY} + IF "${user}" + Set To Dictionary ${kwargs} Deliver-To=${user} + END + + # First learn spam + Learn Multiclass ${user} spam ${MESSAGE_SPAM} + Scan File ${MESSAGE_SPAM} &{kwargs} + Expect Symbol BAYES_SPAM + + # Then unlearn spam (learn as ham) + Learn Multiclass ${user} ham ${MESSAGE_SPAM} + + # Should no longer classify as spam + Scan File ${MESSAGE_SPAM} &{kwargs} + Do Not Expect Symbol BAYES_SPAM + +Check Multiclass Results + [Arguments] ${result} ${expected_class} + # Check that scan result contains expected class information + Should Contain ${result.stdout} BAYES_${expected_class.upper()} + # Check for multiclass result format [class_name] + Should Match Regexp ${result.stdout} BAYES_${expected_class.upper()}.*\\[${expected_class}\\] + +Multiclass Stats Test + # Check that rspamc stat shows learning counts for all classes + ${result} = Run Rspamc -h ${RSPAMD_LOCAL_ADDR}:${RSPAMD_PORT_CONTROLLER} stat + # Don't use Check Rspamc for stat command as it expects JSON success format + Should Be Equal As Integers ${result.rc} 0 + + # Should show statistics for all classes + Should Contain ${result.stdout} BAYES_SPAM + Should Contain ${result.stdout} BAYES_HAM + Should Contain ${result.stdout} BAYES_NEWSLETTER + +Multiclass Configuration Migration Test + # Test that old binary config can be automatically migrated + Set Test Variable ${binary_config} ${RSPAMD_TESTDIR}/configs/stats.conf + + # Start with binary config + ${result} = Run Rspamc --config ${binary_config} stat + Check Rspamc ${result} + + # Should show deprecation warning but work + Should Contain ${result.stderr} deprecated ignore_case=True + |