test-dict-sql.c (dovecot-2.3.16) | : | test-dict-sql.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 12 | skipping to change at line 12 | |||
#include "lib.h" | #include "lib.h" | |||
#include "test-lib.h" | #include "test-lib.h" | |||
#include "sql-api.h" | #include "sql-api.h" | |||
#include "dict.h" | #include "dict.h" | |||
#include "dict-private.h" | #include "dict-private.h" | |||
#include "dict-sql.h" | #include "dict-sql.h" | |||
#include "dict-sql-private.h" | #include "dict-sql-private.h" | |||
#include "driver-test.h" | #include "driver-test.h" | |||
struct dict_op_settings dict_op_settings = { | ||||
.username = "testuser", | ||||
}; | ||||
static void test_setup(struct dict **dict_r) | static void test_setup(struct dict **dict_r) | |||
{ | { | |||
const char *error = NULL; | const char *error = NULL; | |||
struct dict_settings set = { | struct dict_settings set = { | |||
.username = "testuser", | ||||
.base_dir = "." | .base_dir = "." | |||
}; | }; | |||
struct dict *dict = NULL; | struct dict *dict = NULL; | |||
if (dict_init("mysql:" DICT_SRC_DIR "/dict.conf", &set, &dict, &error) < 0) | if (dict_init("mysql:" DICT_SRC_DIR "/dict.conf", &set, &dict, &error) < 0) | |||
i_fatal("cannot initialize dict: %s", error); | i_fatal("cannot initialize dict: %s", error); | |||
*dict_r = dict; | *dict_r = dict; | |||
} | } | |||
skipping to change at line 59 | skipping to change at line 62 | |||
.rows = 1, | .rows = 1, | |||
.cols = 1, | .cols = 1, | |||
.col_names = (const char *[]){"value", NULL}, | .col_names = (const char *[]){"value", NULL}, | |||
.row_data = (const char **[]){(const char*[]){"one", NULL}}, | .row_data = (const char **[]){(const char*[]){"one", NULL}}, | |||
}; | }; | |||
struct test_driver_result res = { | struct test_driver_result res = { | |||
.nqueries = 1, | .nqueries = 1, | |||
.queries = (const char *[]){"SELECT value FROM table WHERE a = 'h ello' AND b = 'world'", NULL}, | .queries = (const char *[]){"SELECT value FROM table WHERE a = 'h ello' AND b = 'world'", NULL}, | |||
.result = &rset, | .result = &rset, | |||
}; | }; | |||
const struct dict_op_settings set = { | ||||
.username = "testuser", | ||||
}; | ||||
struct dict *dict; | struct dict *dict; | |||
pool_t pool = pool_datastack_create(); | pool_t pool = pool_datastack_create(); | |||
test_begin("dict lookup one"); | test_begin("dict lookup one"); | |||
test_setup(&dict); | test_setup(&dict); | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
test_assert(dict_lookup(dict, pool, "shared/dictmap/hello/world", &value, &error) == 1); | test_assert(dict_lookup(dict, &set, pool, "shared/dictmap/hello/world", & value, &error) == 1); | |||
test_assert_strcmp(value, "one"); | test_assert_strcmp(value, "one"); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_lookup failed: %s", error); | i_error("dict_lookup failed: %s", error); | |||
test_teardown(&dict); | test_teardown(&dict); | |||
test_end(); | test_end(); | |||
} | } | |||
static void test_atomic_inc(void) | static void test_atomic_inc(void) | |||
{ | { | |||
const char *error; | const char *error; | |||
struct test_driver_result res = { | struct test_driver_result res = { | |||
.nqueries = 3, | .nqueries = 3, | |||
.queries = (const char *[]){ | .queries = (const char *[]){ | |||
"UPDATE counters SET value=value+128 WHERE class = 'globa l' AND name = 'counter'", | "UPDATE counters SET value=value+128 WHERE class = 'globa l' AND name = 'counter'", | |||
"UPDATE quota SET bytes=bytes+128,count=count+1 WHERE use rname = 'testuser'", | "UPDATE quota SET bytes=bytes+128,count=count+1 WHERE use rname = 'testuser'", | |||
"UPDATE quota SET bytes=bytes+128,count=count+1,folders=f olders+123 WHERE username = 'testuser'", | "UPDATE quota SET bytes=bytes+128,count=count+1,folders=f olders+123 WHERE username = 'testuser'", | |||
NULL}, | NULL}, | |||
.result = NULL, | .result = NULL, | |||
}; | }; | |||
struct dict_op_settings set = { | ||||
.username = "testuser", | ||||
}; | ||||
struct dict *dict; | struct dict *dict; | |||
test_begin("dict atomic inc"); | test_begin("dict atomic inc"); | |||
test_setup(&dict); | test_setup(&dict); | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
/* 1 field */ | /* 1 field */ | |||
struct dict_transaction_context *ctx = dict_transaction_begin(dict); | struct dict_transaction_context *ctx = dict_transaction_begin(dict, &set) ; | |||
dict_atomic_inc(ctx, "shared/counters/global/counter", 128); | dict_atomic_inc(ctx, "shared/counters/global/counter", 128); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 0); | test_assert(dict_transaction_commit(&ctx, &error) == 0); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
error = NULL; | error = NULL; | |||
/* 2 fields */ | /* 2 fields */ | |||
ctx = dict_transaction_begin(dict); | ctx = dict_transaction_begin(dict, &set); | |||
dict_atomic_inc(ctx, "priv/quota/bytes", 128); | dict_atomic_inc(ctx, "priv/quota/bytes", 128); | |||
dict_atomic_inc(ctx, "priv/quota/count", 1); | dict_atomic_inc(ctx, "priv/quota/count", 1); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 0); | test_assert(dict_transaction_commit(&ctx, &error) == 0); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
error = NULL; | error = NULL; | |||
/* 3 fields */ | /* 3 fields */ | |||
ctx = dict_transaction_begin(dict); | ctx = dict_transaction_begin(dict, &set); | |||
dict_atomic_inc(ctx, "priv/quota/bytes", 128); | dict_atomic_inc(ctx, "priv/quota/bytes", 128); | |||
dict_atomic_inc(ctx, "priv/quota/count", 1); | dict_atomic_inc(ctx, "priv/quota/count", 1); | |||
dict_atomic_inc(ctx, "priv/quota/folders", 123); | dict_atomic_inc(ctx, "priv/quota/folders", 123); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 0); | test_assert(dict_transaction_commit(&ctx, &error) == 0); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
test_teardown(&dict); | test_teardown(&dict); | |||
test_end(); | test_end(); | |||
} | } | |||
skipping to change at line 144 | skipping to change at line 153 | |||
.result = NULL, | .result = NULL, | |||
}; | }; | |||
struct dict *dict; | struct dict *dict; | |||
test_begin("dict set"); | test_begin("dict set"); | |||
test_setup(&dict); | test_setup(&dict); | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
/* 1 field */ | /* 1 field */ | |||
struct dict_transaction_context *ctx = dict_transaction_begin(dict); | struct dict_transaction_context *ctx = dict_transaction_begin(dict, &dict _op_settings); | |||
dict_set(ctx, "shared/counters/global/counter", "128"); | dict_set(ctx, "shared/counters/global/counter", "128"); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 1); | test_assert(dict_transaction_commit(&ctx, &error) == 1); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
error = NULL; | error = NULL; | |||
/* 2 fields */ | /* 2 fields */ | |||
ctx = dict_transaction_begin(dict); | ctx = dict_transaction_begin(dict, &dict_op_settings); | |||
dict_set(ctx, "priv/quota/bytes", "128"); | dict_set(ctx, "priv/quota/bytes", "128"); | |||
dict_set(ctx, "priv/quota/count", "1"); | dict_set(ctx, "priv/quota/count", "1"); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 1); | test_assert(dict_transaction_commit(&ctx, &error) == 1); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
error = NULL; | error = NULL; | |||
/* 3 fields */ | /* 3 fields */ | |||
ctx = dict_transaction_begin(dict); | ctx = dict_transaction_begin(dict, &dict_op_settings); | |||
dict_set(ctx, "priv/quota/bytes", "128"); | dict_set(ctx, "priv/quota/bytes", "128"); | |||
dict_set(ctx, "priv/quota/count", "1"); | dict_set(ctx, "priv/quota/count", "1"); | |||
dict_set(ctx, "priv/quota/folders", "123"); | dict_set(ctx, "priv/quota/folders", "123"); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 1); | test_assert(dict_transaction_commit(&ctx, &error) == 1); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
test_teardown(&dict); | test_teardown(&dict); | |||
test_end(); | test_end(); | |||
} | } | |||
skipping to change at line 192 | skipping to change at line 201 | |||
NULL}, | NULL}, | |||
.result = NULL, | .result = NULL, | |||
}; | }; | |||
struct dict *dict; | struct dict *dict; | |||
test_begin("dict unset"); | test_begin("dict unset"); | |||
test_setup(&dict); | test_setup(&dict); | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
struct dict_transaction_context *ctx = dict_transaction_begin(dict); | struct dict_transaction_context *ctx = dict_transaction_begin(dict, &dict _op_settings); | |||
dict_unset(ctx, "shared/counters/global/counter"); | dict_unset(ctx, "shared/counters/global/counter"); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 1); | test_assert(dict_transaction_commit(&ctx, &error) == 1); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
error = NULL; | error = NULL; | |||
ctx = dict_transaction_begin(dict); | ctx = dict_transaction_begin(dict, &dict_op_settings); | |||
dict_unset(ctx, "priv/quota/bytes"); | dict_unset(ctx, "priv/quota/bytes"); | |||
dict_unset(ctx, "priv/quota/count"); | dict_unset(ctx, "priv/quota/count"); | |||
test_assert(dict_transaction_commit(&ctx, &error) == 1); | test_assert(dict_transaction_commit(&ctx, &error) == 1); | |||
if (error != NULL) | if (error != NULL) | |||
i_error("dict_transaction_commit failed: %s", error); | i_error("dict_transaction_commit failed: %s", error); | |||
test_teardown(&dict); | test_teardown(&dict); | |||
test_end(); | test_end(); | |||
} | } | |||
static void test_iterate(void) | static void test_iterate(void) | |||
skipping to change at line 238 | skipping to change at line 247 | |||
.result = &rset, | .result = &rset, | |||
}; | }; | |||
struct dict *dict; | struct dict *dict; | |||
test_begin("dict iterate"); | test_begin("dict iterate"); | |||
test_setup(&dict); | test_setup(&dict); | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
struct dict_iterate_context *iter = | struct dict_iterate_context *iter = | |||
dict_iterate_init(dict, "shared/counters/global/counter", | dict_iterate_init(dict, &dict_op_settings, "shared/counters/globa l/counter", | |||
DICT_ITERATE_FLAG_EXACT_KEY); | DICT_ITERATE_FLAG_EXACT_KEY); | |||
size_t idx = 0; | size_t idx = 0; | |||
while(dict_iterate(iter, &key, &value)) { | while(dict_iterate(iter, &key, &value)) { | |||
i_assert(idx < rset.rows); | i_assert(idx < rset.rows); | |||
test_assert_strcmp_idx(key, "shared/counters/global/counter", idx ); | test_assert_strcmp_idx(key, "shared/counters/global/counter", idx ); | |||
test_assert_strcmp_idx(value, rset.row_data[idx][0], idx); | test_assert_strcmp_idx(value, rset.row_data[idx][0], idx); | |||
idx++; | idx++; | |||
} | } | |||
skipping to change at line 265 | skipping to change at line 274 | |||
res.queries = (const char*[]){ | res.queries = (const char*[]){ | |||
"SELECT value,name FROM counters WHERE class = 'global' AND name LIKE '%' AND name NOT LIKE '%/%'", | "SELECT value,name FROM counters WHERE class = 'global' AND name LIKE '%' AND name NOT LIKE '%/%'", | |||
NULL | NULL | |||
}; | }; | |||
res.cur = 0; | res.cur = 0; | |||
res.result->cur = 0; | res.result->cur = 0; | |||
test_set_expected(dict, &res); | test_set_expected(dict, &res); | |||
iter = dict_iterate_init(dict, "shared/counters/global/", 0); | iter = dict_iterate_init(dict, &dict_op_settings, "shared/counters/global /", 0); | |||
idx = 0; | idx = 0; | |||
while(dict_iterate(iter, &key, &value)) { | while(dict_iterate(iter, &key, &value)) { | |||
i_assert(idx < rset.rows); | i_assert(idx < rset.rows); | |||
test_assert_strcmp_idx(key, "shared/counters/global/counter", idx ); | test_assert_strcmp_idx(key, "shared/counters/global/counter", idx ); | |||
test_assert_strcmp_idx(value, rset.row_data[idx][0], idx); | test_assert_strcmp_idx(value, rset.row_data[idx][0], idx); | |||
idx++; | idx++; | |||
} | } | |||
End of changes. 15 change blocks. | ||||
12 lines changed or deleted | 21 lines changed or added |