aboutsummaryrefslogtreecommitdiff
path: root/tests/platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/platform.c')
-rw-r--r--tests/platform.c201
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 },
+};