47 static const char long_val[] =
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
51 int res = AST_TEST_PASS;
52 const char *inputs[][3] = {
53 {
"family",
"key",
"value"},
54 {
"astdbtest",
"a",
"b"},
55 {
"astdbtest",
"a",
"a"},
56 {
"astdbtest",
"b",
"a"},
57 {
"astdbtest",
"b",
"b"},
58 {
"astdbtest",
"b",
"!@#$%^&*()|+-<>?"},
59 {
"astdbtest", long_val,
"b"},
60 {
"astdbtest",
"b", long_val},
61 {
"astdbtest",
"!@#$%^&*()|+-<>?",
"b"},
64 char buf[
sizeof(long_val)] = { 0, };
68 info->name =
"put_get_del";
69 info->category =
"/main/astdb/";
70 info->summary =
"ast_db_(put|get|del) unit test";
72 "Ensures that the ast_db put, get, and del functions work";
73 return AST_TEST_NOT_RUN;
78 for (x = 0; x < ARRAY_LEN(inputs); x++) {
79 if (
ast_db_put(inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE])) {
80 ast_test_status_update(
test,
"Failed to put %s : %s : %s\n", inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE]);
83 if (
ast_db_get(inputs[x][FAMILY], inputs[x][KEY], buf,
sizeof(buf))) {
84 ast_test_status_update(
test,
"Failed to get %s : %s : %s\n", inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE]);
86 }
else if (strcmp(buf, inputs[x][VALUE])) {
87 ast_test_status_update(
test,
"Failed to match key '%s/%s' value '%s' to '%s'\n", inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE], buf);
90 if (
ast_db_del(inputs[x][FAMILY], inputs[x][KEY])) {
91 ast_test_status_update(
test,
"Failed to del %s : %s\n", inputs[x][FAMILY], inputs[x][KEY]);
101 int res = AST_TEST_PASS;
102 const char *inputs[][3] = {
103 #define BASE "astdbtest"
106 #define FAM1 BASE "/" SUB1
107 #define FAM2 BASE "/" SUB2
108 {FAM1,
"one",
"blah"},
109 {FAM1,
"two",
"bling"},
110 {FAM1,
"three",
"blast"},
111 {FAM2,
"one",
"blah"},
112 {FAM2,
"two",
"bling"},
113 {FAM2,
"three",
"blast"},
121 info->name =
"gettree_deltree";
122 info->category =
"/main/astdb/";
123 info->summary =
"ast_db_(gettree|deltree) unit test";
125 "Ensures that the ast_db gettree and deltree functions work";
126 return AST_TEST_NOT_RUN;
131 for (x = 0; x < ARRAY_LEN(inputs); x++) {
132 if (
ast_db_put(inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE])) {
133 ast_test_status_update(
test,
"Failed to put %s : %s : %s\n", inputs[x][FAMILY], inputs[x][KEY], inputs[x][VALUE]);
139 ast_test_status_update(
test,
"Failed to ast_db_gettree family %s\n", BASE);
143 for (cur = dbes, x = 0; cur; cur = cur->next, x++) {
146 for (z = 0; z < ARRAY_LEN(inputs); z++) {
148 snprintf(buf,
sizeof(buf),
"/%s/%s", inputs[z][FAMILY], inputs[z][KEY]);
149 if (!strcmp(buf, cur->key) && !strcmp(inputs[z][VALUE], cur->data)) {
154 ast_test_status_update(
test,
"inputs array has no entry for %s == %s\n", cur->key, cur->data);
159 if (x != ARRAY_LEN(inputs)) {
160 ast_test_status_update(
test,
"ast_db_gettree returned %zu entries when we expected %zu\n", x, ARRAY_LEN(inputs));
167 ast_test_status_update(
test,
"Failed to ast_db_gettree for %s/%s\n", BASE, SUB1);
171 for (cur = dbes, x = 0; cur; cur = cur->next, x++) {
174 for (z = 0; z < ARRAY_LEN(inputs); z++) {
176 snprintf(buf,
sizeof(buf),
"/%s/%s", inputs[z][FAMILY], inputs[z][KEY]);
177 if (!strcmp(buf, cur->key) && !strcmp(inputs[z][VALUE], cur->data)) {
182 ast_test_status_update(
test,
"inputs array has no entry for %s == %s\n", cur->key, cur->data);
187 if (x != (ARRAY_LEN(inputs) / 2)) {
188 ast_test_status_update(
test,
"ast_db_gettree returned %zu entries when we expected %zu\n", x, ARRAY_LEN(inputs) / 2);
194 if ((num_deleted =
ast_db_deltree(BASE, SUB2)) != ARRAY_LEN(inputs) / 2) {
195 ast_test_status_update(
test,
"Failed to deltree %s/%s, expected %zu deletions and got %d\n", BASE, SUB2, ARRAY_LEN(inputs) / 2, num_deleted);
199 if ((num_deleted =
ast_db_deltree(BASE, NULL)) != ARRAY_LEN(inputs) / 2) {
200 ast_test_status_update(
test,
"Failed to deltree %s, expected %zu deletions and got %d\n", BASE, ARRAY_LEN(inputs) / 2, num_deleted);
209 int res = AST_TEST_PASS;
215 info->name =
"perftest";
216 info->category =
"/main/astdb/";
217 info->summary =
"astdb performance unit test";
219 "Measure astdb performance";
220 return AST_TEST_NOT_RUN;
225 for (x = 0; x < 100000; x++) {
226 sprintf(buf,
"%zu", x);
236 int res = AST_TEST_PASS;
240 #define STR_FILL_32 "abcdefghijklmnopqrstuvwxyz123456"
244 info->name =
"put_get_long";
245 info->category =
"/main/astdb/";
246 info->summary =
"ast_db_(put|get_allocated) unit test";
248 "Ensures that the ast_db_put and ast_db_get_allocated functions work";
249 return AST_TEST_NOT_RUN;
255 return AST_TEST_FAIL;
258 for (i = 1024; i <= 1024 * 1024 * 8; i *= 2) {
263 for (j = 0; j < i; j +=
sizeof(STR_FILL_32) - 1) {
268 ast_test_status_update(
test,
"Failed to put value of %zu bytes\n",
ast_str_strlen(s));
271 ast_test_status_update(
test,
"Failed to get value of %zu bytes\n",
ast_str_strlen(s));
274 ast_test_status_update(
test,
"Failed to match value of %zu bytes\n",
ast_str_strlen(s));
277 ast_test_status_update(
test,
"Failed to delete astdbtest/long\n");
291 static int unload_module(
void)
293 AST_TEST_UNREGISTER(put_get_del);
294 AST_TEST_UNREGISTER(gettree_deltree);
295 AST_TEST_UNREGISTER(perftest);
296 AST_TEST_UNREGISTER(put_get_long);
300 static int load_module(
void)
302 AST_TEST_REGISTER(put_get_del);
303 AST_TEST_REGISTER(gettree_deltree);
304 AST_TEST_REGISTER(perftest);
305 AST_TEST_REGISTER(put_get_long);
Asterisk main include file. File version handling, generic pbx functions.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
void ast_db_freetree(struct ast_db_entry *entry)
Free structure created by ast_db_gettree()
int ast_db_get_allocated(const char *family, const char *key, char **out)
Get key value specified by family/key as a heap allocated string.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Support for dynamic strings.
struct ast_db_entry * ast_db_gettree(const char *family, const char *keytree)
Get a list of values within the astdb tree.
Support for logging to various files, console and syslog Configuration in file logger.conf.
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
#define AST_TEST_DEFINE(hdr)
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
Persistent data storage (akin to *doze registry)
int ast_db_deltree(const char *family, const char *keytree)
Delete one or more entries in astdb.
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.