From da19588063f8c62a8d816e3ffd286916d6db446b Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 3 Aug 2009 13:35:01 +0200 Subject: [PATCH] add config tests Add some test for the snd_config_* functions. Signed-off-by: Clemens Ladisch --- test/lsb/Makefile.am | 3 +- test/lsb/config.c | 582 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 584 insertions(+), 1 deletion(-) create mode 100644 test/lsb/config.c diff --git a/test/lsb/Makefile.am b/test/lsb/Makefile.am index 8d2c1bde..ceb4d715 100644 --- a/test/lsb/Makefile.am +++ b/test/lsb/Makefile.am @@ -1,4 +1,5 @@ -TESTS = midi_event +TESTS = config +TESTS += midi_event check_PROGRAMS = $(TESTS) noinst_HEADERS = test.h diff --git a/test/lsb/config.c b/test/lsb/config.c new file mode 100644 index 00000000..3503798f --- /dev/null +++ b/test/lsb/config.c @@ -0,0 +1,582 @@ +#include +#include +#include +#include "test.h" + +static int configs_equal(snd_config_t *c1, snd_config_t *c2); + +/* checks if all children of c1 also occur in c2 */ +static int subset_of(snd_config_t *c1, snd_config_t *c2) +{ + snd_config_iterator_t i, next; + snd_config_t *e1, *e2; + const char *id; + + snd_config_for_each(i, next, c1) { + e1 = snd_config_iterator_entry(i); + if (snd_config_get_id(e1, &id) < 0 || !id) + return 0; + if (snd_config_search(c2, id, &e2) < 0) + return 0; + if (!configs_equal(e1, e2)) + return 0; + } + return 1; +} + +/* checks if two configuration nodes are equal */ +static int configs_equal(snd_config_t *c1, snd_config_t *c2) +{ + long i1, i2; + long long i641, i642; + const char *s1, *s2; + + if (snd_config_get_type(c1) != snd_config_get_type(c2)) + return 0; + switch (snd_config_get_type(c1)) { + case SND_CONFIG_TYPE_INTEGER: + return snd_config_get_integer(c1, &i1) >= 0 && + snd_config_get_integer(c2, &i2) >= 0 && + i1 == i2; + case SND_CONFIG_TYPE_INTEGER64: + return snd_config_get_integer64(c1, &i641) >= 0 && + snd_config_get_integer64(c2, &i642) >= 0 && + i641 == i642; + case SND_CONFIG_TYPE_STRING: + return snd_config_get_string(c1, &s1) >= 0 && + snd_config_get_string(c2, &s2) >= 0 && + !s1 == !s2 && + (!s1 || !strcmp(s1, s2)); + case SND_CONFIG_TYPE_COMPOUND: + return subset_of(c1, c2) && subset_of(c2, c1); + default: + fprintf(stderr, "unknown configuration node type %d\n", + (int)snd_config_get_type(c1)); + return 0; + } +} + +static void test_top(void) +{ + snd_config_t *top; + const char *id; + + if (ALSA_CHECK(snd_config_top(&top)) < 0) + return; + + TEST_CHECK(snd_config_get_type(top) == SND_CONFIG_TYPE_COMPOUND); + TEST_CHECK(snd_config_iterator_first(top) == snd_config_iterator_end(top)); + TEST_CHECK(snd_config_get_id(top, &id) >= 0 && id == NULL); + + ALSA_CHECK(snd_config_delete(top)); +} + +static void test_load(void) +{ + const char *config_text1 = "s='world';"; + const char *config_text2 = "c.elem 0"; + snd_config_t *loaded, *made, *c, *c2; + snd_input_t *input; + + ALSA_CHECK(snd_config_top(&loaded)); + ALSA_CHECK(snd_config_imake_integer(&c, "i", 42)); + ALSA_CHECK(snd_config_add(loaded, c)); + ALSA_CHECK(snd_config_imake_string(&c, "s", "hello")); + ALSA_CHECK(snd_config_add(loaded, c)); + + ALSA_CHECK(snd_config_top(&made)); + ALSA_CHECK(snd_config_imake_string(&c, "s", "world")); + ALSA_CHECK(snd_config_add(made, c)); + ALSA_CHECK(snd_config_imake_integer(&c, "i", 42)); + ALSA_CHECK(snd_config_add(made, c)); + + ALSA_CHECK(snd_input_buffer_open(&input, config_text1, strlen(config_text1))); + ALSA_CHECK(snd_config_load(loaded, input)); + ALSA_CHECK(snd_input_close(input)); + TEST_CHECK(configs_equal(loaded, made)); + + ALSA_CHECK(snd_config_make_compound(&c, "c", 0)); + ALSA_CHECK(snd_config_add(made, c)); + ALSA_CHECK(snd_config_imake_integer(&c2, "elem", 0)); + ALSA_CHECK(snd_config_add(c, c2)); + + ALSA_CHECK(snd_input_buffer_open(&input, config_text2, strlen(config_text2))); + ALSA_CHECK(snd_config_load(loaded, input)); + ALSA_CHECK(snd_input_close(input)); + TEST_CHECK(configs_equal(loaded, made)); + + ALSA_CHECK(snd_config_delete(loaded)); + ALSA_CHECK(snd_config_delete(made)); +} + +static void test_save(void) +{ + const char *text = + "a.b.c 'x.y.z'\n" + "xxx = yyy;\n" + "q { qq=qqq }\n" + "a [ 1 2 3 4 5 '...' ]\n"; + snd_config_t *orig, *saved; + snd_input_t *input; + snd_output_t *output; + char *buf; + size_t buf_size; + + ALSA_CHECK(snd_input_buffer_open(&input, text, strlen(text))); + ALSA_CHECK(snd_config_top(&orig)); + ALSA_CHECK(snd_config_load(orig, input)); + ALSA_CHECK(snd_input_close(input)); + ALSA_CHECK(snd_output_buffer_open(&output)); + ALSA_CHECK(snd_config_save(orig, output)); + buf_size = snd_output_buffer_string(output, &buf); + ALSA_CHECK(snd_input_buffer_open(&input, buf, buf_size)); + ALSA_CHECK(snd_config_top(&saved)); + ALSA_CHECK(snd_config_load(saved, input)); + ALSA_CHECK(snd_input_close(input)); + ALSA_CHECK(snd_output_close(output)); + TEST_CHECK(configs_equal(orig, saved)); + ALSA_CHECK(snd_config_delete(orig)); + ALSA_CHECK(snd_config_delete(saved)); +} + +static void test_update(void) +{ + ALSA_CHECK(snd_config_update_free_global()); + TEST_CHECK(snd_config == NULL); + ALSA_CHECK(snd_config_update()); + TEST_CHECK(snd_config_get_type(snd_config) == SND_CONFIG_TYPE_COMPOUND); + ALSA_CHECK(snd_config_update()); + TEST_CHECK(snd_config_get_type(snd_config) == SND_CONFIG_TYPE_COMPOUND); + ALSA_CHECK(snd_config_update_free_global()); + TEST_CHECK(snd_config == NULL); +} + +static void test_search(void) +{ + const char *text = + "a 42\n" + "b {\n" + " c cee\n" + " d {\n" + " e 2.71828\n" + " }\n" + "}\n"; + snd_input_t *input; + snd_config_t *top, *c; + const char *id; + + ALSA_CHECK(snd_input_buffer_open(&input, text, strlen(text))); + ALSA_CHECK(snd_config_top(&top)); + ALSA_CHECK(snd_config_load(top, input)); + ALSA_CHECK(snd_input_close(input)); + + ALSA_CHECK(snd_config_search(top, "a", &c)); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "a")); + ALSA_CHECK(snd_config_search(top, "b.d.e", &c)); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "e")); + ALSA_CHECK(snd_config_search(top, "b.c", NULL)); + TEST_CHECK(snd_config_search(top, "x", NULL) == -ENOENT); + TEST_CHECK(snd_config_search(top, "b.y", &c) == -ENOENT); + TEST_CHECK(snd_config_search(top, "a.z", &c) == -ENOENT); + + ALSA_CHECK(snd_config_delete(top)); +} + +static void test_searchv(void) +{ + const char *text = + "a 42\n" + "b {\n" + " c cee\n" + " d {\n" + " e 2.71828\n" + " }\n" + "}\n"; + snd_input_t *input; + snd_config_t *top, *c; + const char *id; + + ALSA_CHECK(snd_input_buffer_open(&input, text, strlen(text))); + ALSA_CHECK(snd_config_top(&top)); + ALSA_CHECK(snd_config_load(top, input)); + ALSA_CHECK(snd_input_close(input)); + + ALSA_CHECK(snd_config_searchv(top, &c, "a", NULL)); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "a")); + ALSA_CHECK(snd_config_searchv(top, &c, "b", "d.e", NULL)); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "e")); + ALSA_CHECK(snd_config_searchv(top, NULL, "b.c", NULL)); + TEST_CHECK(snd_config_searchv(top, NULL, "x", NULL) == -ENOENT); + TEST_CHECK(snd_config_searchv(top, &c, "b.y", NULL) == -ENOENT); + TEST_CHECK(snd_config_searchv(top, &c, "a", "z", NULL) == -ENOENT); + + ALSA_CHECK(snd_config_delete(top)); +} + +static void test_add(void) +{ + snd_config_t *c1, *c2, *c3, *c4, *c5; + snd_config_iterator_t i; + unsigned int count = 0; + + ALSA_CHECK(snd_config_top(&c1)); + ALSA_CHECK(snd_config_imake_integer(&c2, "c2", 0xc2)); + ALSA_CHECK(snd_config_add(c1, c2)); + ALSA_CHECK(snd_config_imake_string(&c3, "c3", "c3")); + ALSA_CHECK(snd_config_add(c1, c3)); + for (i = snd_config_iterator_first(c1); + i != snd_config_iterator_end(c1); + i = snd_config_iterator_next(i)) + ++count; + TEST_CHECK(count == 2); + ALSA_CHECK(snd_config_search(c1, "c2", &c2)); + ALSA_CHECK(snd_config_search(c1, "c3", &c3)); + ALSA_CHECK(snd_config_top(&c4)); + TEST_CHECK(snd_config_add(c1, c4) == -EINVAL); + ALSA_CHECK(snd_config_imake_integer(&c5, "c5", 5)); + ALSA_CHECK(snd_config_add(c4, c5)); + TEST_CHECK(snd_config_add(c1, c5) == -EINVAL); + ALSA_CHECK(snd_config_delete(c4)); + ALSA_CHECK(snd_config_imake_integer(&c3, "c3", 333)); + TEST_CHECK(snd_config_add(c1, c3) == -EEXIST); + ALSA_CHECK(snd_config_delete(c3)); + ALSA_CHECK(snd_config_delete(c1)); +} + +static void test_delete(void) +{ + snd_config_t *c; + + ALSA_CHECK(snd_config_top(&c)); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_imake_string(&c, "s", "...")); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_copy(void) +{ + snd_config_t *c1, *c2, *c3; + long value; + + ALSA_CHECK(snd_config_imake_integer(&c1, "c1", 123)); + ALSA_CHECK(snd_config_copy(&c2, c1)); + ALSA_CHECK(snd_config_set_integer(c1, 456)); + TEST_CHECK(snd_config_get_type(c2) == SND_CONFIG_TYPE_INTEGER); + ALSA_CHECK(snd_config_get_integer(c2, &value)); + TEST_CHECK(value == 123); + ALSA_CHECK(snd_config_delete(c1)); + ALSA_CHECK(snd_config_delete(c2)); + ALSA_CHECK(snd_config_top(&c1)); + ALSA_CHECK(snd_config_imake_integer(&c2, "a", 1)); + ALSA_CHECK(snd_config_add(c1, c2)); + ALSA_CHECK(snd_config_copy(&c3, c1)); + ALSA_CHECK(snd_config_set_integer(c2, 2)); + TEST_CHECK(!configs_equal(c1, c3)); + ALSA_CHECK(snd_config_search(c3, "a", &c2)); + ALSA_CHECK(snd_config_set_integer(c2, 2)); + TEST_CHECK(configs_equal(c1, c3)); + ALSA_CHECK(snd_config_delete(c1)); + ALSA_CHECK(snd_config_delete(c3)); +} + +static void test_make_integer(void) +{ + snd_config_t *c; + const char *id; + long value; + + ALSA_CHECK(snd_config_make_integer(&c, "i")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_INTEGER); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "i")); + ALSA_CHECK(snd_config_get_integer(c, &value)); + TEST_CHECK(value == 0); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_make_integer64(void) +{ + snd_config_t *c; + const char *id; + long long value; + + ALSA_CHECK(snd_config_make_integer64(&c, "i")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_INTEGER64); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "i")); + ALSA_CHECK(snd_config_get_integer64(c, &value)); + TEST_CHECK(value == 0); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_make_string(void) +{ + snd_config_t *c; + const char *id; + const char *value; + + ALSA_CHECK(snd_config_make_string(&c, "s")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_STRING); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "s")); + ALSA_CHECK(snd_config_get_string(c, &value)); + TEST_CHECK(value == NULL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_make_compound(void) +{ + snd_config_t *c; + const char *id; + + ALSA_CHECK(snd_config_make_compound(&c, "c", 0)); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_COMPOUND); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "c")); + TEST_CHECK(snd_config_iterator_first(c) == snd_config_iterator_end(c)); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_imake_integer(void) +{ + snd_config_t *c; + const char *id; + long value; + + ALSA_CHECK(snd_config_imake_integer(&c, "i", 123)); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_INTEGER); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "i")); + ALSA_CHECK(snd_config_get_integer(c, &value)); + TEST_CHECK(value == 123); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_imake_integer64(void) +{ + snd_config_t *c; + const char *id; + long long value; + + ALSA_CHECK(snd_config_imake_integer64(&c, "i", 123456789012345LL)); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_INTEGER64); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "i")); + ALSA_CHECK(snd_config_get_integer64(c, &value)); + TEST_CHECK(value == 123456789012345LL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_imake_string(void) +{ + snd_config_t *c; + const char *id; + const char *value; + + ALSA_CHECK(snd_config_imake_string(&c, "s", "xyzzy")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_STRING); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "s")); + ALSA_CHECK(snd_config_get_string(c, &value)); + TEST_CHECK(!strcmp(value, "xyzzy")); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_get_type(void) +{ + snd_config_t *c; + + ALSA_CHECK(snd_config_top(&c)); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_COMPOUND); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_integer(&c, "i")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_INTEGER); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_string(&c, "s")); + TEST_CHECK(snd_config_get_type(c) == SND_CONFIG_TYPE_STRING); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_set_integer(void) +{ + snd_config_t *c; + long value; + + ALSA_CHECK(snd_config_make_integer(&c, "i")); + ALSA_CHECK(snd_config_set_integer(c, 123)); + ALSA_CHECK(snd_config_get_integer(c, &value)); + TEST_CHECK(value == 123); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_string(&c, "s")); + TEST_CHECK(snd_config_set_integer(c, 123) == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_set_integer64(void) +{ + snd_config_t *c; + long long value; + + ALSA_CHECK(snd_config_make_integer64(&c, "i")); + ALSA_CHECK(snd_config_set_integer64(c, 123456789012345LL)); + ALSA_CHECK(snd_config_get_integer64(c, &value)); + TEST_CHECK(value == 123456789012345LL); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_string(&c, "s")); + TEST_CHECK(snd_config_set_integer64(c, 123) == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_set_string(void) +{ + snd_config_t *c; + const char *value; + + ALSA_CHECK(snd_config_make_string(&c, "s")); + ALSA_CHECK(snd_config_set_string(c, "string")); + ALSA_CHECK(snd_config_get_string(c, &value)); + TEST_CHECK(!strcmp(value, "string")); + ALSA_CHECK(snd_config_set_string(c, NULL)); + ALSA_CHECK(snd_config_get_string(c, &value)); + TEST_CHECK(value == NULL); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_integer(&c, "i")); + TEST_CHECK(snd_config_set_string(c, "") == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_set_ascii(void) +{ + snd_config_t *c; + const char *s; + long i; + + ALSA_CHECK(snd_config_make_string(&c, "s")); + ALSA_CHECK(snd_config_set_ascii(c, "foo")); + ALSA_CHECK(snd_config_get_string(c, &s)); + TEST_CHECK(!strcmp(s, "foo")); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_make_integer(&c, "i")); + ALSA_CHECK(snd_config_set_ascii(c, "23")); + ALSA_CHECK(snd_config_get_integer(c, &i)); + TEST_CHECK(i == 23); + TEST_CHECK(snd_config_set_ascii(c, "half blue") == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_top(&c)); + TEST_CHECK(snd_config_set_ascii(c, "0") == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_get_id(void) +{ + snd_config_t *c; + const char *id; + + ALSA_CHECK(snd_config_make_integer(&c, "my_id")); + ALSA_CHECK(snd_config_get_id(c, &id)); + TEST_CHECK(!strcmp(id, "my_id")); + ALSA_CHECK(snd_config_delete(c)); +} + +#define test_get_integer test_set_integer +#define test_get_integer64 test_set_integer64 +#define test_get_string test_set_string + +static void test_get_ascii(void) +{ + snd_config_t *c; + char *value; + + ALSA_CHECK(snd_config_imake_integer(&c, "i", 123)); + ALSA_CHECK(snd_config_get_ascii(c, &value)); + TEST_CHECK(!strcmp(value, "123")); + free(value); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_imake_string(&c, "s", "bar")); + ALSA_CHECK(snd_config_get_ascii(c, &value)); + TEST_CHECK(!strcmp(value, "bar")); + free(value); + ALSA_CHECK(snd_config_delete(c)); + ALSA_CHECK(snd_config_top(&c)); + TEST_CHECK(snd_config_get_ascii(c, &value) == -EINVAL); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_iterators(void) +{ + snd_config_t *c, *c2; + snd_config_iterator_t i; + long v; + + ALSA_CHECK(snd_config_top(&c)); + i = snd_config_iterator_first(c); + TEST_CHECK(i == snd_config_iterator_end(c)); + ALSA_CHECK(snd_config_imake_integer(&c2, "one", 1)); + ALSA_CHECK(snd_config_add(c, c2)); + i = snd_config_iterator_first(c); + TEST_CHECK(i != snd_config_iterator_end(c)); + c2 = snd_config_iterator_entry(i); + ALSA_CHECK(snd_config_get_integer(c2, &v)); + TEST_CHECK(v == 1); + i = snd_config_iterator_next(i); + TEST_CHECK(i == snd_config_iterator_end(c)); + ALSA_CHECK(snd_config_delete(c)); +} + +static void test_for_each(void) +{ + snd_config_t *c, *c2; + snd_config_iterator_t i, next; + long v; + unsigned int count = 0; + + ALSA_CHECK(snd_config_top(&c)); + ALSA_CHECK(snd_config_imake_integer(&c2, "one", 1)); + ALSA_CHECK(snd_config_add(c, c2)); + snd_config_for_each(i, next, c) { + TEST_CHECK(i != snd_config_iterator_end(c)); + c2 = snd_config_iterator_entry(i); + ALSA_CHECK(snd_config_get_integer(c2, &v)); + TEST_CHECK(v == 1); + ++count; + } + TEST_CHECK(count == 1); + ALSA_CHECK(snd_config_delete(c)); +} + +int main(void) +{ + test_top(); + test_load(); + test_save(); + test_update(); + test_search(); + test_searchv(); + test_add(); + test_delete(); + test_copy(); + test_make_integer(); + test_make_integer64(); + test_make_string(); + test_make_compound(); + test_imake_integer(); + test_imake_integer64(); + test_imake_string(); + test_get_type(); + test_set_integer(); + test_set_integer64(); + test_set_string(); + test_set_ascii(); + test_get_id(); + test_get_integer(); + test_get_integer64(); + test_get_string(); + test_get_ascii(); + test_iterators(); + test_for_each(); + return TEST_EXIT_CODE(); +} -- 2.47.1