1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#ifdef _WIN32 11e1051a39Sopenharmony_ci# include <windows.h> 12e1051a39Sopenharmony_ci#endif 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ci#include <stdio.h> 15e1051a39Sopenharmony_ci#include <string.h> 16e1051a39Sopenharmony_ci#include <openssl/async.h> 17e1051a39Sopenharmony_ci#include <openssl/crypto.h> 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_cistatic int ctr = 0; 20e1051a39Sopenharmony_cistatic ASYNC_JOB *currjob = NULL; 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_cistatic int only_pause(void *args) 23e1051a39Sopenharmony_ci{ 24e1051a39Sopenharmony_ci ASYNC_pause_job(); 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ci return 1; 27e1051a39Sopenharmony_ci} 28e1051a39Sopenharmony_ci 29e1051a39Sopenharmony_cistatic int add_two(void *args) 30e1051a39Sopenharmony_ci{ 31e1051a39Sopenharmony_ci ctr++; 32e1051a39Sopenharmony_ci ASYNC_pause_job(); 33e1051a39Sopenharmony_ci ctr++; 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ci return 2; 36e1051a39Sopenharmony_ci} 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_cistatic int save_current(void *args) 39e1051a39Sopenharmony_ci{ 40e1051a39Sopenharmony_ci currjob = ASYNC_get_current_job(); 41e1051a39Sopenharmony_ci ASYNC_pause_job(); 42e1051a39Sopenharmony_ci 43e1051a39Sopenharmony_ci return 1; 44e1051a39Sopenharmony_ci} 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_cistatic int change_deflt_libctx(void *args) 47e1051a39Sopenharmony_ci{ 48e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx = OSSL_LIB_CTX_new(); 49e1051a39Sopenharmony_ci OSSL_LIB_CTX *oldctx, *tmpctx; 50e1051a39Sopenharmony_ci int ret = 0; 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_ci if (libctx == NULL) 53e1051a39Sopenharmony_ci return 0; 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci oldctx = OSSL_LIB_CTX_set0_default(libctx); 56e1051a39Sopenharmony_ci ASYNC_pause_job(); 57e1051a39Sopenharmony_ci 58e1051a39Sopenharmony_ci /* Check the libctx is set up as we expect */ 59e1051a39Sopenharmony_ci tmpctx = OSSL_LIB_CTX_set0_default(oldctx); 60e1051a39Sopenharmony_ci if (tmpctx != libctx) 61e1051a39Sopenharmony_ci goto err; 62e1051a39Sopenharmony_ci 63e1051a39Sopenharmony_ci /* Set it back again to continue to use our own libctx */ 64e1051a39Sopenharmony_ci oldctx = OSSL_LIB_CTX_set0_default(libctx); 65e1051a39Sopenharmony_ci ASYNC_pause_job(); 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_ci /* Check the libctx is set up as we expect */ 68e1051a39Sopenharmony_ci tmpctx = OSSL_LIB_CTX_set0_default(oldctx); 69e1051a39Sopenharmony_ci if (tmpctx != libctx) 70e1051a39Sopenharmony_ci goto err; 71e1051a39Sopenharmony_ci 72e1051a39Sopenharmony_ci ret = 1; 73e1051a39Sopenharmony_ci err: 74e1051a39Sopenharmony_ci OSSL_LIB_CTX_free(libctx); 75e1051a39Sopenharmony_ci return ret; 76e1051a39Sopenharmony_ci} 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci 79e1051a39Sopenharmony_ci#define MAGIC_WAIT_FD ((OSSL_ASYNC_FD)99) 80e1051a39Sopenharmony_cistatic int waitfd(void *args) 81e1051a39Sopenharmony_ci{ 82e1051a39Sopenharmony_ci ASYNC_JOB *job; 83e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx; 84e1051a39Sopenharmony_ci job = ASYNC_get_current_job(); 85e1051a39Sopenharmony_ci if (job == NULL) 86e1051a39Sopenharmony_ci return 0; 87e1051a39Sopenharmony_ci waitctx = ASYNC_get_wait_ctx(job); 88e1051a39Sopenharmony_ci if (waitctx == NULL) 89e1051a39Sopenharmony_ci return 0; 90e1051a39Sopenharmony_ci 91e1051a39Sopenharmony_ci /* First case: no fd added or removed */ 92e1051a39Sopenharmony_ci ASYNC_pause_job(); 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci /* Second case: one fd added */ 95e1051a39Sopenharmony_ci if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) 96e1051a39Sopenharmony_ci return 0; 97e1051a39Sopenharmony_ci ASYNC_pause_job(); 98e1051a39Sopenharmony_ci 99e1051a39Sopenharmony_ci /* Third case: all fd removed */ 100e1051a39Sopenharmony_ci if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) 101e1051a39Sopenharmony_ci return 0; 102e1051a39Sopenharmony_ci ASYNC_pause_job(); 103e1051a39Sopenharmony_ci 104e1051a39Sopenharmony_ci /* Last case: fd added and immediately removed */ 105e1051a39Sopenharmony_ci if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) 106e1051a39Sopenharmony_ci return 0; 107e1051a39Sopenharmony_ci if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) 108e1051a39Sopenharmony_ci return 0; 109e1051a39Sopenharmony_ci 110e1051a39Sopenharmony_ci return 1; 111e1051a39Sopenharmony_ci} 112e1051a39Sopenharmony_ci 113e1051a39Sopenharmony_cistatic int blockpause(void *args) 114e1051a39Sopenharmony_ci{ 115e1051a39Sopenharmony_ci ASYNC_block_pause(); 116e1051a39Sopenharmony_ci ASYNC_pause_job(); 117e1051a39Sopenharmony_ci ASYNC_unblock_pause(); 118e1051a39Sopenharmony_ci ASYNC_pause_job(); 119e1051a39Sopenharmony_ci 120e1051a39Sopenharmony_ci return 1; 121e1051a39Sopenharmony_ci} 122e1051a39Sopenharmony_ci 123e1051a39Sopenharmony_cistatic int test_ASYNC_init_thread(void) 124e1051a39Sopenharmony_ci{ 125e1051a39Sopenharmony_ci ASYNC_JOB *job1 = NULL, *job2 = NULL, *job3 = NULL; 126e1051a39Sopenharmony_ci int funcret1, funcret2, funcret3; 127e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 128e1051a39Sopenharmony_ci 129e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(2, 0) 130e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 131e1051a39Sopenharmony_ci || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) 132e1051a39Sopenharmony_ci != ASYNC_PAUSE 133e1051a39Sopenharmony_ci || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) 134e1051a39Sopenharmony_ci != ASYNC_PAUSE 135e1051a39Sopenharmony_ci || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) 136e1051a39Sopenharmony_ci != ASYNC_NO_JOBS 137e1051a39Sopenharmony_ci || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) 138e1051a39Sopenharmony_ci != ASYNC_FINISH 139e1051a39Sopenharmony_ci || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) 140e1051a39Sopenharmony_ci != ASYNC_PAUSE 141e1051a39Sopenharmony_ci || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) 142e1051a39Sopenharmony_ci != ASYNC_FINISH 143e1051a39Sopenharmony_ci || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) 144e1051a39Sopenharmony_ci != ASYNC_FINISH 145e1051a39Sopenharmony_ci || funcret1 != 1 146e1051a39Sopenharmony_ci || funcret2 != 1 147e1051a39Sopenharmony_ci || funcret3 != 1) { 148e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_init_thread() failed\n"); 149e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 150e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 151e1051a39Sopenharmony_ci return 0; 152e1051a39Sopenharmony_ci } 153e1051a39Sopenharmony_ci 154e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 155e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 156e1051a39Sopenharmony_ci return 1; 157e1051a39Sopenharmony_ci} 158e1051a39Sopenharmony_ci 159e1051a39Sopenharmony_cistatic int test_callback(void *arg) 160e1051a39Sopenharmony_ci{ 161e1051a39Sopenharmony_ci printf("callback test pass\n"); 162e1051a39Sopenharmony_ci return 1; 163e1051a39Sopenharmony_ci} 164e1051a39Sopenharmony_ci 165e1051a39Sopenharmony_cistatic int test_ASYNC_callback_status(void) 166e1051a39Sopenharmony_ci{ 167e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 168e1051a39Sopenharmony_ci int set_arg = 100; 169e1051a39Sopenharmony_ci ASYNC_callback_fn get_callback; 170e1051a39Sopenharmony_ci void *get_arg; 171e1051a39Sopenharmony_ci int set_status = 1; 172e1051a39Sopenharmony_ci 173e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(1, 0) 174e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 175e1051a39Sopenharmony_ci || ASYNC_WAIT_CTX_set_callback(waitctx, test_callback, (void*)&set_arg) 176e1051a39Sopenharmony_ci != 1 177e1051a39Sopenharmony_ci || ASYNC_WAIT_CTX_get_callback(waitctx, &get_callback, &get_arg) 178e1051a39Sopenharmony_ci != 1 179e1051a39Sopenharmony_ci || test_callback != get_callback 180e1051a39Sopenharmony_ci || get_arg != (void*)&set_arg 181e1051a39Sopenharmony_ci || (*get_callback)(get_arg) != 1 182e1051a39Sopenharmony_ci || ASYNC_WAIT_CTX_set_status(waitctx, set_status) != 1 183e1051a39Sopenharmony_ci || set_status != ASYNC_WAIT_CTX_get_status(waitctx)) { 184e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_callback_status() failed\n"); 185e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 186e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 187e1051a39Sopenharmony_ci return 0; 188e1051a39Sopenharmony_ci } 189e1051a39Sopenharmony_ci 190e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 191e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 192e1051a39Sopenharmony_ci return 1; 193e1051a39Sopenharmony_ci 194e1051a39Sopenharmony_ci} 195e1051a39Sopenharmony_ci 196e1051a39Sopenharmony_cistatic int test_ASYNC_start_job(void) 197e1051a39Sopenharmony_ci{ 198e1051a39Sopenharmony_ci ASYNC_JOB *job = NULL; 199e1051a39Sopenharmony_ci int funcret; 200e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 201e1051a39Sopenharmony_ci 202e1051a39Sopenharmony_ci ctr = 0; 203e1051a39Sopenharmony_ci 204e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(1, 0) 205e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 206e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) 207e1051a39Sopenharmony_ci != ASYNC_PAUSE 208e1051a39Sopenharmony_ci || ctr != 1 209e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) 210e1051a39Sopenharmony_ci != ASYNC_FINISH 211e1051a39Sopenharmony_ci || ctr != 2 212e1051a39Sopenharmony_ci || funcret != 2) { 213e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_start_job() failed\n"); 214e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 215e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 216e1051a39Sopenharmony_ci return 0; 217e1051a39Sopenharmony_ci } 218e1051a39Sopenharmony_ci 219e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 220e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 221e1051a39Sopenharmony_ci return 1; 222e1051a39Sopenharmony_ci} 223e1051a39Sopenharmony_ci 224e1051a39Sopenharmony_cistatic int test_ASYNC_get_current_job(void) 225e1051a39Sopenharmony_ci{ 226e1051a39Sopenharmony_ci ASYNC_JOB *job = NULL; 227e1051a39Sopenharmony_ci int funcret; 228e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 229e1051a39Sopenharmony_ci 230e1051a39Sopenharmony_ci currjob = NULL; 231e1051a39Sopenharmony_ci 232e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(1, 0) 233e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 234e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) 235e1051a39Sopenharmony_ci != ASYNC_PAUSE 236e1051a39Sopenharmony_ci || currjob != job 237e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) 238e1051a39Sopenharmony_ci != ASYNC_FINISH 239e1051a39Sopenharmony_ci || funcret != 1) { 240e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_get_current_job() failed\n"); 241e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 242e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 243e1051a39Sopenharmony_ci return 0; 244e1051a39Sopenharmony_ci } 245e1051a39Sopenharmony_ci 246e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 247e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 248e1051a39Sopenharmony_ci return 1; 249e1051a39Sopenharmony_ci} 250e1051a39Sopenharmony_ci 251e1051a39Sopenharmony_cistatic int test_ASYNC_WAIT_CTX_get_all_fds(void) 252e1051a39Sopenharmony_ci{ 253e1051a39Sopenharmony_ci ASYNC_JOB *job = NULL; 254e1051a39Sopenharmony_ci int funcret; 255e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 256e1051a39Sopenharmony_ci OSSL_ASYNC_FD fd = OSSL_BAD_ASYNC_FD, delfd = OSSL_BAD_ASYNC_FD; 257e1051a39Sopenharmony_ci size_t numfds, numdelfds; 258e1051a39Sopenharmony_ci 259e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(1, 0) 260e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 261e1051a39Sopenharmony_ci /* On first run we're not expecting any wait fds */ 262e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) 263e1051a39Sopenharmony_ci != ASYNC_PAUSE 264e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) 265e1051a39Sopenharmony_ci || numfds != 0 266e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, 267e1051a39Sopenharmony_ci &numdelfds) 268e1051a39Sopenharmony_ci || numfds != 0 269e1051a39Sopenharmony_ci || numdelfds != 0 270e1051a39Sopenharmony_ci /* On second run we're expecting one added fd */ 271e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) 272e1051a39Sopenharmony_ci != ASYNC_PAUSE 273e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) 274e1051a39Sopenharmony_ci || numfds != 1 275e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_all_fds(waitctx, &fd, &numfds) 276e1051a39Sopenharmony_ci || fd != MAGIC_WAIT_FD 277e1051a39Sopenharmony_ci || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */ 278e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, 279e1051a39Sopenharmony_ci &numdelfds) 280e1051a39Sopenharmony_ci || numfds != 1 281e1051a39Sopenharmony_ci || numdelfds != 0 282e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL, 283e1051a39Sopenharmony_ci &numdelfds) 284e1051a39Sopenharmony_ci || fd != MAGIC_WAIT_FD 285e1051a39Sopenharmony_ci /* On third run we expect one deleted fd */ 286e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) 287e1051a39Sopenharmony_ci != ASYNC_PAUSE 288e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) 289e1051a39Sopenharmony_ci || numfds != 0 290e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, 291e1051a39Sopenharmony_ci &numdelfds) 292e1051a39Sopenharmony_ci || numfds != 0 293e1051a39Sopenharmony_ci || numdelfds != 1 294e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd, 295e1051a39Sopenharmony_ci &numdelfds) 296e1051a39Sopenharmony_ci || delfd != MAGIC_WAIT_FD 297e1051a39Sopenharmony_ci /* On last run we are not expecting any wait fd */ 298e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) 299e1051a39Sopenharmony_ci != ASYNC_FINISH 300e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) 301e1051a39Sopenharmony_ci || numfds != 0 302e1051a39Sopenharmony_ci || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, 303e1051a39Sopenharmony_ci &numdelfds) 304e1051a39Sopenharmony_ci || numfds != 0 305e1051a39Sopenharmony_ci || numdelfds != 0 306e1051a39Sopenharmony_ci || funcret != 1) { 307e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n"); 308e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 309e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 310e1051a39Sopenharmony_ci return 0; 311e1051a39Sopenharmony_ci } 312e1051a39Sopenharmony_ci 313e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 314e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 315e1051a39Sopenharmony_ci return 1; 316e1051a39Sopenharmony_ci} 317e1051a39Sopenharmony_ci 318e1051a39Sopenharmony_cistatic int test_ASYNC_block_pause(void) 319e1051a39Sopenharmony_ci{ 320e1051a39Sopenharmony_ci ASYNC_JOB *job = NULL; 321e1051a39Sopenharmony_ci int funcret; 322e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 323e1051a39Sopenharmony_ci 324e1051a39Sopenharmony_ci if ( !ASYNC_init_thread(1, 0) 325e1051a39Sopenharmony_ci || (waitctx = ASYNC_WAIT_CTX_new()) == NULL 326e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) 327e1051a39Sopenharmony_ci != ASYNC_PAUSE 328e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) 329e1051a39Sopenharmony_ci != ASYNC_FINISH 330e1051a39Sopenharmony_ci || funcret != 1) { 331e1051a39Sopenharmony_ci fprintf(stderr, "test_ASYNC_block_pause() failed\n"); 332e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 333e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 334e1051a39Sopenharmony_ci return 0; 335e1051a39Sopenharmony_ci } 336e1051a39Sopenharmony_ci 337e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 338e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 339e1051a39Sopenharmony_ci return 1; 340e1051a39Sopenharmony_ci} 341e1051a39Sopenharmony_ci 342e1051a39Sopenharmony_cistatic int test_ASYNC_start_job_ex(void) 343e1051a39Sopenharmony_ci{ 344e1051a39Sopenharmony_ci ASYNC_JOB *job = NULL; 345e1051a39Sopenharmony_ci int funcret; 346e1051a39Sopenharmony_ci ASYNC_WAIT_CTX *waitctx = NULL; 347e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx = OSSL_LIB_CTX_new(); 348e1051a39Sopenharmony_ci OSSL_LIB_CTX *oldctx, *tmpctx, *globalctx; 349e1051a39Sopenharmony_ci int ret = 0; 350e1051a39Sopenharmony_ci 351e1051a39Sopenharmony_ci if (libctx == NULL) { 352e1051a39Sopenharmony_ci fprintf(stderr, 353e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() failed to create libctx\n"); 354e1051a39Sopenharmony_ci goto err; 355e1051a39Sopenharmony_ci } 356e1051a39Sopenharmony_ci 357e1051a39Sopenharmony_ci globalctx = oldctx = OSSL_LIB_CTX_set0_default(libctx); 358e1051a39Sopenharmony_ci 359e1051a39Sopenharmony_ci if ((waitctx = ASYNC_WAIT_CTX_new()) == NULL 360e1051a39Sopenharmony_ci || ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, 361e1051a39Sopenharmony_ci NULL, 0) 362e1051a39Sopenharmony_ci != ASYNC_PAUSE) { 363e1051a39Sopenharmony_ci fprintf(stderr, 364e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() failed to start job\n"); 365e1051a39Sopenharmony_ci goto err; 366e1051a39Sopenharmony_ci } 367e1051a39Sopenharmony_ci 368e1051a39Sopenharmony_ci /* Reset the libctx temporarily to find out what it is*/ 369e1051a39Sopenharmony_ci tmpctx = OSSL_LIB_CTX_set0_default(oldctx); 370e1051a39Sopenharmony_ci oldctx = OSSL_LIB_CTX_set0_default(tmpctx); 371e1051a39Sopenharmony_ci if (tmpctx != libctx) { 372e1051a39Sopenharmony_ci fprintf(stderr, 373e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() failed - unexpected libctx\n"); 374e1051a39Sopenharmony_ci goto err; 375e1051a39Sopenharmony_ci } 376e1051a39Sopenharmony_ci 377e1051a39Sopenharmony_ci if (ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, NULL, 0) 378e1051a39Sopenharmony_ci != ASYNC_PAUSE) { 379e1051a39Sopenharmony_ci fprintf(stderr, 380e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() - restarting job failed\n"); 381e1051a39Sopenharmony_ci goto err; 382e1051a39Sopenharmony_ci } 383e1051a39Sopenharmony_ci 384e1051a39Sopenharmony_ci /* Reset the libctx and continue with the global default libctx */ 385e1051a39Sopenharmony_ci tmpctx = OSSL_LIB_CTX_set0_default(oldctx); 386e1051a39Sopenharmony_ci if (tmpctx != libctx) { 387e1051a39Sopenharmony_ci fprintf(stderr, 388e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() failed - unexpected libctx\n"); 389e1051a39Sopenharmony_ci goto err; 390e1051a39Sopenharmony_ci } 391e1051a39Sopenharmony_ci 392e1051a39Sopenharmony_ci if (ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, NULL, 0) 393e1051a39Sopenharmony_ci != ASYNC_FINISH 394e1051a39Sopenharmony_ci || funcret != 1) { 395e1051a39Sopenharmony_ci fprintf(stderr, 396e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() - finishing job failed\n"); 397e1051a39Sopenharmony_ci goto err; 398e1051a39Sopenharmony_ci } 399e1051a39Sopenharmony_ci 400e1051a39Sopenharmony_ci /* Reset the libctx temporarily to find out what it is*/ 401e1051a39Sopenharmony_ci tmpctx = OSSL_LIB_CTX_set0_default(libctx); 402e1051a39Sopenharmony_ci OSSL_LIB_CTX_set0_default(tmpctx); 403e1051a39Sopenharmony_ci if (tmpctx != globalctx) { 404e1051a39Sopenharmony_ci fprintf(stderr, 405e1051a39Sopenharmony_ci "test_ASYNC_start_job_ex() failed - global libctx check failed\n"); 406e1051a39Sopenharmony_ci goto err; 407e1051a39Sopenharmony_ci } 408e1051a39Sopenharmony_ci 409e1051a39Sopenharmony_ci ret = 1; 410e1051a39Sopenharmony_ci err: 411e1051a39Sopenharmony_ci ASYNC_WAIT_CTX_free(waitctx); 412e1051a39Sopenharmony_ci ASYNC_cleanup_thread(); 413e1051a39Sopenharmony_ci OSSL_LIB_CTX_free(libctx); 414e1051a39Sopenharmony_ci return ret; 415e1051a39Sopenharmony_ci} 416e1051a39Sopenharmony_ci 417e1051a39Sopenharmony_ciint main(int argc, char **argv) 418e1051a39Sopenharmony_ci{ 419e1051a39Sopenharmony_ci if (!ASYNC_is_capable()) { 420e1051a39Sopenharmony_ci fprintf(stderr, 421e1051a39Sopenharmony_ci "OpenSSL build is not ASYNC capable - skipping async tests\n"); 422e1051a39Sopenharmony_ci } else { 423e1051a39Sopenharmony_ci if (!test_ASYNC_init_thread() 424e1051a39Sopenharmony_ci || !test_ASYNC_callback_status() 425e1051a39Sopenharmony_ci || !test_ASYNC_start_job() 426e1051a39Sopenharmony_ci || !test_ASYNC_get_current_job() 427e1051a39Sopenharmony_ci || !test_ASYNC_WAIT_CTX_get_all_fds() 428e1051a39Sopenharmony_ci || !test_ASYNC_block_pause() 429e1051a39Sopenharmony_ci || !test_ASYNC_start_job_ex()) { 430e1051a39Sopenharmony_ci return 1; 431e1051a39Sopenharmony_ci } 432e1051a39Sopenharmony_ci } 433e1051a39Sopenharmony_ci printf("PASS\n"); 434e1051a39Sopenharmony_ci return 0; 435e1051a39Sopenharmony_ci} 436