diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile.am | 12 | ||||
-rw-r--r-- | src/shared/list.h | 2 | ||||
-rw-r--r-- | src/test/test-list.c | 109 |
4 files changed, 122 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore index d1e2ae9915..866d8eba0b 100644 --- a/.gitignore +++ b/.gitignore @@ -116,6 +116,7 @@ /test-journal-syslog /test-journal-verify /test-libudev +/test-list /test-log /test-login /test-loopback diff --git a/Makefile.am b/Makefile.am index 12254e39a8..c64934efa5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1098,7 +1098,8 @@ tests += \ test-prioq \ test-fileio \ test-time \ - test-hashmap + test-hashmap \ + test-list EXTRA_DIST += \ test/sched_idle_bad.service \ @@ -1202,6 +1203,15 @@ test_hashmap_CFLAGS = \ test_hashmap_LDADD = \ libsystemd-core.la +test_list_SOURCES = \ + src/test/test-list.c + +test_list_CFLAGS = \ + $(AM_CFLAGS) + +test_list_LDADD = \ + libsystemd-core.la + test_prioq_SOURCES = \ src/test/test-prioq.c diff --git a/src/shared/list.h b/src/shared/list.h index 96d6237974..476757460a 100644 --- a/src/shared/list.h +++ b/src/shared/list.h @@ -81,7 +81,7 @@ (head) = _item; \ } while (false) -/* Find the head of the list */ +/* Find the tail of the list */ #define LIST_FIND_TAIL(t,name,item,tail) \ do { \ t *_item = (item); \ diff --git a/src/test/test-list.c b/src/test/test-list.c new file mode 100644 index 0000000000..2710504765 --- /dev/null +++ b/src/test/test-list.c @@ -0,0 +1,109 @@ +/*** + This file is part of systemd + + Copyright 2013 Jan Janssen + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include "list.h" +#include "util.h" + +int main(int argc, const char *argv[]) { + size_t i; + typedef struct list_item { + LIST_FIELDS(struct list_item, item); + } list_item; + LIST_HEAD(list_item, head); + list_item items[4]; + list_item *cursor; + + LIST_HEAD_INIT(list_item, head); + assert_se(head == NULL); + + for (i = 0; i < ELEMENTSOF(items); i++) { + LIST_INIT(list_item, item, &items[i]); + assert_se(LIST_JUST_US(item, &items[i])); + LIST_PREPEND(list_item, item, head, &items[i]); + } + + assert_se(!LIST_JUST_US(item, head)); + + assert_se(items[0].item_next == NULL); + assert_se(items[1].item_next == &items[0]); + assert_se(items[2].item_next == &items[1]); + assert_se(items[3].item_next == &items[2]); + + assert_se(items[0].item_prev == &items[1]); + assert_se(items[1].item_prev == &items[2]); + assert_se(items[2].item_prev == &items[3]); + assert_se(items[3].item_prev == NULL); + + LIST_FIND_HEAD(list_item, item, &items[0], cursor); + assert_se(cursor == &items[3]); + + LIST_FIND_TAIL(list_item, item, &items[3], cursor); + assert_se(cursor == &items[0]); + + LIST_REMOVE(list_item, item, head, &items[1]); + assert_se(LIST_JUST_US(item, &items[1])); + + assert_se(items[0].item_next == NULL); + assert_se(items[2].item_next == &items[0]); + assert_se(items[3].item_next == &items[2]); + + assert_se(items[0].item_prev == &items[2]); + assert_se(items[2].item_prev == &items[3]); + assert_se(items[3].item_prev == NULL); + + LIST_INSERT_AFTER(list_item, item, head, &items[3], &items[1]); + assert_se(items[0].item_next == NULL); + assert_se(items[2].item_next == &items[0]); + assert_se(items[1].item_next == &items[2]); + assert_se(items[3].item_next == &items[1]); + + assert_se(items[0].item_prev == &items[2]); + assert_se(items[2].item_prev == &items[1]); + assert_se(items[1].item_prev == &items[3]); + assert_se(items[3].item_prev == NULL); + + LIST_REMOVE(list_item, item, head, &items[0]); + assert_se(LIST_JUST_US(item, &items[0])); + + assert_se(items[2].item_next == NULL); + assert_se(items[1].item_next == &items[2]); + assert_se(items[3].item_next == &items[1]); + + assert_se(items[2].item_prev == &items[1]); + assert_se(items[1].item_prev == &items[3]); + assert_se(items[3].item_prev == NULL); + + LIST_REMOVE(list_item, item, head, &items[1]); + assert_se(LIST_JUST_US(item, &items[1])); + + assert_se(items[2].item_next == NULL); + assert_se(items[3].item_next == &items[2]); + + assert_se(items[2].item_prev == &items[3]); + assert_se(items[3].item_prev == NULL); + + LIST_REMOVE(list_item, item, head, &items[2]); + assert_se(LIST_JUST_US(item, &items[2])); + assert_se(LIST_JUST_US(item, head)); + + LIST_REMOVE(list_item, item, head, &items[3]); + assert_se(LIST_JUST_US(item, &items[3])); + + return 0; +} |