diff options
-rw-r--r-- | src/libserver/cfg_rcl.c | 13 | ||||
-rw-r--r-- | test/CMakeLists.txt | 19 | ||||
-rw-r--r-- | test/lua/rsa.lua | 45 | ||||
-rw-r--r-- | test/lua/test_rsa.lua | 39 | ||||
-rw-r--r-- | test/rspamd_lua_test.c | 81 | ||||
-rw-r--r-- | test/rspamd_test_suite.c | 5 | ||||
-rw-r--r-- | test/tests.h | 2 |
7 files changed, 159 insertions, 45 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 5ffd07ced..21dff7dd1 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -681,6 +681,7 @@ rspamd_rcl_lua_handler (struct rspamd_config *cfg, const ucl_object_t *obj, tmp2 = g_strdup (lua_src); lua_dir = dirname (tmp1); lua_file = basename (tmp2); + if (lua_dir && lua_file) { cur_dir = g_malloc (PATH_MAX); if (getcwd (cur_dir, PATH_MAX) != NULL && chdir (lua_dir) != -1) { @@ -694,7 +695,7 @@ rspamd_rcl_lua_handler (struct rspamd_config *cfg, const ucl_object_t *obj, lua_tostring (L, -1)); if (chdir (cur_dir) == -1) { msg_err ("cannot chdir to %s: %s", cur_dir, - strerror (errno));; + strerror (errno)); } g_free (cur_dir); g_free (tmp1); @@ -712,7 +713,7 @@ rspamd_rcl_lua_handler (struct rspamd_config *cfg, const ucl_object_t *obj, lua_tostring (L, -1)); if (chdir (cur_dir) == -1) { msg_err ("cannot chdir to %s: %s", cur_dir, - strerror (errno));; + strerror (errno)); } g_free (cur_dir); g_free (tmp1); @@ -724,7 +725,7 @@ rspamd_rcl_lua_handler (struct rspamd_config *cfg, const ucl_object_t *obj, g_set_error (err, CFG_RCL_ERROR, ENOENT, "cannot chdir to %s: %s", lua_src, strerror (errno)); if (chdir (cur_dir) == -1) { - msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno));; + msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno)); } g_free (cur_dir); g_free (tmp1); @@ -733,13 +734,15 @@ rspamd_rcl_lua_handler (struct rspamd_config *cfg, const ucl_object_t *obj, } if (chdir (cur_dir) == -1) { - msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno));; + msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno)); } g_free (cur_dir); g_free (tmp1); g_free (tmp2); } else { + g_free (tmp1); + g_free (tmp2); g_set_error (err, CFG_RCL_ERROR, ENOENT, "cannot find to %s: %s", lua_src, strerror (errno)); return FALSE; @@ -775,7 +778,7 @@ rspamd_rcl_add_module_path (struct rspamd_config *cfg, globbuf.gl_offs = 0; len = strlen (path) + sizeof ("*.lua"); pattern = g_malloc (len); - snprintf (pattern, len, "%s%s", path, "*.lua"); + rspamd_snprintf (pattern, len, "%s%s", path, "*.lua"); if (glob (pattern, GLOB_DOOFFS, NULL, &globbuf) == 0) { for (i = 0; i < globbuf.gl_pathc; i++) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f5743bd2f..b4fa018d2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,6 +11,7 @@ SET(TESTSRC rspamd_expression_test.c rspamd_shingles_test.c rspamd_upstream_test.c rspamd_http_test.c + rspamd_lua_test.c rspamd_test_suite.c) ADD_EXECUTABLE(rspamd-test EXCLUDE_FROM_ALL ${TESTSRC}) @@ -18,4 +19,20 @@ SET_TARGET_PROPERTIES(rspamd-test PROPERTIES LINKER_LANGUAGE C) SET_TARGET_PROPERTIES(rspamd-test PROPERTIES COMPILE_FLAGS "-DRSPAMD_TEST") TARGET_LINK_LIBRARIES(rspamd-test rspamd-server) -TARGET_LINK_LIBRARIES(rspamd-test ${RSPAMD_REQUIRED_LIBRARIES})
\ No newline at end of file +TARGET_LINK_LIBRARIES(rspamd-test ${RSPAMD_REQUIRED_LIBRARIES}) +TARGET_LINK_LIBRARIES(rspamd-test stemmer) + +IF(NOT "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") + # Also add dependencies for convenience + FILE(GLOB LUA_TESTS "${CMAKE_CURRENT_SOURCE_DIR}/lua/*") + FOREACH(_LF IN LISTS LUA_TESTS) + GET_FILENAME_COMPONENT(_NM "${_LF}" NAME) + SET(_DS "${CMAKE_CURRENT_BINARY_DIR}/lua/${_NM}") + ADD_CUSTOM_TARGET("${_NM}" COMMAND + ${CMAKE_COMMAND} -E copy_if_different ${_LF} ${_DS} + SOURCES "${_LF}" + ) + ADD_DEPENDENCIES(rspamd-test "${_NM}") + ENDFOREACH() + +ENDIF()
\ No newline at end of file diff --git a/test/lua/rsa.lua b/test/lua/rsa.lua new file mode 100644 index 000000000..75d07fd30 --- /dev/null +++ b/test/lua/rsa.lua @@ -0,0 +1,45 @@ +-- Test rsa signing + +describe("rsa signarture test", function() + local rsa_privkey = require "rspamd_rsa_privkey" + local rsa_pubkey = require "rspamd_rsa_pubkey" + local rsa_signature = require "rspamd_rsa_signature" + local rsa = require "rspamd_rsa" + local pubkey = 'testkey.pub' + local privkey = 'testkey' + local data = 'test.data' + local signature = 'test.sig' + + -- Signing test + local rsa_key = rsa_privkey.load(string.format('%s/%s', test_dir, privkey)) + + if not rsa_key then + return -1 + end + + local rsa_sig = rsa.sign_file(rsa_key, string.format('%s/%s', test_dir, data)) + + if not rsa_sig then + return -1 + end + + rsa_sig:save(string.format('%s/%s', test_dir, signature), true) + + -- Verifying test + rsa_key = rsa_pubkey.load(string.format('%s/%s', test_dir, pubkey)) + + if not rsa_key then + return -1 + end + + rsa_sig = rsa_signature.load(string.format('%s/%s', test_dir, signature)) + + if not rsa_sig then + return -1 + end + + if not rsa.verify_file(rsa_key, rsa_sig, string.format('%s/%s', test_dir, data)) then + return -1 + end + +end) diff --git a/test/lua/test_rsa.lua b/test/lua/test_rsa.lua deleted file mode 100644 index 83a6a9e45..000000000 --- a/test/lua/test_rsa.lua +++ /dev/null @@ -1,39 +0,0 @@ --- Test rsa signing - -local pubkey = 'testkey.pub' -local privkey = 'testkey' -local data = 'test.data' -local signature = 'test.sig' - --- Signing test -local rsa_key = rsa_privkey.load(string.format('%s/%s', test_dir, privkey)) - -if not rsa_key then - return -1 -end - -local rsa_sig = rsa.sign_file(rsa_key, string.format('%s/%s', test_dir, data)) - -if not rsa_sig then - return -1 -end - -rsa_sig:save(string.format('%s/%s', test_dir, signature), true) - --- Verifying test -rsa_key = rsa_pubkey.load(string.format('%s/%s', test_dir, pubkey)) - -if not rsa_key then - return -1 -end - -rsa_sig = rsa_signature.load(string.format('%s/%s', test_dir, signature)) - -if not rsa_sig then - return -1 -end - -if not rsa.verify_file(rsa_key, rsa_sig, string.format('%s/%s', test_dir, data)) then - return -1 -end - diff --git a/test/rspamd_lua_test.c b/test/rspamd_lua_test.c new file mode 100644 index 000000000..cd3b152cd --- /dev/null +++ b/test/rspamd_lua_test.c @@ -0,0 +1,81 @@ +/* Copyright (c) 2015, Vsevolod Stakhov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "main.h" +#include "util.h" +#include "lua/lua_common.h" + +static const char *lua_src = "./lua"; + +void +rspamd_lua_test_func (int argc, char **argv) +{ + lua_State *L = rspamd_lua_init (NULL); + gchar rp[PATH_MAX], path_buf[PATH_MAX]; + const gchar *old_path; + guint i; + + msg_info ("Starting lua tests"); + + if (realpath (lua_src, rp) == NULL) { + msg_err ("cannod find path %s: %s", lua_src, strerror (errno)); + g_assert (0); + } + + /* Set lua path */ + lua_getglobal (L, "package"); + lua_getfield (L, -1, "path"); + old_path = luaL_checkstring (L, -1); + + rspamd_snprintf (path_buf, sizeof (path_buf), "%s;%s/?.lua;%s/busted/?.lua", + old_path, rp, rp); + lua_pop (L, 1); + lua_pushstring (L, path_buf); + lua_setfield (L, -2, "path"); + lua_pop (L, 1); + + lua_getglobal (L, "arg"); + + if (lua_type (L, -1) != LUA_TTABLE) { + lua_newtable (L); + } + + for (i = 0; i < argc - 1; i ++) { + lua_pushinteger (L, i + 1); + lua_pushstring (L, argv[i]); + lua_settable (L, -3); + } + + lua_setglobal (L, "arg"); + lua_pop (L, 1); + + rspamd_snprintf (path_buf, sizeof (path_buf), + "require 'busted.runner'({ batch = true })"); + if (luaL_dostring (L, path_buf) != 0) { + rspamd_fprintf (stderr, "run test failed: %s", lua_tostring (L, -1)); + g_assert (0); + } + + exit (EXIT_SUCCESS); +} diff --git a/test/rspamd_test_suite.c b/test/rspamd_test_suite.c index 1be17611b..a70a0102f 100644 --- a/test/rspamd_test_suite.c +++ b/test/rspamd_test_suite.c @@ -13,6 +13,11 @@ main (int argc, char **argv) { struct rspamd_config *cfg; + if (argc > 0 && strcmp (argv[1], "lua") == 0) { + /* Special lua testing mode */ + rspamd_lua_test_func (argc - 1, &argv[2]); + } + g_test_init (&argc, &argv, NULL); rspamd_main = (struct rspamd_main *)g_malloc (sizeof (struct rspamd_main)); diff --git a/test/tests.h b/test/tests.h index 8f4d8b80f..ae69d9d96 100644 --- a/test/tests.h +++ b/test/tests.h @@ -41,4 +41,6 @@ void rspamd_shingles_test_func (void); void rspamd_http_test_func (void); +void rspamd_lua_test_func (int argc, char **argv); + #endif |