xref: /minix3/external/bsd/bind/dist/lib/isc/tests/taskpool_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: taskpool_test.c,v 1.1.1.4 2014/12/10 03:34:44 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <unistd.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <isc/task.h>
30*00b67f09SDavid van Moolenbroek #include <isc/taskpool.h>
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek #include "isctest.h"
33*00b67f09SDavid van Moolenbroek 
34*00b67f09SDavid van Moolenbroek /*
35*00b67f09SDavid van Moolenbroek  * Individual unit tests
36*00b67f09SDavid van Moolenbroek  */
37*00b67f09SDavid van Moolenbroek 
38*00b67f09SDavid van Moolenbroek /* Create a taskpool */
39*00b67f09SDavid van Moolenbroek ATF_TC(create_pool);
ATF_TC_HEAD(create_pool,tc)40*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(create_pool, tc) {
41*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "create a taskpool");
42*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(create_pool,tc)43*00b67f09SDavid van Moolenbroek ATF_TC_BODY(create_pool, tc) {
44*00b67f09SDavid van Moolenbroek 	isc_result_t result;
45*00b67f09SDavid van Moolenbroek 	isc_taskpool_t *pool = NULL;
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
48*00b67f09SDavid van Moolenbroek 
49*00b67f09SDavid van Moolenbroek 	result = isc_test_begin(NULL, ISC_TRUE);
50*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_create(taskmgr, mctx, 8, 2, &pool);
53*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
54*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 8);
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek 	isc_taskpool_destroy(&pool);
57*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool, NULL);
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek 	isc_test_end();
60*00b67f09SDavid van Moolenbroek }
61*00b67f09SDavid van Moolenbroek 
62*00b67f09SDavid van Moolenbroek /* Resize a taskpool */
63*00b67f09SDavid van Moolenbroek ATF_TC(expand_pool);
ATF_TC_HEAD(expand_pool,tc)64*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(expand_pool, tc) {
65*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "expand a taskpool");
66*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(expand_pool,tc)67*00b67f09SDavid van Moolenbroek ATF_TC_BODY(expand_pool, tc) {
68*00b67f09SDavid van Moolenbroek 	isc_result_t result;
69*00b67f09SDavid van Moolenbroek 	isc_taskpool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL;
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek 	result = isc_test_begin(NULL, ISC_TRUE);
74*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_create(taskmgr, mctx, 10, 2, &pool1);
77*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
78*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool1), 10);
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek 	/* resizing to a smaller size should have no effect */
81*00b67f09SDavid van Moolenbroek 	hold = pool1;
82*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_expand(&pool1, 5, &pool2);
83*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
84*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
85*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool2, hold);
86*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool1, NULL);
87*00b67f09SDavid van Moolenbroek 	pool1 = pool2;
88*00b67f09SDavid van Moolenbroek 	pool2 = NULL;
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek 	/* resizing to the same size should have no effect */
91*00b67f09SDavid van Moolenbroek 	hold = pool1;
92*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_expand(&pool1, 10, &pool2);
93*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
94*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
95*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool2, hold);
96*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool1, NULL);
97*00b67f09SDavid van Moolenbroek 	pool1 = pool2;
98*00b67f09SDavid van Moolenbroek 	pool2 = NULL;
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek 	/* resizing to larger size should make a new pool */
101*00b67f09SDavid van Moolenbroek 	hold = pool1;
102*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_expand(&pool1, 20, &pool2);
103*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
104*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 20);
105*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pool2 != hold);
106*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool1, NULL);
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek 	isc_taskpool_destroy(&pool2);
109*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool2, NULL);
110*00b67f09SDavid van Moolenbroek 
111*00b67f09SDavid van Moolenbroek 	isc_test_end();
112*00b67f09SDavid van Moolenbroek }
113*00b67f09SDavid van Moolenbroek 
114*00b67f09SDavid van Moolenbroek /* Get tasks */
115*00b67f09SDavid van Moolenbroek ATF_TC(get_tasks);
ATF_TC_HEAD(get_tasks,tc)116*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(get_tasks, tc) {
117*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "create a taskpool");
118*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(get_tasks,tc)119*00b67f09SDavid van Moolenbroek ATF_TC_BODY(get_tasks, tc) {
120*00b67f09SDavid van Moolenbroek 	isc_result_t result;
121*00b67f09SDavid van Moolenbroek 	isc_taskpool_t *pool = NULL;
122*00b67f09SDavid van Moolenbroek 	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
125*00b67f09SDavid van Moolenbroek 
126*00b67f09SDavid van Moolenbroek 	result = isc_test_begin(NULL, ISC_TRUE);
127*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
130*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
131*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek 	/* two tasks in pool; make sure we can access them more than twice */
134*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task1);
135*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(ISCAPI_TASK_VALID(task1));
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task2);
138*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(ISCAPI_TASK_VALID(task2));
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task3);
141*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(ISCAPI_TASK_VALID(task3));
142*00b67f09SDavid van Moolenbroek 
143*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task1);
144*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task2);
145*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task3);
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek 	isc_taskpool_destroy(&pool);
148*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool, NULL);
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	isc_test_end();
151*00b67f09SDavid van Moolenbroek }
152*00b67f09SDavid van Moolenbroek 
153*00b67f09SDavid van Moolenbroek /* Get tasks */
154*00b67f09SDavid van Moolenbroek ATF_TC(set_privilege);
ATF_TC_HEAD(set_privilege,tc)155*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(set_privilege, tc) {
156*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "create a taskpool");
157*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(set_privilege,tc)158*00b67f09SDavid van Moolenbroek ATF_TC_BODY(set_privilege, tc) {
159*00b67f09SDavid van Moolenbroek 	isc_result_t result;
160*00b67f09SDavid van Moolenbroek 	isc_taskpool_t *pool = NULL;
161*00b67f09SDavid van Moolenbroek 	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	result = isc_test_begin(NULL, ISC_TRUE);
166*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
169*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
170*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	isc_taskpool_setprivilege(pool, ISC_TRUE);
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task1);
175*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task2);
176*00b67f09SDavid van Moolenbroek 	isc_taskpool_gettask(pool, &task3);
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek 	ATF_CHECK(ISCAPI_TASK_VALID(task1));
179*00b67f09SDavid van Moolenbroek 	ATF_CHECK(ISCAPI_TASK_VALID(task2));
180*00b67f09SDavid van Moolenbroek 	ATF_CHECK(ISCAPI_TASK_VALID(task3));
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	ATF_CHECK(isc_task_privilege(task1));
183*00b67f09SDavid van Moolenbroek 	ATF_CHECK(isc_task_privilege(task2));
184*00b67f09SDavid van Moolenbroek 	ATF_CHECK(isc_task_privilege(task3));
185*00b67f09SDavid van Moolenbroek 
186*00b67f09SDavid van Moolenbroek 	isc_taskpool_setprivilege(pool, ISC_FALSE);
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!isc_task_privilege(task1));
189*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!isc_task_privilege(task2));
190*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!isc_task_privilege(task3));
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task1);
193*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task2);
194*00b67f09SDavid van Moolenbroek 	isc_task_destroy(&task3);
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek 	isc_taskpool_destroy(&pool);
197*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(pool, NULL);
198*00b67f09SDavid van Moolenbroek 
199*00b67f09SDavid van Moolenbroek 	isc_test_end();
200*00b67f09SDavid van Moolenbroek }
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek /*
203*00b67f09SDavid van Moolenbroek  * Main
204*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)205*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
206*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, create_pool);
207*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, expand_pool);
208*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, get_tasks);
209*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, set_privilege);
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek 
214