libevl/tests/observable-onchange.c

57 lines
1.5 KiB
C

/*
* SPDX-License-Identifier: MIT
*/
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sched.h>
#include <pthread.h>
#include <errno.h>
#include <evl/thread.h>
#include <evl/observable.h>
#include "helpers.h"
int main(int argc, char *argv[])
{
struct evl_notification nf;
struct evl_notice next;
int tfd, ofd;
ssize_t ret;
__Tcall_assert(tfd, evl_attach_self("observable-onchange:%d", getpid()));
__Tcall_assert(ofd, evl_new_observable("observable:%d", getpid()));
__Tcall_assert(ret, evl_subscribe(ofd, 16, EVL_NOTIFY_ONCHANGE));
next.tag = EVL_NOTICE_USER;
/* Send 1, 1, 2 */
next.event.lval = 1ULL;
__Tcall_assert(ret, evl_update_observable(ofd, &next, 1));
__Texpr_assert(ret == 1);
next.event.lval = 1ULL;
__Tcall_assert(ret, evl_update_observable(ofd, &next, 1));
__Texpr_assert(ret == 1);
next.event.lval = 2ULL;
__Tcall_assert(ret, evl_update_observable(ofd, &next, 1));
__Texpr_assert(ret == 1);
/* Receive 1, 2. */
__Tcall_assert(ret, evl_read_observable(ofd, &nf, 1));
__Texpr_assert(ret == 1);
__Texpr_assert(nf.tag == EVL_NOTICE_USER);
__Texpr_assert(nf.event.lval == 1ULL);
__Tcall_assert(ret, evl_read_observable(ofd, &nf, 1));
__Texpr_assert(ret == 1);
__Texpr_assert(nf.tag == EVL_NOTICE_USER);
__Texpr_assert(nf.event.lval == 2ULL);
/* There should be nothing more to be read. */
__Tcall_errno_assert(ret, fcntl(ofd, F_SETFL, O_NONBLOCK));
__Fcall_assert(ret, evl_read_observable(ofd, &nf, 1));
__Texpr_assert(ret == -EAGAIN);
return 0;
}