diff options
Diffstat (limited to 'test/test_itc.c')
-rw-r--r-- | test/test_itc.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/test/test_itc.c b/test/test_itc.c new file mode 100644 index 0000000..ba96114 --- /dev/null +++ b/test/test_itc.c @@ -0,0 +1,171 @@ +#include "../src/itc.h" +#include "test.h" + +#include <pthread.h> +#include <stdlib.h> +#include <unistd.h> + +static void test_itc_alloc_free(void) +{ + itc *ctx; + TEST((ctx = itc_alloc(0)) == NULL); + TEST((ctx = itc_alloc(1)) != NULL); + itc_free(&ctx, NULL); + TEST(ctx == NULL); +} + +static void test_itc_inject_retrive(void) +{ + unsigned int i; + unsigned int *e[3] = {NULL}; + int *r; + itc *ctx; + + for (i = 0; i < sizeof(e)/sizeof(e[0]); i++) { + e[i] = malloc(sizeof(*e[i])); + *e[i] = i; + } + + ctx = itc_alloc(3); + TEST(itc_inject(ctx, 0, e[0]) == 0); + TEST(itc_inject(ctx, 0, e[1]) == 0); + TEST(itc_inject(ctx, 0, e[2]) == 0); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 0); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 1); + TEST(itc_inject(ctx, 0, e[0]) == 0); + TEST(itc_inject(ctx, 0, e[1]) == 0); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 2); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 0); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 1); + TEST(itc_retrive(ctx, 0) == NULL); + TEST(itc_inject(ctx, 0, e[0]) == 0); + itc_free(&ctx, free); + + e[0] = malloc(sizeof(*e[0])); + *e[0] = 0; + ctx = itc_alloc(2); + TEST(itc_inject(ctx, 0, e[0]) == 0); + TEST(itc_inject(ctx, 0, e[1]) == 0); + TEST(itc_inject(ctx, 0, e[2])); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 0); + TEST((r = itc_retrive(ctx, 0)) != NULL); + TEST(*r == 1); + TEST(itc_retrive(ctx, 0) == NULL); + itc_free(&ctx, free); + for (i = 0; i < sizeof(e)/sizeof(e[0]); i++) { + free(e[i]); + } +} + +static void test_itc_queued_slots(void) +{ + itc *ctx; + ctx = itc_alloc(3); + TEST(itc_get_queued(NULL) < 0); + TEST(itc_get_queued(ctx) == 0); + TEST(itc_get_slots(NULL) < 0); + TEST(itc_get_slots(ctx) == 3); + itc_inject(ctx, 0, NULL); + TEST(itc_get_queued(ctx) == 0); + TEST(itc_get_slots(ctx) == 3); + itc_inject(ctx, 0, ctx); + TEST(itc_get_queued(ctx) == 1); + TEST(itc_get_slots(ctx) == 3); + itc_inject(ctx, 0, ctx); + TEST(itc_get_queued(ctx) == 2); + TEST(itc_get_slots(ctx) == 3); + itc_retrive(ctx, 0); + TEST(itc_get_queued(ctx) == 1); + TEST(itc_get_slots(ctx) == 3); + itc_retrive(ctx, 0); + TEST(itc_get_queued(ctx) == 0); + TEST(itc_get_slots(ctx) == 3); + itc_free(&ctx, NULL); +} + +static void *test_itc_wait_empty_th(void *_ctx) +{ + itc *ctx = _ctx; + int *e; + + sleep(1); + TEST(ctx != NULL); + TEST((e = itc_retrive(ctx, 0)) != NULL); + TEST(*e == 0); + free(e); + TEST((e = itc_retrive(ctx, 0)) != NULL); + TEST(*e == 1); + free(e); + TEST((e = itc_retrive(ctx, 0)) != NULL); + TEST(*e == 2); + free(e); + TEST(itc_retrive(ctx, 0) == NULL); + + return NULL; +} + +static void test_itc_wait_empty(void) +{ + itc *ctx; + pthread_t th; + int *e[3]; + int i; + + for (i = 0; i < 3; i++) { + e[i] = malloc(sizeof(int)); + *e[i] = i; + } + + ctx = itc_alloc(3); + itc_inject(ctx, 0, e[0]); + itc_inject(ctx, 0, e[1]); + itc_inject(ctx, 0, e[2]); + pthread_create(&th, NULL, test_itc_wait_empty_th, ctx); + pthread_detach(th); + itc_wait_empty(ctx); + TEST(itc_get_queued(ctx) == 0); + TEST(itc_retrive(ctx, 0) == NULL); + itc_free(&ctx, NULL); +} + +static void test_itc_discard_all(void) +{ + itc *ctx; + unsigned int *e[4]; + unsigned int i; + + for (i = 0; i < sizeof(e)/sizeof(e[0]); i++) { + e[i] = malloc(sizeof(*e[i])); + *e[i] = i; + } + + ctx = itc_alloc(5); + itc_discard_all(ctx, free); + TEST(itc_get_queued(ctx) == 0); + itc_inject(ctx, 0, e[0]); + itc_inject(ctx, 0, e[1]); + itc_inject(ctx, 0, e[2]); + itc_inject(ctx, 0, e[3]); + itc_discard_all(ctx, free); + TEST(itc_get_queued(ctx) == 0); + itc_free(&ctx, NULL); +} + +int main(int argc, char **argv) +{ + (void)argc; + (void)argv; + test_itc_alloc_free(); + test_itc_inject_retrive(); + test_itc_queued_slots(); + test_itc_wait_empty(); + test_itc_discard_all(); + return 0; +} + |