diff options
Diffstat (limited to 'tests/platform.c')
| -rw-r--r-- | tests/platform.c | 201 |
1 files changed, 117 insertions, 84 deletions
diff --git a/tests/platform.c b/tests/platform.c index 7af18029..7546fa7f 100644 --- a/tests/platform.c +++ b/tests/platform.c @@ -1,5 +1,5 @@ // -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -8,11 +8,12 @@ // found online at https://opensource.org/licenses/MIT. // +#include "testutil.h" + #include <nng/nng.h> #include <nng/supplemental/util/platform.h> -#include "convey.h" -#include "stubs.h" +#include "acutest.h" struct addarg { int cnt; @@ -31,84 +32,116 @@ add(void *arg) nng_mtx_unlock(aa->mx); } -TestMain("Platform Operations", { - // This is required for anything else to work - Convey("The clock works", { - uint64_t now = getms(); - - Convey("usleep works", { - nng_msleep(100); - - So((getms() - now) >= 100); // cannot be *shorter*!! - So((getms() - now) < 200); // crummy clock resolution? - }); - Convey("times work", { - uint64_t msend; - int usdelta; - int msdelta; - nng_time usend; - nng_time usnow = nng_clock(); - nng_msleep(200); - usend = nng_clock(); - msend = getms(); - - So(usend > usnow); - So(msend > now); - usdelta = (int) (usend - usnow); - msdelta = (int) (msend - now); - So(usdelta >= 200); - So(usdelta < 250); // increased tolerance for CIs - So(abs(msdelta - usdelta) < 50); - }); - }); - Convey("Mutexes work", { - static nng_mtx *mx; - - So(nng_mtx_alloc(&mx) == 0); - Reset({ nng_mtx_free(mx); }); - - Convey("We can lock and unlock mutex", { - nng_mtx_lock(mx); - So(1); - nng_mtx_unlock(mx); - So(1); - Convey("And then lock it again", { - nng_mtx_lock(mx); - So(1); - nng_mtx_unlock(mx); - So(1); - }); - }); - }); - - Convey("Threads work", { - static nng_thread *thr; - int rv; - struct addarg aa; - - So(nng_mtx_alloc(&aa.mx) == 0); - So(nng_cv_alloc(&aa.cv, aa.mx) == 0); - Reset({ - nng_mtx_free(aa.mx); - nng_cv_free(aa.cv); - }); - aa.cnt = 0; - - Convey("We can create threads", { - rv = nng_thread_create(&thr, add, &aa); - So(rv == 0); - - Reset({ nng_thread_destroy(thr); }); - - Convey("It ran", { - int val; - nng_mtx_lock(aa.mx); - while ((val = aa.cnt) == 0) { - nng_cv_wait(aa.cv); - } - nng_mtx_unlock(aa.mx); - So(val == 1); - }); - }); - }); -}) +void +test_sleep(void) +{ + uint64_t start, end; + start = testutil_clock(); + nng_msleep(100); + end = testutil_clock(); + TEST_CHECK((end - start) >= 100); + TEST_CHECK((end - start) <= 500); +} + +void +test_clock(void) +{ + uint64_t mstart; + uint64_t msend; + uint64_t usdelta; + uint64_t msdelta; + nng_time usend; + nng_time usnow; + + mstart = testutil_clock(); + usnow = nng_clock(); + nng_msleep(200); + usend = nng_clock(); + msend = testutil_clock(); + + TEST_CHECK(usend > usnow); + TEST_CHECK(msend > mstart); + usdelta = usend - usnow; + msdelta = msend - mstart; + TEST_CHECK(usdelta >= 200); + TEST_CHECK(usdelta < 500); // increased tolerance for CIs + if (msdelta > usdelta) { + TEST_CHECK((msdelta - usdelta) < 50); + } else { + TEST_CHECK((usdelta - msdelta) < 50); + } +} + +void +test_mutex(void) +{ + nng_mtx *mx, *mx2; + + TEST_CHECK(nng_mtx_alloc(&mx) == 0); + nng_mtx_lock(mx); + nng_mtx_unlock(mx); + + nng_mtx_lock(mx); + nng_mtx_unlock(mx); + nng_mtx_free(mx); + + // Verify that the mutexes are not always the same! + TEST_CHECK(nng_mtx_alloc(&mx) == 0); + TEST_CHECK(nng_mtx_alloc(&mx2) == 0); + TEST_CHECK(mx != mx2); + nng_mtx_free(mx); + nng_mtx_free(mx2); +} + +void +test_thread(void) +{ + nng_thread * thr; + int rv; + struct addarg aa; + + TEST_CHECK(nng_mtx_alloc(&aa.mx) == 0); + TEST_CHECK(nng_cv_alloc(&aa.cv, aa.mx) == 0); + aa.cnt = 0; + + TEST_CHECK((rv = nng_thread_create(&thr, add, &aa)) == 0); + nng_thread_destroy(thr); + TEST_CHECK(aa.cnt == 1); + + nng_cv_free(aa.cv); + nng_mtx_free(aa.mx); +} + +void +test_condvar(void) +{ + nng_thread * thr; + int rv; + struct addarg aa; + + TEST_CHECK(nng_mtx_alloc(&aa.mx) == 0); + TEST_CHECK(nng_cv_alloc(&aa.cv, aa.mx) == 0); + aa.cnt = 0; + + TEST_CHECK((rv = nng_thread_create(&thr, add, &aa)) == 0); + + nng_mtx_lock(aa.mx); + while (aa.cnt == 0) { + nng_cv_wait(aa.cv); + } + nng_mtx_unlock(aa.mx); + nng_thread_destroy(thr); + TEST_CHECK(aa.cnt == 1); + + nng_cv_free(aa.cv); + nng_mtx_free(aa.mx); +} + +TEST_LIST = { + { "sleep", test_sleep }, + { "clock", test_clock }, + { "mutex", test_mutex }, + { "thread", test_thread }, + { "condvar", test_condvar }, + { NULL, NULL }, +}; |
