]> source.dussan.org Git - rspamd.git/commitdiff
Write unit test for redis substitution and fix a bug found.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 Feb 2015 22:23:28 +0000 (22:23 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 Feb 2015 22:23:28 +0000 (22:23 +0000)
src/libstat/backends/redis.c
test/lua/unit/redis_stat.lua [new file with mode: 0644]

index 9d05bc591eac61139214666dd66b7a40dbd4021f..1b35802a178b5da77343f9d3250cf779bac9c610 100644 (file)
@@ -50,7 +50,10 @@ struct redis_stat_runtime {
 
 #define GET_TASK_ELT(task, elt) (task == NULL ? NULL : (task)->elt)
 
-static gsize
+/*
+ * Non-static for lua unit testing
+ */
+gsize
 rspamd_redis_expand_object (const gchar *pattern,
                struct rspamd_statfile_config *stcf,
                struct rspamd_task *task,
@@ -158,7 +161,8 @@ rspamd_redis_expand_object (const gchar *pattern,
 
        *target = rspamd_mempool_alloc (task->task_pool, tlen + 1);
        d = *target;
-       end = d + tlen;
+       end = d + tlen + 1;
+       d[tlen] = '\0';
        p = pattern;
        state = just_char;
 
@@ -245,8 +249,6 @@ rspamd_redis_expand_object (const gchar *pattern,
                }
        }
 
-       *d = '\0';
-
        return tlen;
 }
 
diff --git a/test/lua/unit/redis_stat.lua b/test/lua/unit/redis_stat.lua
new file mode 100644 (file)
index 0000000..8f772ae
--- /dev/null
@@ -0,0 +1,39 @@
+
+    
+context("Redis statistics unit tests", function()
+  local task = require("rspamd_task")
+  local ffi = require("ffi")
+  ffi.cdef[[
+  struct rspamd_statfile_config {
+    const char *symbol;
+    const char *label;
+    void *opts;
+    int is_spam;
+    const char *backend;
+    void *data;
+  };
+  unsigned long rspamd_redis_expand_object(const char *pattern,
+    struct rspamd_statfile_config *stcf,
+    struct rspamd_task *task,
+    char **target);
+  struct rspamd_task * rspamd_task_new(struct rspamd_worker *worker);
+  ]]
+
+  test("Substitute redis values", function()
+    local cases = {
+      {"%s%l", "symbollabel"},
+      {"%s%%", "symbol%"},
+      {"%s%u", "symbol"},
+      {"%s%W", "symbolW"}
+    }
+    local stcf = ffi.new("struct rspamd_statfile_config", 
+      {symbol="symbol",label="label"})
+    local t = ffi.C.rspamd_task_new(nil)
+    for _,c in ipairs(cases) do
+      local pbuf = ffi.new 'char *[1]'
+      local sz = ffi.C.rspamd_redis_expand_object(c[1], stcf, t, pbuf)
+      local s = ffi.string(pbuf[0])
+      assert_equal(s, c[2])
+    end
+  end)
+end)
\ No newline at end of file