X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=test%2Fasynctest.c;h=dc357da8b7a4a8b574064857529665941e8adae8;hb=c720fc35f4aa90cdc7cdc424b976c5322fb0098e;hp=6728058c361aba438e9d1b4e74f15ea5805ad44b;hpb=440e5d805f449d662520313b33fd90aeee86980b;p=oweals%2Fopenssl.git diff --git a/test/asynctest.c b/test/asynctest.c index 6728058c36..dc357da8b7 100644 --- a/test/asynctest.c +++ b/test/asynctest.c @@ -1,17 +1,20 @@ /* - * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. * - * Licensed under the OpenSSL license (the "License"). You may not use + * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */ +#ifdef _WIN32 +# include +#endif + #include #include #include #include -#include <../apps/apps.h> static int ctr = 0; static ASYNC_JOB *currjob = NULL; @@ -45,17 +48,29 @@ static int waitfd(void *args) { ASYNC_JOB *job; ASYNC_WAIT_CTX *waitctx; - ASYNC_pause_job(); job = ASYNC_get_current_job(); if (job == NULL) return 0; waitctx = ASYNC_get_wait_ctx(job); if (waitctx == NULL) return 0; - if(!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) + + /* First case: no fd added or removed */ + ASYNC_pause_job(); + + /* Second case: one fd added */ + if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) return 0; ASYNC_pause_job(); + /* Third case: all fd removed */ + if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) + return 0; + ASYNC_pause_job(); + + /* Last case: fd added and immediately removed */ + if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) + return 0; if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) return 0; @@ -72,7 +87,7 @@ static int blockpause(void *args) return 1; } -static int test_ASYNC_init_thread() +static int test_ASYNC_init_thread(void) { ASYNC_JOB *job1 = NULL, *job2 = NULL, *job3 = NULL; int funcret1, funcret2, funcret3; @@ -108,7 +123,44 @@ static int test_ASYNC_init_thread() return 1; } -static int test_ASYNC_start_job() +static int test_callback(void *arg) +{ + printf("callback test pass\n"); + return 1; +} + +static int test_ASYNC_callback_status(void) +{ + ASYNC_WAIT_CTX *waitctx = NULL; + int set_arg = 100; + ASYNC_callback_fn get_callback; + void *get_arg; + int set_status = 1; + + if ( !ASYNC_init_thread(1, 0) + || (waitctx = ASYNC_WAIT_CTX_new()) == NULL + || ASYNC_WAIT_CTX_set_callback(waitctx, test_callback, (void*)&set_arg) + != 1 + || ASYNC_WAIT_CTX_get_callback(waitctx, &get_callback, &get_arg) + != 1 + || test_callback != get_callback + || get_arg != (void*)&set_arg + || (*get_callback)(get_arg) != 1 + || ASYNC_WAIT_CTX_set_status(waitctx, set_status) != 1 + || set_status != ASYNC_WAIT_CTX_get_status(waitctx)) { + fprintf(stderr, "test_ASYNC_callback_status() failed\n"); + ASYNC_WAIT_CTX_free(waitctx); + ASYNC_cleanup_thread(); + return 0; + } + + ASYNC_WAIT_CTX_free(waitctx); + ASYNC_cleanup_thread(); + return 1; + +} + +static int test_ASYNC_start_job(void) { ASYNC_JOB *job = NULL; int funcret; @@ -136,7 +188,7 @@ static int test_ASYNC_start_job() return 1; } -static int test_ASYNC_get_current_job() +static int test_ASYNC_get_current_job(void) { ASYNC_JOB *job = NULL; int funcret; @@ -163,7 +215,7 @@ static int test_ASYNC_get_current_job() return 1; } -static int test_ASYNC_WAIT_CTX_get_all_fds() +static int test_ASYNC_WAIT_CTX_get_all_fds(void) { ASYNC_JOB *job = NULL; int funcret; @@ -191,15 +243,15 @@ static int test_ASYNC_WAIT_CTX_get_all_fds() || fd != MAGIC_WAIT_FD || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */ || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, - &numdelfds) + &numdelfds) || numfds != 1 || numdelfds != 0 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL, &numdelfds) || fd != MAGIC_WAIT_FD - /* On final run we expect one deleted fd */ + /* On third run we expect one deleted fd */ || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) - != ASYNC_FINISH + != ASYNC_PAUSE || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) || numfds != 0 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, @@ -209,6 +261,15 @@ static int test_ASYNC_WAIT_CTX_get_all_fds() || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd, &numdelfds) || delfd != MAGIC_WAIT_FD + /* On last run we are not expecting any wait fd */ + || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) + != ASYNC_FINISH + || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) + || numfds != 0 + || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, + &numdelfds) + || numfds != 0 + || numdelfds != 0 || funcret != 1) { fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n"); ASYNC_WAIT_CTX_free(waitctx); @@ -221,7 +282,7 @@ static int test_ASYNC_WAIT_CTX_get_all_fds() return 1; } -static int test_ASYNC_block_pause() +static int test_ASYNC_block_pause(void) { ASYNC_JOB *job = NULL; int funcret; @@ -251,10 +312,8 @@ int main(int argc, char **argv) fprintf(stderr, "OpenSSL build is not ASYNC capable - skipping async tests\n"); } else { - CRYPTO_set_mem_debug(1); - CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); - - if ( !test_ASYNC_init_thread() + if (!test_ASYNC_init_thread() + || !test_ASYNC_callback_status() || !test_ASYNC_start_job() || !test_ASYNC_get_current_job() || !test_ASYNC_WAIT_CTX_get_all_fds()