mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-12 05:33:35 +01:00
99 lines
2.1 KiB
C
99 lines
2.1 KiB
C
/* Copyright (c) 2016-2019, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
#include "orconfig.h"
|
|
#include "test/test.h"
|
|
|
|
#include "lib/container/handles.h"
|
|
#include "lib/log/util_bug.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
typedef struct demo_t {
|
|
HANDLE_ENTRY(demo, demo_t);
|
|
int val;
|
|
} demo_t;
|
|
|
|
HANDLE_DECL(demo, demo_t, static)
|
|
#define demo_handle_free(h) \
|
|
FREE_AND_NULL(demo_handle_t, demo_handle_free_, (h))
|
|
HANDLE_IMPL(demo, demo_t, static)
|
|
|
|
static demo_t *
|
|
demo_new(int val)
|
|
{
|
|
demo_t *d = tor_malloc_zero(sizeof(demo_t));
|
|
d->val = val;
|
|
return d;
|
|
}
|
|
|
|
static void
|
|
demo_free(demo_t *d)
|
|
{
|
|
if (d == NULL)
|
|
return;
|
|
demo_handles_clear(d);
|
|
tor_free(d);
|
|
}
|
|
|
|
static void
|
|
test_handle_basic(void *arg)
|
|
{
|
|
(void) arg;
|
|
demo_t *d1 = NULL, *d2 = NULL;
|
|
demo_handle_t *wr1 = NULL, *wr2 = NULL, *wr3 = NULL, *wr4 = NULL;
|
|
|
|
d1 = demo_new(9000);
|
|
d2 = demo_new(9009);
|
|
|
|
wr1 = demo_handle_new(d1);
|
|
wr2 = demo_handle_new(d1);
|
|
wr3 = demo_handle_new(d1);
|
|
wr4 = demo_handle_new(d2);
|
|
|
|
tt_assert(wr1);
|
|
tt_assert(wr2);
|
|
tt_assert(wr3);
|
|
tt_assert(wr4);
|
|
|
|
tt_ptr_op(demo_handle_get(wr1), OP_EQ, d1);
|
|
tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1);
|
|
tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1);
|
|
tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2);
|
|
|
|
demo_handle_free(wr1);
|
|
wr1 = NULL;
|
|
tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1);
|
|
tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1);
|
|
tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2);
|
|
|
|
demo_free(d1);
|
|
d1 = NULL;
|
|
tt_ptr_op(demo_handle_get(wr2), OP_EQ, NULL);
|
|
tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL);
|
|
tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2);
|
|
|
|
demo_handle_free(wr2);
|
|
wr2 = NULL;
|
|
tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL);
|
|
tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2);
|
|
|
|
demo_handle_free(wr3);
|
|
wr3 = NULL;
|
|
done:
|
|
demo_handle_free(wr1);
|
|
demo_handle_free(wr2);
|
|
demo_handle_free(wr3);
|
|
demo_handle_free(wr4);
|
|
demo_free(d1);
|
|
demo_free(d2);
|
|
}
|
|
|
|
#define HANDLE_TEST(name, flags) \
|
|
{ #name, test_handle_ ##name, (flags), NULL, NULL }
|
|
|
|
struct testcase_t handle_tests[] = {
|
|
HANDLE_TEST(basic, 0),
|
|
END_OF_TESTCASES
|
|
};
|