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