1179189Sjb/*
2179189Sjb * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3179189Sjb *
4179189Sjb * Permission to use, copy, modify, and/or distribute this software for any
5179189Sjb * purpose with or without fee is hereby granted, provided that the above
6179189Sjb * copyright notice and this permission notice appear in all copies.
7179189Sjb *
8179189Sjb * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9179189Sjb * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10179189Sjb * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11179189Sjb * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12179189Sjb * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13179189Sjb * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14179189Sjb * PERFORMANCE OF THIS SOFTWARE.
15179189Sjb */
16179189Sjb
17179189Sjb/* $Id$ */
18179189Sjb
19179189Sjb/*! \file */
20179189Sjb
21179189Sjb#include <config.h>
22179189Sjb
23179189Sjb#include <atf-c.h>
24179189Sjb
25179189Sjb#include <unistd.h>
26179189Sjb
27179189Sjb#include <isc/task.h>
28179189Sjb#include <isc/taskpool.h>
29179189Sjb
30179189Sjb#include "isctest.h"
31179189Sjb
32179189Sjb/*
33179189Sjb * Individual unit tests
34179189Sjb */
35179189Sjb
36179189Sjb/* Create a taskpool */
37179189SjbATF_TC(create_pool);
38179189SjbATF_TC_HEAD(create_pool, tc) {
39179189Sjb	atf_tc_set_md_var(tc, "descr", "create a taskpool");
40179189Sjb}
41179189SjbATF_TC_BODY(create_pool, tc) {
42179189Sjb	isc_result_t result;
43179189Sjb	isc_taskpool_t *pool = NULL;
44
45	UNUSED(tc);
46
47	result = isc_test_begin(NULL, ISC_TRUE);
48	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
49
50	result = isc_taskpool_create(taskmgr, mctx, 8, 2, &pool);
51	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
52	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 8);
53
54	isc_taskpool_destroy(&pool);
55	ATF_REQUIRE_EQ(pool, NULL);
56
57	isc_test_end();
58}
59
60/* Resize a taskpool */
61ATF_TC(expand_pool);
62ATF_TC_HEAD(expand_pool, tc) {
63	atf_tc_set_md_var(tc, "descr", "expand a taskpool");
64}
65ATF_TC_BODY(expand_pool, tc) {
66	isc_result_t result;
67	isc_taskpool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL;
68
69	UNUSED(tc);
70
71	result = isc_test_begin(NULL, ISC_TRUE);
72	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
73
74	result = isc_taskpool_create(taskmgr, mctx, 10, 2, &pool1);
75	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
76	ATF_REQUIRE_EQ(isc_taskpool_size(pool1), 10);
77
78	/* resizing to a smaller size should have no effect */
79	hold = pool1;
80	result = isc_taskpool_expand(&pool1, 5, &pool2);
81	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
82	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
83	ATF_REQUIRE_EQ(pool2, hold);
84	ATF_REQUIRE_EQ(pool1, NULL);
85	pool1 = pool2;
86	pool2 = NULL;
87
88	/* resizing to the same size should have no effect */
89	hold = pool1;
90	result = isc_taskpool_expand(&pool1, 10, &pool2);
91	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
92	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
93	ATF_REQUIRE_EQ(pool2, hold);
94	ATF_REQUIRE_EQ(pool1, NULL);
95	pool1 = pool2;
96	pool2 = NULL;
97
98	/* resizing to larger size should make a new pool */
99	hold = pool1;
100	result = isc_taskpool_expand(&pool1, 20, &pool2);
101	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
102	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 20);
103	ATF_REQUIRE(pool2 != hold);
104	ATF_REQUIRE_EQ(pool1, NULL);
105
106	isc_taskpool_destroy(&pool2);
107	ATF_REQUIRE_EQ(pool2, NULL);
108
109	isc_test_end();
110}
111
112/* Get tasks */
113ATF_TC(get_tasks);
114ATF_TC_HEAD(get_tasks, tc) {
115	atf_tc_set_md_var(tc, "descr", "create a taskpool");
116}
117ATF_TC_BODY(get_tasks, tc) {
118	isc_result_t result;
119	isc_taskpool_t *pool = NULL;
120	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
121
122	UNUSED(tc);
123
124	result = isc_test_begin(NULL, ISC_TRUE);
125	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
126
127	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
128	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
129	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
130
131	/* two tasks in pool; make sure we can access them more than twice */
132	isc_taskpool_gettask(pool, &task1);
133	ATF_REQUIRE(ISCAPI_TASK_VALID(task1));
134
135	isc_taskpool_gettask(pool, &task2);
136	ATF_REQUIRE(ISCAPI_TASK_VALID(task2));
137
138	isc_taskpool_gettask(pool, &task3);
139	ATF_REQUIRE(ISCAPI_TASK_VALID(task3));
140
141	isc_task_destroy(&task1);
142	isc_task_destroy(&task2);
143	isc_task_destroy(&task3);
144
145	isc_taskpool_destroy(&pool);
146	ATF_REQUIRE_EQ(pool, NULL);
147
148	isc_test_end();
149}
150
151/* Get tasks */
152ATF_TC(set_privilege);
153ATF_TC_HEAD(set_privilege, tc) {
154	atf_tc_set_md_var(tc, "descr", "create a taskpool");
155}
156ATF_TC_BODY(set_privilege, tc) {
157	isc_result_t result;
158	isc_taskpool_t *pool = NULL;
159	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
160
161	UNUSED(tc);
162
163	result = isc_test_begin(NULL, ISC_TRUE);
164	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
165
166	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
167	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
168	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
169
170	isc_taskpool_setprivilege(pool, ISC_TRUE);
171
172	isc_taskpool_gettask(pool, &task1);
173	isc_taskpool_gettask(pool, &task2);
174	isc_taskpool_gettask(pool, &task3);
175
176	ATF_CHECK(ISCAPI_TASK_VALID(task1));
177	ATF_CHECK(ISCAPI_TASK_VALID(task2));
178	ATF_CHECK(ISCAPI_TASK_VALID(task3));
179
180	ATF_CHECK(isc_task_privilege(task1));
181	ATF_CHECK(isc_task_privilege(task2));
182	ATF_CHECK(isc_task_privilege(task3));
183
184	isc_taskpool_setprivilege(pool, ISC_FALSE);
185
186	ATF_CHECK(!isc_task_privilege(task1));
187	ATF_CHECK(!isc_task_privilege(task2));
188	ATF_CHECK(!isc_task_privilege(task3));
189
190	isc_task_destroy(&task1);
191	isc_task_destroy(&task2);
192	isc_task_destroy(&task3);
193
194	isc_taskpool_destroy(&pool);
195	ATF_REQUIRE_EQ(pool, NULL);
196
197	isc_test_end();
198}
199
200/*
201 * Main
202 */
203ATF_TP_ADD_TCS(tp) {
204	ATF_TP_ADD_TC(tp, create_pool);
205	ATF_TP_ADD_TC(tp, expand_pool);
206	ATF_TP_ADD_TC(tp, get_tasks);
207	ATF_TP_ADD_TC(tp, set_privilege);
208
209	return (atf_no_error());
210}
211
212