36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose/*
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose Authors:
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose Pavel Březina <pbrezina@redhat.com>
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose Copyright (C) 2014 Red Hat
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
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
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
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/>.
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose*/
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#include <talloc.h>
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#include <tevent.h>
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#include <errno.h>
1df6751f81f7d9c225463f76b9789b0cc7a0de8bSumit Bose#include <popt.h>
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose#include <time.h>
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
c371993cce13edb9185a5f0db76fbee03f0edc04Sumit Bose#include "providers/backend.h"
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#include "providers/be_ptask_private.h"
c371993cce13edb9185a5f0db76fbee03f0edc04Sumit Bose#include "providers/be_ptask.h"
5cd4414fce1e0eb4133dfc6fc828bf25c8a959f9Lukas Slebodnik#include "tests/cmocka/common_mock.h"
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose#include "tests/cmocka/common_mock_be.h"
c371993cce13edb9185a5f0db76fbee03f0edc04Sumit Bose#include "tests/common.h"
c371993cce13edb9185a5f0db76fbee03f0edc04Sumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define DELAY 2
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define PERIOD 1
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define TIMEOUT 123
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define new_test(test) \
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose cmocka_unit_test_setup_teardown(test_ ## test, test_setup, test_teardown)
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestruct test_ctx {
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct sss_test_ctx *tctx;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *be_ctx;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t when;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose bool done;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose bool add_online_cb_called;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose bool add_offline_cb_called;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose};
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define mark_online(test_ctx) do { \
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx->be_ctx->offstat.went_offline = 0; \
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx->be_ctx->offstat.offline = false; \
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose} while (0)
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose#define mark_offline(test_ctx) do { \
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx->offstat.went_offline = get_current_time(); \
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx->offstat.offline = true; \
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose} while (0)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
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#define is_sync_ptask_finished(test_ctx, ptask) \
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose (test_ctx->done && ptask->req == NULL)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestatic time_t get_current_time(void)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct timeval tv;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose int ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = gettimeofday(&tv, NULL);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(0, ret);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose return tv.tv_sec;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose/* Mock few backend functions so we don't have to bring the whole
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose * data provider into this test. */
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosebool be_is_offline(struct be_ctx *ctx)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ctx->offstat.offline;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseint be_add_online_cb(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_callback_t cb,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose void *pvt,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov struct be_cb **online_cb)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx = sss_mock_ptr_type(struct test_ctx *);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->add_online_cb_called = true;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce return ERR_OK;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Boseint be_add_offline_cb(TALLOC_CTX *mem_ctx,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ctx *ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_callback_t cb,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose void *pvt,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_cb **offline_cb)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov struct test_ctx *test_ctx = NULL;
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = sss_mock_ptr_type(struct test_ctx *);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->add_offline_cb_called = true;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ERR_OK;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorcestruct test_be_ptask_state {
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose};
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestruct tevent_req * test_be_ptask_send(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct tevent_context *ev,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *be_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *be_ptask,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose void *pvt)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_be_ptask_state *state = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct tevent_req *req = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ctx);
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce assert_non_null(be_ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(pvt);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->when = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bose req = tevent_req_create(mem_ctx, &state, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(req);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose state->test_ctx = test_ctx;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce tevent_req_done(req);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose tevent_req_post(req, ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return req;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bose
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bosestruct tevent_req * test_be_ptask_null_send(TALLOC_CTX *mem_ctx,
bc85b7e2b7b1569e64d8832c52cab9ad165e6fc1Sumit Bose struct tevent_context *ev,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *be_ctx,
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce struct be_ptask *be_ptask,
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose void *pvt)
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose{
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose struct test_ctx *test_ctx = NULL;
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose assert_non_null(ev);
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose assert_non_null(be_ctx);
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose assert_non_null(be_ptask);
3e9712c2fdbba8f9cd25886943331e76e0b2ceddSumit Bose assert_non_null(pvt);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->when = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->done = true;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose return NULL;
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestruct tevent_req * test_be_ptask_timeout_send(TALLOC_CTX *mem_ctx,
7ee9ac32485483beece872d6fcb3096fa77a004bSumit Bose struct tevent_context *ev,
7ee9ac32485483beece872d6fcb3096fa77a004bSumit Bose struct be_ctx *be_ctx,
7ee9ac32485483beece872d6fcb3096fa77a004bSumit Bose struct be_ptask *be_ptask,
7ee9ac32485483beece872d6fcb3096fa77a004bSumit Bose void *pvt)
7ee9ac32485483beece872d6fcb3096fa77a004bSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_be_ptask_state *state = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct tevent_req *req = NULL;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(pvt);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->when = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose req = tevent_req_create(mem_ctx, &state, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(req);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state->test_ctx = test_ctx;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose /* we won't finish the request */
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return req;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_recv(struct tevent_req *req)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_be_ptask_state *state = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state = tevent_req_data(req, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state->test_ctx->done = true;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose TEVENT_REQ_RETURN_ON_ERROR(req);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ERR_OK;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_error_recv(struct tevent_req *req)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_be_ptask_state *state = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose state = tevent_req_data(req, struct test_be_ptask_state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(state);
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce
233a3c6c48972b177e60d6ef4cecfacd3cf31659Simo Sorce state->test_ctx->done = true;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ERR_INTERNAL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_sync(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct tevent_context *ev,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *be_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *be_ptask,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose void *pvt)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(pvt);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->when = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->done = true;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ERR_OK;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Boseerrno_t test_be_ptask_sync_error(TALLOC_CTX *mem_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct tevent_context *ev,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ctx *be_ctx,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *be_ptask,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose void *pvt)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(be_ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(pvt);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_get_type(pvt, struct test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->when = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->done = true;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return ERR_INTERNAL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestatic int test_setup(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(leak_check_setup());
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx = talloc_zero(global_talloc_context, struct test_ctx);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->tctx = create_ev_test_ctx(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx->tctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx = mock_be_ctx(test_ctx, test_ctx->tctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx->be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx->be_ctx->ev = tevent_context_init(test_ctx->be_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(test_ctx->be_ctx->ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose check_leaks_push(test_ctx);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose *state = test_ctx;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return 0;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosestatic int test_teardown(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(check_leaks_pop(*state));
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose talloc_zfree(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(leak_check_teardown());
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return 0;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_einval_be(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, NULL, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose test_be_ptask_recv, NULL, "Test ptask", &ptask);
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose assert_int_equal(ret, EINVAL);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_einval_period(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, 0, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, NULL, "Test ptask", &ptask);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(ret, EINVAL);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_null(ptask);
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose}
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bosevoid test_be_ptask_create_einval_send(void **state)
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose{
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct be_ptask *ptask = NULL;
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose errno_t ret;
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov BE_PTASK_OFFLINE_SKIP, 0, NULL,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov test_be_ptask_recv, NULL, "Test ptask", &ptask);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(ret, EINVAL);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_einval_recv(void **state)
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose{
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose struct be_ptask *ptask = NULL;
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose errno_t ret;
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
2962b3d1e072ff2ebbe343095812dad697d6bf1dSumit Bose NULL, NULL, "Test ptask", &ptask);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(ret, EINVAL);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_null(ptask);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov}
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bosevoid test_be_ptask_create_einval_name(void **state)
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose{
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct be_ptask *ptask = NULL;
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose errno_t ret;
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov test_be_ptask_recv, NULL, NULL, &ptask);
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose assert_int_equal(ret, EINVAL);
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose assert_null(ptask);
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose}
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bosevoid test_be_ptask_create_no_delay(void **state)
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose{
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose struct be_ptask *ptask = NULL;
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose time_t now;
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose errno_t ret;
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose
21513e51a4a2eb08f245333bf8f223713a3d7cb3Sumit Bose now = get_current_time();
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose while (!test_ctx->done) {
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose }
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now <= ptask->last_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now <= test_ctx->when);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
210e57203a1502f78a16b05010d52c9121b644e3Lukas Slebodnik
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_create_first_delay(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t now;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose now = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, DELAY, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now + DELAY <= ptask->last_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now + DELAY <= test_ctx->when);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_disable(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_disable(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_false(ptask->enabled);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_enable(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_disable(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_enable(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose }
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_true(now <= ptask->last_execution);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_true(now <= test_ctx->when);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_enable_delay(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t now;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, DELAY, 0, 0,
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_disable(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx->done = false;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_enable(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now + DELAY <= ptask->last_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now + DELAY <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_offline_skip(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose mark_offline(test_ctx);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose now = get_current_time();
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose assert_int_equal(ret, ERR_OK);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose assert_non_null(ptask);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose assert_non_null(ptask->timer);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose next_execution = ptask->next_execution;
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose assert_true(now <= next_execution);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose while (ptask->next_execution == next_execution && !test_ctx->done) {
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose }
cf89f552f06b95bd69d8c61aaa55a330a5d9f6e6Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->enabled);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_offline_disable(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose mark_offline(test_ctx);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose will_return(be_add_online_cb, test_ctx);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek will_return(be_add_offline_cb, test_ctx);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_DISABLE, 0, test_be_ptask_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(test_ctx->add_online_cb_called);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(test_ctx->add_offline_cb_called);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (ptask->enabled && !test_ctx->done) {
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek tevent_loop_once(test_ctx->be_ctx->ev);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek }
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_false(ptask->enabled);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_false(test_ctx->done);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_offline_execute(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose mark_offline(test_ctx);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_EXECUTE, 0, test_be_ptask_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->enabled);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_reschedule_ok(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose next_execution = ptask->next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
ad463501d3bdea4c24c17d792efc1c3e65c08c19Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now <= ptask->last_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(next_execution + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek be_ptask_destroy(&ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_null(ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek}
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_null(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek{
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct be_ptask *ptask = NULL;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t now = 0;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek errno_t ret;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
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 test_be_ptask_recv, test_ctx, "Test ptask",
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek &ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_int_equal(ret, ERR_OK);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_reschedule_error(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now = 0;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_error_recv, test_ctx, "Test ptask",
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_timeout(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek{
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now = 0;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
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",
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose &ptask);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_int_equal(ret, ERR_OK);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_non_null(ptask);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_non_null(ptask->timer);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose
abee3216261e3378430e472f0c992470b33976f0Sumit Bose /* first iterate until the task is executed */
abee3216261e3378430e472f0c992470b33976f0Sumit Bose while (!test_ctx->done && ptask->req == NULL) {
abee3216261e3378430e472f0c992470b33976f0Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose }
abee3216261e3378430e472f0c992470b33976f0Sumit Bose
abee3216261e3378430e472f0c992470b33976f0Sumit Bose /* then iterate until the request is destroyed */
abee3216261e3378430e472f0c992470b33976f0Sumit Bose while (!test_ctx->done && ptask->req != NULL) {
abee3216261e3378430e472f0c992470b33976f0Sumit Bose now = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek }
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_false(test_ctx->done);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek be_ptask_destroy(&ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_null(ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek}
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_reschedule_backoff(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek{
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct be_ptask *ptask = NULL;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t next_execution;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t now_first;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t now_backoff = 0;
abee3216261e3378430e472f0c992470b33976f0Sumit Bose errno_t ret;
abee3216261e3378430e472f0c992470b33976f0Sumit Bose
abee3216261e3378430e472f0c992470b33976f0Sumit Bose now_first = get_current_time();
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);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_int_equal(ret, ERR_OK);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_non_null(ptask);
abee3216261e3378430e472f0c992470b33976f0Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* first run */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose next_execution = ptask->next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
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 now_backoff = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now_first <= ptask->last_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now_first <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(PERIOD*2, ptask->period);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx->done = false;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* second run */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose next_execution = ptask->next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose }
9c8db0a17a66c58c36966b17d004142a4aaace8dSumit Bose
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);
cffe3135f29c737f2598f3c1384bfba1694fb843Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD*2 <= ptask->next_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(PERIOD*2, ptask->period);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_get_period(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t out_period;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_non_null(ptask);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose out_period = be_ptask_get_period(ptask);
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose assert_true(PERIOD == out_period);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bosevoid test_be_ptask_get_timeout(void **state)
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose{
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t out_timeout;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, TIMEOUT,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_send,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_recv, test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose out_timeout = be_ptask_get_timeout(ptask);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_true(TIMEOUT == out_timeout);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose be_ptask_destroy(&ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid test_be_ptask_create_sync(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t now;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov now = get_current_time();
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_sync,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose while (!test_ctx->done) {
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov }
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now <= ptask->last_execution);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(now <= test_ctx->when);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose be_ptask_destroy(&ptask);
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose assert_null(ptask);
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose}
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozekvoid test_be_ptask_sync_reschedule_ok(void **state)
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek{
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct test_ctx *test_ctx = (struct test_ctx *)(*state);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek struct be_ptask *ptask = NULL;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t next_execution;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek time_t now;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek errno_t ret;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek now = get_current_time();
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0, test_be_ptask_sync,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov test_ctx, "Test ptask", &ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_int_equal(ret, ERR_OK);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose next_execution = ptask->next_execution;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
2fc12875f7d51248799016c19c1298b85e06a286Sumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek }
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now <= ptask->last_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(now <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(ptask->last_execution <= test_ctx->when);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_true(next_execution + PERIOD <= ptask->next_execution);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose be_ptask_destroy(&ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose}
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bosevoid test_be_ptask_sync_reschedule_error(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose struct be_ptask *ptask = NULL;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose time_t now = 0;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose errno_t ret;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose BE_PTASK_OFFLINE_SKIP, 0,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_be_ptask_sync_error,
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose test_ctx, "Test ptask", &ptask);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(ret, ERR_OK);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_non_null(ptask);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_non_null(ptask->timer);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek now = get_current_time();
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek tevent_loop_once(test_ctx->be_ctx->ev);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek }
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_true(now + PERIOD <= ptask->next_execution);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_non_null(ptask->timer);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek be_ptask_destroy(&ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek assert_null(ptask);
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid test_be_ptask_sync_reschedule_backoff(void **state)
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose{
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct test_ctx *test_ctx = (struct test_ctx *)(*state);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose struct be_ptask *ptask = NULL;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t next_execution;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t now_first;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose time_t now_backoff = 0;
2fc12875f7d51248799016c19c1298b85e06a286Sumit Bose errno_t ret;
c125e741d3111e2f9b56866ba00835ca05c6f349Jakub Hrozek
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose now_first = get_current_time();
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose ret = be_ptask_create_sync(test_ctx, test_ctx->be_ctx, PERIOD, 0, 0, 0, 0,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose BE_PTASK_OFFLINE_SKIP, PERIOD*2,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_be_ptask_sync_error,
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose test_ctx, "Test ptask", &ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_int_equal(ret, ERR_OK);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose assert_non_null(ptask->timer);
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose /* first run */
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose next_execution = ptask->next_execution;
28c70f003c7b330ab1d998a4eff1248d272a6ba9Sumit Bose
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 now_backoff = get_current_time();
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov tevent_loop_once(test_ctx->be_ctx->ev);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose }
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(now_first <= ptask->last_execution);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(now_first <= test_ctx->when);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(ptask->last_execution <= test_ctx->when);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov assert_true(next_execution + PERIOD <= ptask->next_execution);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(PERIOD*2, ptask->period);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_non_null(ptask->timer);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose test_ctx->done = false;
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose /* second run */
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose next_execution = ptask->next_execution;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose while (!is_sync_ptask_finished(test_ctx, ptask)) {
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose tevent_loop_once(test_ctx->be_ctx->ev);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose }
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose
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
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_true(next_execution + PERIOD*2 <= ptask->next_execution);
e2f6326ea56217afab7623c542a237ee84eb74daSumit Bose assert_int_equal(PERIOD*2, ptask->period);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose assert_non_null(ptask->timer);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose be_ptask_destroy(&ptask);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose assert_null(ptask);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose}
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Boseint main(int argc, const char *argv[])
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose{
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose poptContext pc;
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose int opt;
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose struct poptOption long_options[] = {
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose POPT_AUTOHELP
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose SSSD_DEBUG_OPTS
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose POPT_TABLEEND
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose };
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose const struct CMUnitTest tests[] = {
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_einval_be),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_einval_period),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_einval_send),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_einval_recv),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_einval_name),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_no_delay),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_first_delay),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_disable),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_enable),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_enable_delay),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_offline_skip),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_offline_disable),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_offline_execute),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_reschedule_ok),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_reschedule_null),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_reschedule_error),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_reschedule_timeout),
3e3034199b44e01899ec7ba8152fef3738a0e093Jakub Hrozek new_test(be_ptask_reschedule_backoff),
eb7095099b2dd0afb1d028dbc15d8c5a897d90f8Sumit Bose new_test(be_ptask_get_period),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_get_timeout),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_create_sync),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_sync_reschedule_ok),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_sync_reschedule_error),
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose new_test(be_ptask_sync_reschedule_backoff)
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose };
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose /* Set debug level to invalid value so we can decide if -d 0 was used. */
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose debug_level = SSSDBG_INVALID;
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose pc = poptGetContext(argv[0], argc, argv, long_options, 0);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose while((opt = poptGetNextOpt(pc)) != -1) {
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose switch(opt) {
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose default:
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose fprintf(stderr, "\nInvalid option %s: %s\n\n",
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose poptBadOption(pc, 0), poptStrerror(opt));
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose poptPrintUsage(pc, stderr, 0);
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose return 1;
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose }
2cf7becc05996eb6d8a3352d3d7b97c75652e590Sumit Bose }
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose poptFreeContext(pc);
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG_CLI_INIT(debug_level);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose return cmocka_run_group_tests(tests, NULL, NULL);
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose}
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose