diff options
| author | William Ahern <[email protected]> | 2016-02-26 22:23:21 -0800 |
|---|---|---|
| committer | William Ahern <[email protected]> | 2016-02-26 22:23:21 -0800 |
| commit | 50147e1d8f1914d03cee716ef410a755a7222431 (patch) | |
| tree | 5cf1c6372a674f3207abfc611ef582953e6e5cc7 | |
| parent | 948cacb51795fdbc6964916212d4a260d4f11e7a (diff) | |
| parent | 3c533b618662699800722630ee55b1c38a79feb4 (diff) | |
Merge branch 'test_foreach' of git://github.com/nmathewson/timeout into nmathewson-test_foreach
| -rw-r--r-- | test-timeout.c | 55 |
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; } |
