36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose Pavel Březina <pbrezina@redhat.com>
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose Copyright (C) 2014 Red Hat
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose This program is free software; you can redistribute it and/or modify
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose it under the terms of the GNU General Public License as published by
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose the Free Software Foundation; either version 3 of the License, or
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose (at your option) any later version.
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose This program is distributed in the hope that it will be useful,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose but WITHOUT ANY WARRANTY; without even the implied warranty of
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose GNU General Public License for more details.
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose You should have received a copy of the GNU General Public License
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose along with this program. If not, see <http://www.gnu.org/licenses/>.
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose cmocka_unit_test_setup_teardown(test_ ## test, test_setup, test_teardown)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx->offstat.went_offline = get_current_time(); \
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose/* Since both test_ctx->done and ptask->req is marked as finished already
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * in the sync _send function before a new execution is scheduled we need to
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * rely on the fact that ptask->req is set to zero when a new timer is
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * created. This way we guarantee that the condition is true only when
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * the ptask is executed and a new one is scheduled. */
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose/* Mock few backend functions so we don't have to bring the whole
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * data provider into this test. */
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestruct tevent_req * test_be_ptask_send(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bose req = tevent_req_create(mem_ctx, &state, struct test_be_ptask_state);
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bosestruct tevent_req * test_be_ptask_null_send(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestruct tevent_req * test_be_ptask_timeout_send(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose req = tevent_req_create(mem_ctx, &state, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose /* we won't finish the request */
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_recv(struct tevent_req *req)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state = tevent_req_data(req, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_error_recv(struct tevent_req *req)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state = tevent_req_data(req, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_sync_error(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_zero(global_talloc_context, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx = mock_be_ctx(test_ctx, test_ctx->tctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx->ev = tevent_context_init(test_ctx->be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, NULL, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_einval_period(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, 0, 0, 0, 0, 0,
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bosevoid test_be_ptask_create_einval_send(void **state)
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov test_be_ptask_recv, NULL, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_einval_recv(void **state)
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bosevoid test_be_ptask_create_einval_name(void **state)
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_first_delay(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, DELAY, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now + DELAY <= ptask->last_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, DELAY, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now + DELAY <= ptask->last_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose while (ptask->next_execution == next_execution && !test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(next_execution + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_null(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_null_send,
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_error_recv, test_ctx, "Test ptask",
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_timeout(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 1,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_timeout_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_error_recv, test_ctx, "Test ptask",
abee3216261e3378430e472f0c992470b33976f0Sumit Bose /* first iterate until the task is executed */
abee3216261e3378430e472f0c992470b33976f0Sumit Bose /* then iterate until the request is destroyed */
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_backoff(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek BE_PTASK_OFFLINE_SKIP, PERIOD*2, test_be_ptask_send,
abee3216261e3378430e472f0c992470b33976f0Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* first run */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* We need to acquire timestamp for the second test here, since this
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose * is the closest value to the timestamp when the next event is
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose * scheduled. */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* second run */
9c8db0a17a66c58c36966b17d004142a4aaace8dSumit Bose assert_true(now_backoff + PERIOD <= ptask->last_execution);
cffe3135f29c737f2598f3c1384bfba1694fb843Sumit Bose assert_true(now_backoff + PERIOD <= test_ctx->when);
415d93196533a6fcd90889c67396ef5af5bf791aSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD*2 <= ptask->next_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, TIMEOUT,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid test_be_ptask_create_sync(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_sync_reschedule_ok(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_sync_reschedule_error(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid test_be_ptask_sync_reschedule_backoff(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* first run */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose /* We need to acquire timestamp for the second test here, since this
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose * is the closest value to the timestamp when the next event is
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose * scheduled. */
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_true(next_execution + PERIOD <= ptask->next_execution);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose /* second run */
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(now_backoff + PERIOD <= ptask->last_execution);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(now_backoff + PERIOD <= test_ctx->when);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_true(ptask->last_execution <= test_ctx->when);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(next_execution + PERIOD*2 <= ptask->next_execution);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose /* Set debug level to invalid value so we can decide if -d 0 was used. */
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose pc = poptGetContext(argv[0], argc, argv, long_options, 0);