154359Sroberto/*
254359Sroberto * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
354359Sroberto *
4285612Sdelphij * Permission to use, copy, modify, and/or distribute this software for any
554359Sroberto * purpose with or without fee is hereby granted, provided that the above
654359Sroberto * copyright notice and this permission notice appear in all copies.
754359Sroberto *
854359Sroberto * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
954359Sroberto * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1054359Sroberto * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
1154359Sroberto * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1254359Sroberto * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
1354359Sroberto * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14285612Sdelphij * PERFORMANCE OF THIS SOFTWARE.
15285612Sdelphij */
1654359Sroberto
17132451Sroberto/* $Id$ */
1854359Sroberto
1954359Sroberto/*! \file */
2054359Sroberto
21285612Sdelphij#include <config.h>
22285612Sdelphij
2354359Sroberto#include <atf-c.h>
24285612Sdelphij
2554359Sroberto#include <unistd.h>
2654359Sroberto#include <time.h>
2754359Sroberto
2854359Sroberto#include <isc/queue.h>
2954359Sroberto
3054359Sroberto#include "isctest.h"
3154359Sroberto
3254359Srobertotypedef struct item {
3354359Sroberto	int 			value;
34285612Sdelphij	ISC_QLINK(item_t)	qlink;
3554359Sroberto} item_t;
3654359Sroberto
37285612Sdelphijtypedef ISC_QUEUE(item_t) item_queue_t;
38285612Sdelphij
39285612Sdelphijstatic void
40285612Sdelphijitem_init(item_t *item, int value) {
4154359Sroberto	item->value = value;
42285612Sdelphij	ISC_QLINK_INIT(item, qlink);
43293650Sglebius}
44285612Sdelphij
45285612Sdelphij/*
46285612Sdelphij * Individual unit tests
47285612Sdelphij */
48285612Sdelphij
49285612Sdelphij/* Test UDP sendto/recv (IPv4) */
50285612SdelphijATF_TC(queue_valid);
5154359SrobertoATF_TC_HEAD(queue_valid, tc) {
5254359Sroberto	atf_tc_set_md_var(tc, "descr", "Check queue validity");
5354359Sroberto}
5454359SrobertoATF_TC_BODY(queue_valid, tc) {
5554359Sroberto	isc_result_t result;
5654359Sroberto	item_queue_t queue;
57285612Sdelphij	item_t one, two, three, four, five;
58285612Sdelphij	item_t *p;
59285612Sdelphij
6054359Sroberto	UNUSED(tc);
61285612Sdelphij
62285612Sdelphij	ISC_QUEUE_INIT(queue, qlink);
6354359Sroberto
64285612Sdelphij	item_init(&one, 1);
65293650Sglebius	item_init(&two, 2);
6654359Sroberto	item_init(&three, 3);
6754359Sroberto	item_init(&four, 4);
6854359Sroberto	item_init(&five, 5);
6954359Sroberto
70285612Sdelphij	result = isc_test_begin(NULL, ISC_TRUE);
71285612Sdelphij	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
72285612Sdelphij
7354359Sroberto	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
74285612Sdelphij
75285612Sdelphij	ISC_QUEUE_POP(queue, qlink, p);
76285612Sdelphij	ATF_CHECK(p == NULL);
77285612Sdelphij
7854359Sroberto	ATF_CHECK(! ISC_QLINK_LINKED(&one, qlink));
79285612Sdelphij	ISC_QUEUE_PUSH(queue, &one, qlink);
80285612Sdelphij	ATF_CHECK(ISC_QLINK_LINKED(&one, qlink));
81285612Sdelphij
82285612Sdelphij	ATF_CHECK(! ISC_QUEUE_EMPTY(queue));
83285612Sdelphij
84285612Sdelphij	ISC_QUEUE_POP(queue, qlink, p);
85285612Sdelphij	ATF_REQUIRE(p != NULL);
86285612Sdelphij	ATF_CHECK_EQ(p->value, 1);
87285612Sdelphij	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
8854359Sroberto	ATF_CHECK(! ISC_QLINK_LINKED(p, qlink));
89285612Sdelphij
90285612Sdelphij	ISC_QUEUE_PUSH(queue, p, qlink);
91285612Sdelphij	ATF_CHECK(! ISC_QUEUE_EMPTY(queue));
92285612Sdelphij	ATF_CHECK(ISC_QLINK_LINKED(p, qlink));
93285612Sdelphij
94285612Sdelphij	ATF_CHECK(! ISC_QLINK_LINKED(&two, qlink));
95285612Sdelphij	ISC_QUEUE_PUSH(queue, &two, qlink);
96285612Sdelphij	ATF_CHECK(ISC_QLINK_LINKED(&two, qlink));
97285612Sdelphij
98293650Sglebius	ATF_CHECK(! ISC_QLINK_LINKED(&three, qlink));
99285612Sdelphij	ISC_QUEUE_PUSH(queue, &three, qlink);
100285612Sdelphij	ATF_CHECK(ISC_QLINK_LINKED(&three, qlink));
10154359Sroberto
102285612Sdelphij	ATF_CHECK(! ISC_QLINK_LINKED(&four, qlink));
103285612Sdelphij	ISC_QUEUE_PUSH(queue, &four, qlink);
10454359Sroberto	ATF_CHECK(ISC_QLINK_LINKED(&four, qlink));
105285612Sdelphij
106285612Sdelphij	ATF_CHECK(! ISC_QLINK_LINKED(&five, qlink));
107285612Sdelphij	ISC_QUEUE_PUSH(queue, &five, qlink);
10854359Sroberto	ATF_CHECK(ISC_QLINK_LINKED(&five, qlink));
10954359Sroberto
11054359Sroberto	ISC_QUEUE_POP(queue, qlink, p);
11154359Sroberto	ATF_REQUIRE(p != NULL);
11254359Sroberto	ATF_CHECK_EQ(p->value, 1);
11354359Sroberto
11454359Sroberto	ISC_QUEUE_POP(queue, qlink, p);
11554359Sroberto	ATF_REQUIRE(p != NULL);
11654359Sroberto	ATF_CHECK_EQ(p->value, 2);
117285612Sdelphij
11854359Sroberto	ISC_QUEUE_POP(queue, qlink, p);
119285612Sdelphij	ATF_REQUIRE(p != NULL);
120285612Sdelphij	ATF_CHECK_EQ(p->value, 3);
12154359Sroberto
12254359Sroberto	ISC_QUEUE_POP(queue, qlink, p);
12354359Sroberto	ATF_REQUIRE(p != NULL);
124285612Sdelphij	ATF_CHECK_EQ(p->value, 4);
12554359Sroberto
12654359Sroberto	ISC_QUEUE_POP(queue, qlink, p);
127285612Sdelphij	ATF_REQUIRE(p != NULL);
128285612Sdelphij	ATF_CHECK_EQ(p->value, 5);
12954359Sroberto
13054359Sroberto	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
13154359Sroberto
13254359Sroberto	ISC_QUEUE_DESTROY(queue);
13354359Sroberto	isc_test_end();
13454359Sroberto}
13554359Sroberto
13654359Sroberto/*
137285612Sdelphij * Main
138285612Sdelphij */
139285612SdelphijATF_TP_ADD_TCS(tp) {
140285612Sdelphij	ATF_TP_ADD_TC(tp, queue_valid);
141285612Sdelphij
142285612Sdelphij	return (atf_no_error());
143285612Sdelphij}
144285612Sdelphij
145285612Sdelphij