mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 13:43:47 +01:00
86 lines
1.8 KiB
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
|
|
};
|
|
|