1290001Sglebius/* 2290001Sglebius * Copyright (C) 2011, 2012 Internet Systems Consortium, Inc. ("ISC") 3290001Sglebius * 4290001Sglebius * Permission to use, copy, modify, and/or distribute this software for any 5290001Sglebius * purpose with or without fee is hereby granted, provided that the above 6290001Sglebius * copyright notice and this permission notice appear in all copies. 7290001Sglebius * 8290001Sglebius * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9290001Sglebius * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10290001Sglebius * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11290001Sglebius * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12290001Sglebius * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13290001Sglebius * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14290001Sglebius * PERFORMANCE OF THIS SOFTWARE. 15290001Sglebius */ 16290001Sglebius 17290001Sglebius/* $Id$ */ 18290001Sglebius 19290001Sglebius/*! \file */ 20290001Sglebius 21290001Sglebius#include <config.h> 22290001Sglebius 23290001Sglebius#include <atf-c.h> 24290001Sglebius 25290001Sglebius#include <unistd.h> 26290001Sglebius 27290001Sglebius#include <isc/task.h> 28290001Sglebius#include <isc/taskpool.h> 29290001Sglebius 30290001Sglebius#include "isctest.h" 31290001Sglebius 32290001Sglebius/* 33290001Sglebius * Individual unit tests 34290001Sglebius */ 35290001Sglebius 36290001Sglebius/* Create a taskpool */ 37290001SglebiusATF_TC(create_pool); 38290001SglebiusATF_TC_HEAD(create_pool, tc) { 39290001Sglebius atf_tc_set_md_var(tc, "descr", "create a taskpool"); 40290001Sglebius} 41290001SglebiusATF_TC_BODY(create_pool, tc) { 42290001Sglebius isc_result_t result; 43290001Sglebius isc_taskpool_t *pool = NULL; 44290001Sglebius 45290001Sglebius UNUSED(tc); 46290001Sglebius 47290001Sglebius result = isc_test_begin(NULL, ISC_TRUE); 48290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 49290001Sglebius 50290001Sglebius result = isc_taskpool_create(taskmgr, mctx, 8, 2, &pool); 51290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 52290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool), 8); 53290001Sglebius 54290001Sglebius isc_taskpool_destroy(&pool); 55290001Sglebius ATF_REQUIRE_EQ(pool, NULL); 56290001Sglebius 57290001Sglebius isc_test_end(); 58290001Sglebius} 59290001Sglebius 60290001Sglebius/* Resize a taskpool */ 61290001SglebiusATF_TC(expand_pool); 62290001SglebiusATF_TC_HEAD(expand_pool, tc) { 63290001Sglebius atf_tc_set_md_var(tc, "descr", "expand a taskpool"); 64290001Sglebius} 65290001SglebiusATF_TC_BODY(expand_pool, tc) { 66290001Sglebius isc_result_t result; 67290001Sglebius isc_taskpool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL; 68290001Sglebius 69290001Sglebius UNUSED(tc); 70290001Sglebius 71290001Sglebius result = isc_test_begin(NULL, ISC_TRUE); 72290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 73290001Sglebius 74290001Sglebius result = isc_taskpool_create(taskmgr, mctx, 10, 2, &pool1); 75290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 76290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool1), 10); 77290001Sglebius 78290001Sglebius /* resizing to a smaller size should have no effect */ 79290001Sglebius hold = pool1; 80290001Sglebius result = isc_taskpool_expand(&pool1, 5, &pool2); 81290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 82290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10); 83290001Sglebius ATF_REQUIRE_EQ(pool2, hold); 84290001Sglebius ATF_REQUIRE_EQ(pool1, NULL); 85290001Sglebius pool1 = pool2; 86290001Sglebius pool2 = NULL; 87290001Sglebius 88290001Sglebius /* resizing to the same size should have no effect */ 89290001Sglebius hold = pool1; 90290001Sglebius result = isc_taskpool_expand(&pool1, 10, &pool2); 91290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 92290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 10); 93290001Sglebius ATF_REQUIRE_EQ(pool2, hold); 94290001Sglebius ATF_REQUIRE_EQ(pool1, NULL); 95290001Sglebius pool1 = pool2; 96290001Sglebius pool2 = NULL; 97290001Sglebius 98290001Sglebius /* resizing to larger size should make a new pool */ 99290001Sglebius hold = pool1; 100290001Sglebius result = isc_taskpool_expand(&pool1, 20, &pool2); 101290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 102290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool2), 20); 103290001Sglebius ATF_REQUIRE(pool2 != hold); 104290001Sglebius ATF_REQUIRE_EQ(pool1, NULL); 105290001Sglebius 106290001Sglebius isc_taskpool_destroy(&pool2); 107290001Sglebius ATF_REQUIRE_EQ(pool2, NULL); 108290001Sglebius 109290001Sglebius isc_test_end(); 110290001Sglebius} 111290001Sglebius 112290001Sglebius/* Get tasks */ 113290001SglebiusATF_TC(get_tasks); 114290001SglebiusATF_TC_HEAD(get_tasks, tc) { 115290001Sglebius atf_tc_set_md_var(tc, "descr", "create a taskpool"); 116290001Sglebius} 117290001SglebiusATF_TC_BODY(get_tasks, tc) { 118290001Sglebius isc_result_t result; 119290001Sglebius isc_taskpool_t *pool = NULL; 120290001Sglebius isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL; 121290001Sglebius 122290001Sglebius UNUSED(tc); 123290001Sglebius 124290001Sglebius result = isc_test_begin(NULL, ISC_TRUE); 125290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 126290001Sglebius 127290001Sglebius result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool); 128290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 129290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2); 130290001Sglebius 131290001Sglebius /* two tasks in pool; make sure we can access them more than twice */ 132290001Sglebius isc_taskpool_gettask(pool, &task1); 133290001Sglebius ATF_REQUIRE(ISCAPI_TASK_VALID(task1)); 134290001Sglebius 135290001Sglebius isc_taskpool_gettask(pool, &task2); 136290001Sglebius ATF_REQUIRE(ISCAPI_TASK_VALID(task2)); 137290001Sglebius 138290001Sglebius isc_taskpool_gettask(pool, &task3); 139290001Sglebius ATF_REQUIRE(ISCAPI_TASK_VALID(task3)); 140290001Sglebius 141290001Sglebius isc_task_destroy(&task1); 142290001Sglebius isc_task_destroy(&task2); 143290001Sglebius isc_task_destroy(&task3); 144290001Sglebius 145290001Sglebius isc_taskpool_destroy(&pool); 146290001Sglebius ATF_REQUIRE_EQ(pool, NULL); 147290001Sglebius 148290001Sglebius isc_test_end(); 149290001Sglebius} 150290001Sglebius 151290001Sglebius/* Get tasks */ 152290001SglebiusATF_TC(set_privilege); 153290001SglebiusATF_TC_HEAD(set_privilege, tc) { 154290001Sglebius atf_tc_set_md_var(tc, "descr", "create a taskpool"); 155290001Sglebius} 156290001SglebiusATF_TC_BODY(set_privilege, tc) { 157290001Sglebius isc_result_t result; 158290001Sglebius isc_taskpool_t *pool = NULL; 159290001Sglebius isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL; 160290001Sglebius 161290001Sglebius UNUSED(tc); 162290001Sglebius 163290001Sglebius result = isc_test_begin(NULL, ISC_TRUE); 164290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 165290001Sglebius 166290001Sglebius result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool); 167290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 168290001Sglebius ATF_REQUIRE_EQ(isc_taskpool_size(pool), 2); 169290001Sglebius 170290001Sglebius isc_taskpool_setprivilege(pool, ISC_TRUE); 171290001Sglebius 172290001Sglebius isc_taskpool_gettask(pool, &task1); 173290001Sglebius isc_taskpool_gettask(pool, &task2); 174290001Sglebius isc_taskpool_gettask(pool, &task3); 175290001Sglebius 176290001Sglebius ATF_CHECK(ISCAPI_TASK_VALID(task1)); 177290001Sglebius ATF_CHECK(ISCAPI_TASK_VALID(task2)); 178290001Sglebius ATF_CHECK(ISCAPI_TASK_VALID(task3)); 179290001Sglebius 180290001Sglebius ATF_CHECK(isc_task_privilege(task1)); 181290001Sglebius ATF_CHECK(isc_task_privilege(task2)); 182290001Sglebius ATF_CHECK(isc_task_privilege(task3)); 183290001Sglebius 184290001Sglebius isc_taskpool_setprivilege(pool, ISC_FALSE); 185290001Sglebius 186290001Sglebius ATF_CHECK(!isc_task_privilege(task1)); 187290001Sglebius ATF_CHECK(!isc_task_privilege(task2)); 188290001Sglebius ATF_CHECK(!isc_task_privilege(task3)); 189290001Sglebius 190290001Sglebius isc_task_destroy(&task1); 191290001Sglebius isc_task_destroy(&task2); 192290001Sglebius isc_task_destroy(&task3); 193290001Sglebius 194290001Sglebius isc_taskpool_destroy(&pool); 195290001Sglebius ATF_REQUIRE_EQ(pool, NULL); 196290001Sglebius 197290001Sglebius isc_test_end(); 198290001Sglebius} 199290001Sglebius 200290001Sglebius/* 201290001Sglebius * Main 202290001Sglebius */ 203290001SglebiusATF_TP_ADD_TCS(tp) { 204290001Sglebius ATF_TP_ADD_TC(tp, create_pool); 205290001Sglebius ATF_TP_ADD_TC(tp, expand_pool); 206290001Sglebius ATF_TP_ADD_TC(tp, get_tasks); 207290001Sglebius ATF_TP_ADD_TC(tp, set_privilege); 208290001Sglebius 209290001Sglebius return (atf_no_error()); 210290001Sglebius} 211290001Sglebius 212