summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Ahern <[email protected]>2016-02-26 22:23:21 -0800
committerWilliam Ahern <[email protected]>2016-02-26 22:23:21 -0800
commit50147e1d8f1914d03cee716ef410a755a7222431 (patch)
tree5cf1c6372a674f3207abfc611ef582953e6e5cc7
parent948cacb51795fdbc6964916212d4a260d4f11e7a (diff)
parent3c533b618662699800722630ee55b1c38a79feb4 (diff)
Merge branch 'test_foreach' of git://github.com/nmathewson/timeout into nmathewson-test_foreach
-rw-r--r--test-timeout.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/test-timeout.c b/test-timeout.c
index 4607958..8077129 100644
--- a/test-timeout.c
+++ b/test-timeout.c
@@ -80,15 +80,18 @@ static int check_randomized(const struct rand_cfg *cfg)
struct timeout *t = calloc(cfg->n_timeouts, sizeof(struct timeout));
timeout_t *timeouts = calloc(cfg->n_timeouts, sizeof(timeout_t));
uint8_t *fired = calloc(cfg->n_timeouts, sizeof(uint8_t));
+ uint8_t *found = calloc(cfg->n_timeouts, sizeof(uint8_t));
uint8_t *deleted = calloc(cfg->n_timeouts, sizeof(uint8_t));
struct timeouts *tos = timeouts_open(0, &err);
timeout_t now = cfg->start_at;
- int n_added_pending = 0;
- int n_added_expired = 0;
+ int n_added_pending = 0, cnt_added_pending = 0;
+ int n_added_expired = 0, cnt_added_expired = 0;
+ struct timeouts_it it_p, it_e, it_all;
+ int p_done = 0, e_done = 0, all_done = 0;
struct timeout *to = NULL;
const int rel = cfg->relative;
- if (!t || !timeouts || !tos || !fired || !deleted)
+ if (!t || !timeouts || !tos || !fired || !found || !deleted)
FAIL();
timeouts_update(tos, cfg->start_at);
@@ -123,6 +126,51 @@ static int check_randomized(const struct rand_cfg *cfg)
if (!!n_added_expired != timeouts_expired(tos))
FAIL();
+ /* Test foreach, interleaving a few iterators. */
+ TIMEOUTS_IT_INIT(&it_p, TIMEOUTS_PENDING);
+ TIMEOUTS_IT_INIT(&it_e, TIMEOUTS_EXPIRED);
+ TIMEOUTS_IT_INIT(&it_all, TIMEOUTS_ALL);
+ while (! (p_done && e_done && all_done)) {
+ if (!p_done) {
+ to = timeouts_next(tos, &it_p);
+ if (to) {
+ i = to - &t[0];
+ ++found[i];
+ ++cnt_added_pending;
+ } else {
+ p_done = 1;
+ }
+ }
+ if (!e_done) {
+ to = timeouts_next(tos, &it_e);
+ if (to) {
+ i = to - &t[0];
+ ++found[i];
+ ++cnt_added_expired;
+ } else {
+ e_done = 1;
+ }
+ }
+ if (!all_done) {
+ to = timeouts_next(tos, &it_all);
+ if (to) {
+ i = to - &t[0];
+ ++found[i];
+ } else {
+ all_done = 1;
+ }
+ }
+ }
+
+ for (i = 0; i < cfg->n_timeouts; ++i) {
+ if (found[i] != 2)
+ FAIL();
+ }
+ if (cnt_added_expired != n_added_expired)
+ FAIL();
+ if (cnt_added_pending != n_added_pending)
+ FAIL();
+
while (NULL != (to = timeouts_get(tos))) {
i = to - &t[0];
assert(&t[i] == to);
@@ -217,6 +265,7 @@ static int check_randomized(const struct rand_cfg *cfg)
if (t) free(t);
if (timeouts) free(timeouts);
if (fired) free(fired);
+ if (found) free(found);
if (deleted) free(deleted);
return rv;
}