1275970Scy/*
2275970Scy * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3275970Scy *
4275970Scy * Permission to use, copy, modify, and/or distribute this software for any
5275970Scy * purpose with or without fee is hereby granted, provided that the above
6275970Scy * copyright notice and this permission notice appear in all copies.
7275970Scy *
8275970Scy * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9275970Scy * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10275970Scy * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11275970Scy * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12275970Scy * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13275970Scy * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14275970Scy * PERFORMANCE OF THIS SOFTWARE.
15275970Scy */
16275970Scy
17275970Scy/* $Id$ */
18275970Scy
19275970Scy/*! \file */
20275970Scy
21275970Scy#include <config.h>
22275970Scy
23275970Scy#include <atf-c.h>
24275970Scy
25275970Scy#include <unistd.h>
26275970Scy#include <time.h>
27275970Scy
28275970Scy#include <isc/queue.h>
29275970Scy
30275970Scy#include "isctest.h"
31275970Scy
32275970Scytypedef struct item {
33275970Scy	int 			value;
34275970Scy	ISC_QLINK(item_t)	qlink;
35275970Scy} item_t;
36275970Scy
37275970Scytypedef ISC_QUEUE(item_t) item_queue_t;
38275970Scy
39275970Scystatic void
40275970Scyitem_init(item_t *item, int value) {
41275970Scy	item->value = value;
42275970Scy	ISC_QLINK_INIT(item, qlink);
43275970Scy}
44275970Scy
45275970Scy/*
46275970Scy * Individual unit tests
47275970Scy */
48275970Scy
49275970Scy/* Test UDP sendto/recv (IPv4) */
50275970ScyATF_TC(queue_valid);
51275970ScyATF_TC_HEAD(queue_valid, tc) {
52275970Scy	atf_tc_set_md_var(tc, "descr", "Check queue validity");
53275970Scy}
54275970ScyATF_TC_BODY(queue_valid, tc) {
55275970Scy	isc_result_t result;
56275970Scy	item_queue_t queue;
57275970Scy	item_t one, two, three, four, five;
58275970Scy	item_t *p;
59275970Scy
60275970Scy	UNUSED(tc);
61275970Scy
62275970Scy	ISC_QUEUE_INIT(queue, qlink);
63275970Scy
64275970Scy	item_init(&one, 1);
65275970Scy	item_init(&two, 2);
66275970Scy	item_init(&three, 3);
67275970Scy	item_init(&four, 4);
68275970Scy	item_init(&five, 5);
69275970Scy
70275970Scy	result = isc_test_begin(NULL, ISC_TRUE);
71275970Scy	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
72275970Scy
73275970Scy	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
74275970Scy
75275970Scy	ISC_QUEUE_POP(queue, qlink, p);
76275970Scy	ATF_CHECK(p == NULL);
77275970Scy
78275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(&one, qlink));
79275970Scy	ISC_QUEUE_PUSH(queue, &one, qlink);
80275970Scy	ATF_CHECK(ISC_QLINK_LINKED(&one, qlink));
81275970Scy
82275970Scy	ATF_CHECK(! ISC_QUEUE_EMPTY(queue));
83275970Scy
84275970Scy	ISC_QUEUE_POP(queue, qlink, p);
85275970Scy	ATF_REQUIRE(p != NULL);
86275970Scy	ATF_CHECK_EQ(p->value, 1);
87275970Scy	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
88275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(p, qlink));
89275970Scy
90275970Scy	ISC_QUEUE_PUSH(queue, p, qlink);
91275970Scy	ATF_CHECK(! ISC_QUEUE_EMPTY(queue));
92275970Scy	ATF_CHECK(ISC_QLINK_LINKED(p, qlink));
93275970Scy
94275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(&two, qlink));
95275970Scy	ISC_QUEUE_PUSH(queue, &two, qlink);
96275970Scy	ATF_CHECK(ISC_QLINK_LINKED(&two, qlink));
97275970Scy
98275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(&three, qlink));
99275970Scy	ISC_QUEUE_PUSH(queue, &three, qlink);
100275970Scy	ATF_CHECK(ISC_QLINK_LINKED(&three, qlink));
101275970Scy
102275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(&four, qlink));
103275970Scy	ISC_QUEUE_PUSH(queue, &four, qlink);
104275970Scy	ATF_CHECK(ISC_QLINK_LINKED(&four, qlink));
105275970Scy
106275970Scy	ATF_CHECK(! ISC_QLINK_LINKED(&five, qlink));
107275970Scy	ISC_QUEUE_PUSH(queue, &five, qlink);
108275970Scy	ATF_CHECK(ISC_QLINK_LINKED(&five, qlink));
109275970Scy
110275970Scy	ISC_QUEUE_POP(queue, qlink, p);
111275970Scy	ATF_REQUIRE(p != NULL);
112275970Scy	ATF_CHECK_EQ(p->value, 1);
113275970Scy
114275970Scy	ISC_QUEUE_POP(queue, qlink, p);
115275970Scy	ATF_REQUIRE(p != NULL);
116275970Scy	ATF_CHECK_EQ(p->value, 2);
117275970Scy
118275970Scy	ISC_QUEUE_POP(queue, qlink, p);
119275970Scy	ATF_REQUIRE(p != NULL);
120275970Scy	ATF_CHECK_EQ(p->value, 3);
121275970Scy
122275970Scy	ISC_QUEUE_POP(queue, qlink, p);
123275970Scy	ATF_REQUIRE(p != NULL);
124275970Scy	ATF_CHECK_EQ(p->value, 4);
125275970Scy
126275970Scy	ISC_QUEUE_POP(queue, qlink, p);
127275970Scy	ATF_REQUIRE(p != NULL);
128275970Scy	ATF_CHECK_EQ(p->value, 5);
129275970Scy
130275970Scy	ATF_CHECK(ISC_QUEUE_EMPTY(queue));
131275970Scy
132275970Scy	ISC_QUEUE_DESTROY(queue);
133275970Scy	isc_test_end();
134275970Scy}
135275970Scy
136275970Scy/*
137275970Scy * Main
138275970Scy */
139275970ScyATF_TP_ADD_TCS(tp) {
140275970Scy	ATF_TP_ADD_TC(tp, queue_valid);
141275970Scy
142275970Scy	return (atf_no_error());
143275970Scy}
144275970Scy
145