star-sp

Random number generators and distributions
git clone git://git.meso-star.fr/star-sp.git
Log | Files | Refs | README | LICENSE

commit 1a338b146cc69c36618ef38660767466c8783488
parent ce70dd08d668a9765e3d401055714eb4cbffecaf
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 29 Nov 2017 10:26:03 +0100

Test the proxies created with the ssp_rng_proxy_create2 function

Diffstat:
Msrc/test_ssp_rng_proxy.c | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 146 insertions(+), 0 deletions(-)

diff --git a/src/test_ssp_rng_proxy.c b/src/test_ssp_rng_proxy.c @@ -71,6 +71,58 @@ test_creation(void) } static void +test_creation2(void) +{ + const struct ssp_rng_type* type = &ssp_rng_mt19937_64; + struct ssp_rng_proxy* proxy; + + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 0, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 0, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 0, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 0, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 32, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 32, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 32, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 0, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 0, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 0, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 0, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 0, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 32, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 32, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 32, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 1, NULL) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 0, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 0, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 0, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 0, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 32, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 32, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 32, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 0, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 0, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 0, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 0, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 0, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 0, 32, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 0, 32, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, NULL, 0, 32, 32, 1, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 1, &proxy) == RES_OK); + CHK(ssp_rng_proxy_ref_put(proxy) == RES_OK); + + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 4, &proxy) == RES_OK); + CHK(ssp_rng_proxy_ref_put(proxy) == RES_OK); + + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 32, &proxy) == RES_OK); + CHK(ssp_rng_proxy_ref_put(proxy) == RES_OK); + + CHK(ssp_rng_proxy_create2(NULL, type, 0, 32, 32, 33, &proxy) == RES_BAD_ARG); + CHK(ssp_rng_proxy_create2 + (&mem_default_allocator, type, 1024, 32, 32, 4, &proxy) == RES_OK); + CHK(ssp_rng_proxy_ref_put(proxy) == RES_OK); +} + +static void test_rng_from_proxy(void) { struct ssp_rng_type type; @@ -111,6 +163,98 @@ test_rng_from_proxy(void) } static void +test_rng_from_proxy2(void) +{ + struct ssp_rng_proxy* proxy[2]; + struct ssp_rng* rng[4]; + const size_t block_sz = 99; + const size_t nrands = 1000; + uint64_t* r[4]; + size_t i, j; + + CHK((r[0] = mem_alloc(sizeof(uint64_t)*nrands)) != NULL); + CHK((r[1] = mem_alloc(sizeof(uint64_t)*nrands)) != NULL); + CHK((r[2] = mem_alloc(sizeof(uint64_t)*nrands)) != NULL); + CHK((r[3] = mem_alloc(sizeof(uint64_t)*nrands)) != NULL); + + CHK(ssp_rng_proxy_create2 + (NULL, &ssp_rng_mt19937_64, 0, block_sz, block_sz, 4, &proxy[0]) == RES_OK); + + CHK(ssp_rng_proxy_create_rng(proxy[0], 0, &rng[0]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[0], 1, &rng[1]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[0], 2, &rng[2]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[0], 3, &rng[3]) == RES_OK); + + /* Generate random numbers */ + FOR_EACH(i, 0, nrands) { + r[0][i] = ssp_rng_get(rng[0]); + r[1][i] = ssp_rng_get(rng[1]); + r[2][i] = ssp_rng_get(rng[2]); + r[3][i] = ssp_rng_get(rng[3]); + } + + /* Check that each RNG generate a unique sequence of random numbers */ + FOR_EACH(i, 0, nrands) { + FOR_EACH(j, 0, nrands) { + CHK(r[0][i] != r[1][j]); + CHK(r[0][i] != r[2][j]); + CHK(r[0][i] != r[3][j]); + CHK(r[1][i] != r[2][j]); + CHK(r[1][i] != r[3][j]); + CHK(r[2][i] != r[3][j]); + } + } + + CHK(ssp_rng_proxy_ref_put(proxy[0]) == RES_OK); + CHK(ssp_rng_ref_put(rng[0]) == RES_OK); + CHK(ssp_rng_ref_put(rng[1]) == RES_OK); + CHK(ssp_rng_ref_put(rng[2]) == RES_OK); + CHK(ssp_rng_ref_put(rng[3]) == RES_OK); + + CHK(ssp_rng_proxy_create2(NULL, &ssp_rng_mt19937_64, + 0, block_sz, 2*block_sz, 2, &proxy[0]) == RES_OK); + CHK(ssp_rng_proxy_create2(NULL, &ssp_rng_mt19937_64, + block_sz, block_sz, 2*block_sz, 2, &proxy[1]) == RES_OK); + + CHK(ssp_rng_proxy_create_rng(proxy[0], 0, &rng[0]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[0], 1, &rng[1]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[1], 0, &rng[2]) == RES_OK); + CHK(ssp_rng_proxy_create_rng(proxy[1], 1, &rng[3]) == RES_OK); + + /* Generate random numbers */ + FOR_EACH(i, 0, nrands) { + r[0][i] = ssp_rng_get(rng[0]); + r[1][i] = ssp_rng_get(rng[1]); + r[2][i] = ssp_rng_get(rng[2]); + r[3][i] = ssp_rng_get(rng[3]); + } + + /* Check that each RNG generate a unique sequence of random numbers */ + FOR_EACH(i, 0, nrands) { + FOR_EACH(j, 0, nrands) { + CHK(r[0][i] != r[1][j]); + CHK(r[0][i] != r[2][j]); + CHK(r[0][i] != r[3][j]); + CHK(r[1][i] != r[2][j]); + CHK(r[1][i] != r[3][j]); + CHK(r[2][i] != r[3][j]); + } + } + + CHK(ssp_rng_proxy_ref_put(proxy[0]) == RES_OK); + CHK(ssp_rng_proxy_ref_put(proxy[1]) == RES_OK); + CHK(ssp_rng_ref_put(rng[0]) == RES_OK); + CHK(ssp_rng_ref_put(rng[1]) == RES_OK); + CHK(ssp_rng_ref_put(rng[2]) == RES_OK); + CHK(ssp_rng_ref_put(rng[3]) == RES_OK); + + mem_rm(r[0]); + mem_rm(r[1]); + mem_rm(r[2]); + mem_rm(r[3]); +} + +static void test_multi_proxies(void) { struct ssp_rng_proxy* proxy1; @@ -278,7 +422,9 @@ main(int argc, char** argv) { (void)argc, (void)argv; test_creation(); + test_creation2(); test_rng_from_proxy(); + test_rng_from_proxy2(); test_multi_proxies(); test_proxy_from_rng(); test_read();