taskpool_test.c revision 275970
1256056Sgrehan/*
2256056Sgrehan * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3256056Sgrehan *
4256056Sgrehan * Permission to use, copy, modify, and/or distribute this software for any
5256056Sgrehan * purpose with or without fee is hereby granted, provided that the above
6256056Sgrehan * copyright notice and this permission notice appear in all copies.
7256056Sgrehan *
8256056Sgrehan * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9256056Sgrehan * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10256056Sgrehan * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11256056Sgrehan * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12256056Sgrehan * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13256056Sgrehan * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14256056Sgrehan * PERFORMANCE OF THIS SOFTWARE.
15256056Sgrehan */
16256056Sgrehan
17256056Sgrehan/* $Id$ */
18256056Sgrehan
19256056Sgrehan/*! \file */
20256056Sgrehan
21256056Sgrehan#include <config.h>
22256056Sgrehan
23256056Sgrehan#include <atf-c.h>
24256056Sgrehan
25256056Sgrehan#include <unistd.h>
26256056Sgrehan
27256056Sgrehan#include <isc/task.h>
28256056Sgrehan#include <isc/taskpool.h>
29256056Sgrehan
30256056Sgrehan#include "isctest.h"
31256056Sgrehan
32256056Sgrehan/*
33256056Sgrehan * Individual unit tests
34256056Sgrehan */
35256056Sgrehan
36256056Sgrehan/* Create a taskpool */
37256056SgrehanATF_TC(create_pool);
38256056SgrehanATF_TC_HEAD(create_pool, tc) {
39256056Sgrehan	atf_tc_set_md_var(tc, "descr", "create a taskpool");
40256056Sgrehan}
41256056SgrehanATF_TC_BODY(create_pool, tc) {
42256056Sgrehan	isc_result_t result;
43256056Sgrehan	isc_taskpool_t *pool = NULL;
44256056Sgrehan
45256056Sgrehan	UNUSED(tc);
46256056Sgrehan
47256056Sgrehan	result = isc_test_begin(NULL, ISC_TRUE);
48256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
49256056Sgrehan
50256056Sgrehan	result = isc_taskpool_create(taskmgr, mctx, 8, 2, &pool);
51276349Sneel	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
52256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 8);
53280745Smav
54256056Sgrehan	isc_taskpool_destroy(&pool);
55256056Sgrehan	ATF_REQUIRE_EQ(pool, NULL);
56256056Sgrehan
57256056Sgrehan	isc_test_end();
58256056Sgrehan}
59256056Sgrehan
60256056Sgrehan/* Resize a taskpool */
61256056SgrehanATF_TC(expand_pool);
62256056SgrehanATF_TC_HEAD(expand_pool, tc) {
63256056Sgrehan	atf_tc_set_md_var(tc, "descr", "expand a taskpool");
64256056Sgrehan}
65256056SgrehanATF_TC_BODY(expand_pool, tc) {
66256056Sgrehan	isc_result_t result;
67256056Sgrehan	isc_taskpool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL;
68256056Sgrehan
69256056Sgrehan	UNUSED(tc);
70256056Sgrehan
71256056Sgrehan	result = isc_test_begin(NULL, ISC_TRUE);
72256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
73256056Sgrehan
74256056Sgrehan	result = isc_taskpool_create(taskmgr, mctx, 10, 2, &pool1);
75256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
76256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool1), 10);
77256056Sgrehan
78256056Sgrehan	/* resizing to a smaller size should have no effect */
79256056Sgrehan	hold = pool1;
80256056Sgrehan	result = isc_taskpool_expand(&pool1, 5, &pool2);
81256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
82256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
83256056Sgrehan	ATF_REQUIRE_EQ(pool2, hold);
84256056Sgrehan	ATF_REQUIRE_EQ(pool1, NULL);
85256056Sgrehan	pool1 = pool2;
86256056Sgrehan	pool2 = NULL;
87256056Sgrehan
88256056Sgrehan	/* resizing to the same size should have no effect */
89256056Sgrehan	hold = pool1;
90280740Smav	result = isc_taskpool_expand(&pool1, 10, &pool2);
91256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
92256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10);
93256056Sgrehan	ATF_REQUIRE_EQ(pool2, hold);
94256056Sgrehan	ATF_REQUIRE_EQ(pool1, NULL);
95256056Sgrehan	pool1 = pool2;
96256056Sgrehan	pool2 = NULL;
97256056Sgrehan
98256056Sgrehan	/* resizing to larger size should make a new pool */
99256056Sgrehan	hold = pool1;
100256056Sgrehan	result = isc_taskpool_expand(&pool1, 20, &pool2);
101267339Sjhb	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
102267339Sjhb	ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 20);
103267339Sjhb	ATF_REQUIRE(pool2 != hold);
104267339Sjhb	ATF_REQUIRE_EQ(pool1, NULL);
105267339Sjhb
106267339Sjhb	isc_taskpool_destroy(&pool2);
107267339Sjhb	ATF_REQUIRE_EQ(pool2, NULL);
108256056Sgrehan
109256056Sgrehan	isc_test_end();
110256056Sgrehan}
111256056Sgrehan
112256056Sgrehan/* Get tasks */
113256056SgrehanATF_TC(get_tasks);
114256056SgrehanATF_TC_HEAD(get_tasks, tc) {
115256056Sgrehan	atf_tc_set_md_var(tc, "descr", "create a taskpool");
116256056Sgrehan}
117256056SgrehanATF_TC_BODY(get_tasks, tc) {
118256056Sgrehan	isc_result_t result;
119256056Sgrehan	isc_taskpool_t *pool = NULL;
120256056Sgrehan	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
121276349Sneel
122276349Sneel	UNUSED(tc);
123256056Sgrehan
124256056Sgrehan	result = isc_test_begin(NULL, ISC_TRUE);
125256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
126256056Sgrehan
127282306Smav	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
128256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
129256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
130256056Sgrehan
131256056Sgrehan	/* two tasks in pool; make sure we can access them more than twice */
132256056Sgrehan	isc_taskpool_gettask(pool, &task1);
133256164Sdim	ATF_REQUIRE(ISCAPI_TASK_VALID(task1));
134256164Sdim
135280745Smav	isc_taskpool_gettask(pool, &task2);
136256056Sgrehan	ATF_REQUIRE(ISCAPI_TASK_VALID(task2));
137256056Sgrehan
138282846Smav	isc_taskpool_gettask(pool, &task3);
139256056Sgrehan	ATF_REQUIRE(ISCAPI_TASK_VALID(task3));
140256056Sgrehan
141280736Smav	isc_task_destroy(&task1);
142256056Sgrehan	isc_task_destroy(&task2);
143256056Sgrehan	isc_task_destroy(&task3);
144282846Smav
145267339Sjhb	isc_taskpool_destroy(&pool);
146256056Sgrehan	ATF_REQUIRE_EQ(pool, NULL);
147256056Sgrehan
148256056Sgrehan	isc_test_end();
149256056Sgrehan}
150256056Sgrehan
151256056Sgrehan/* Get tasks */
152256056SgrehanATF_TC(set_privilege);
153256056SgrehanATF_TC_HEAD(set_privilege, tc) {
154256056Sgrehan	atf_tc_set_md_var(tc, "descr", "create a taskpool");
155256056Sgrehan}
156256056SgrehanATF_TC_BODY(set_privilege, tc) {
157256056Sgrehan	isc_result_t result;
158256056Sgrehan	isc_taskpool_t *pool = NULL;
159256056Sgrehan	isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
160256056Sgrehan
161256056Sgrehan	UNUSED(tc);
162256056Sgrehan
163256056Sgrehan	result = isc_test_begin(NULL, ISC_TRUE);
164256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
165256056Sgrehan
166256056Sgrehan	result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
167256056Sgrehan	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
168256056Sgrehan	ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2);
169256056Sgrehan
170256056Sgrehan	isc_taskpool_setprivilege(pool, ISC_TRUE);
171276349Sneel
172256056Sgrehan	isc_taskpool_gettask(pool, &task1);
173256056Sgrehan	isc_taskpool_gettask(pool, &task2);
174256056Sgrehan	isc_taskpool_gettask(pool, &task3);
175256056Sgrehan
176256056Sgrehan	ATF_CHECK(ISCAPI_TASK_VALID(task1));
177256056Sgrehan	ATF_CHECK(ISCAPI_TASK_VALID(task2));
178256056Sgrehan	ATF_CHECK(ISCAPI_TASK_VALID(task3));
179256056Sgrehan
180256056Sgrehan	ATF_CHECK(isc_task_privilege(task1));
181256056Sgrehan	ATF_CHECK(isc_task_privilege(task2));
182256056Sgrehan	ATF_CHECK(isc_task_privilege(task3));
183256056Sgrehan
184256056Sgrehan	isc_taskpool_setprivilege(pool, ISC_FALSE);
185259301Sgrehan
186256056Sgrehan	ATF_CHECK(!isc_task_privilege(task1));
187256056Sgrehan	ATF_CHECK(!isc_task_privilege(task2));
188256056Sgrehan	ATF_CHECK(!isc_task_privilege(task3));
189256056Sgrehan
190256056Sgrehan	isc_task_destroy(&task1);
191256056Sgrehan	isc_task_destroy(&task2);
192256056Sgrehan	isc_task_destroy(&task3);
193256056Sgrehan
194256056Sgrehan	isc_taskpool_destroy(&pool);
195256056Sgrehan	ATF_REQUIRE_EQ(pool, NULL);
196256056Sgrehan
197256056Sgrehan	isc_test_end();
198256056Sgrehan}
199256056Sgrehan
200256056Sgrehan/*
201256056Sgrehan * Main
202256056Sgrehan */
203256056SgrehanATF_TP_ADD_TCS(tp) {
204267393Sjhb	ATF_TP_ADD_TC(tp, create_pool);
205256056Sgrehan	ATF_TP_ADD_TC(tp, expand_pool);
206256056Sgrehan	ATF_TP_ADD_TC(tp, get_tasks);
207256056Sgrehan	ATF_TP_ADD_TC(tp, set_privilege);
208256056Sgrehan
209282846Smav	return (atf_no_error());
210282846Smav}
211256056Sgrehan
212256056Sgrehan