tor/src/test/test_pubsub.c

86 lines
1.8 KiB
C

/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file test_pubsub.c
* \brief Unit tests for publish-subscribe abstraction.
**/
#include "or.h"
#include "test.h"
#include "pubsub.h"
DECLARE_PUBSUB_STRUCT_TYPES(foobar)
DECLARE_PUBSUB_TOPIC(foobar)
DECLARE_NOTIFY_PUBSUB_TOPIC(static, foobar)
IMPLEMENT_PUBSUB_TOPIC(static, foobar)
struct foobar_event_data_t {
unsigned u;
const char *s;
};
struct foobar_subscriber_data_t {
const char *name;
long l;
};
static int
foobar_sub1(foobar_event_data_t *ev, foobar_subscriber_data_t *mine)
{
ev->u += 10;
mine->l += 100;
return 0;
}
static int
foobar_sub2(foobar_event_data_t *ev, foobar_subscriber_data_t *mine)
{
ev->u += 5;
mine->l += 50;
return 0;
}
static void
test_pubsub_basic(void *arg)
{
(void)arg;
foobar_subscriber_data_t subdata1 = { "hi", 0 };
foobar_subscriber_data_t subdata2 = { "wow", 0 };
const foobar_subscriber_t *sub1;
const foobar_subscriber_t *sub2;
foobar_event_data_t ed = { 0, "x" };
foobar_event_data_t ed2 = { 0, "y" };
sub1 = foobar_subscribe(foobar_sub1, &subdata1, SUBSCRIBE_ATSTART, 100);
tt_assert(sub1);
foobar_notify(&ed, 0);
tt_int_op(subdata1.l, OP_EQ, 100);
tt_int_op(subdata2.l, OP_EQ, 0);
tt_int_op(ed.u, OP_EQ, 10);
sub2 = foobar_subscribe(foobar_sub2, &subdata2, 0, 5);
tt_assert(sub2);
foobar_notify(&ed2, 0);
tt_int_op(subdata1.l, OP_EQ, 200);
tt_int_op(subdata2.l, OP_EQ, 50);
tt_int_op(ed2.u, OP_EQ, 15);
foobar_unsubscribe(sub1);
foobar_notify(&ed, 0);
tt_int_op(subdata1.l, OP_EQ, 200);
tt_int_op(subdata2.l, OP_EQ, 100);
tt_int_op(ed.u, OP_EQ, 15);
done:
foobar_clear();
}
struct testcase_t pubsub_tests[] = {
{ "pubsub_basic", test_pubsub_basic, TT_FORK, NULL, NULL },
END_OF_TESTCASES
};