1*c243e490SMarcel Moolenaar /* 2*c243e490SMarcel Moolenaar * Automated Testing Framework (atf) 3*c243e490SMarcel Moolenaar * 4*c243e490SMarcel Moolenaar * Copyright (c) 2008 The NetBSD Foundation, Inc. 5*c243e490SMarcel Moolenaar * All rights reserved. 6*c243e490SMarcel Moolenaar * 7*c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 8*c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions 9*c243e490SMarcel Moolenaar * are met: 10*c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 11*c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 12*c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 13*c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 14*c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 15*c243e490SMarcel Moolenaar * 16*c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17*c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18*c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21*c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23*c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26*c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*c243e490SMarcel Moolenaar * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*c243e490SMarcel Moolenaar */ 29*c243e490SMarcel Moolenaar 30*c243e490SMarcel Moolenaar #include <errno.h> 31*c243e490SMarcel Moolenaar #include <stdint.h> 32*c243e490SMarcel Moolenaar #include <stdio.h> 33*c243e490SMarcel Moolenaar #include <string.h> 34*c243e490SMarcel Moolenaar 35*c243e490SMarcel Moolenaar #include <atf-c.h> 36*c243e490SMarcel Moolenaar 37*c243e490SMarcel Moolenaar #include "atf-c/defs.h" 38*c243e490SMarcel Moolenaar #include "atf-c/error.h" 39*c243e490SMarcel Moolenaar 40*c243e490SMarcel Moolenaar #include "detail/test_helpers.h" 41*c243e490SMarcel Moolenaar 42*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 43*c243e490SMarcel Moolenaar * Auxiliary functions. 44*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 45*c243e490SMarcel Moolenaar 46*c243e490SMarcel Moolenaar static 47*c243e490SMarcel Moolenaar void 48*c243e490SMarcel Moolenaar test_format(const atf_error_t err ATF_DEFS_ATTRIBUTE_UNUSED, 49*c243e490SMarcel Moolenaar char *buf, size_t buflen) 50*c243e490SMarcel Moolenaar { 51*c243e490SMarcel Moolenaar snprintf(buf, buflen, "Test formatting function"); 52*c243e490SMarcel Moolenaar } 53*c243e490SMarcel Moolenaar 54*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 55*c243e490SMarcel Moolenaar * Tests for the "atf_error" type. 56*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 57*c243e490SMarcel Moolenaar 58*c243e490SMarcel Moolenaar ATF_TC(error_new); 59*c243e490SMarcel Moolenaar ATF_TC_HEAD(error_new, tc) 60*c243e490SMarcel Moolenaar { 61*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the construction of an error " 62*c243e490SMarcel Moolenaar "object"); 63*c243e490SMarcel Moolenaar } 64*c243e490SMarcel Moolenaar ATF_TC_BODY(error_new, tc) 65*c243e490SMarcel Moolenaar { 66*c243e490SMarcel Moolenaar atf_error_t err; 67*c243e490SMarcel Moolenaar int data; 68*c243e490SMarcel Moolenaar 69*c243e490SMarcel Moolenaar err = atf_error_new("test_error", NULL, 0, NULL); 70*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "test_error")); 71*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_error_is(err, "unknown_error")); 72*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) == NULL); 73*c243e490SMarcel Moolenaar atf_error_free(err); 74*c243e490SMarcel Moolenaar 75*c243e490SMarcel Moolenaar data = 5; 76*c243e490SMarcel Moolenaar err = atf_error_new("test_data_error", &data, sizeof(data), NULL); 77*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "test_data_error")); 78*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_error_is(err, "unknown_error")); 79*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) != NULL); 80*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(*((const int *)atf_error_data(err)), 5); 81*c243e490SMarcel Moolenaar atf_error_free(err); 82*c243e490SMarcel Moolenaar } 83*c243e490SMarcel Moolenaar 84*c243e490SMarcel Moolenaar ATF_TC(error_new_wo_memory); 85*c243e490SMarcel Moolenaar ATF_TC_HEAD(error_new_wo_memory, tc) 86*c243e490SMarcel Moolenaar { 87*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks that an unavailable memory error " 88*c243e490SMarcel Moolenaar "raised when constructing an error object " 89*c243e490SMarcel Moolenaar "is properly converted to the no_memory " 90*c243e490SMarcel Moolenaar "static error type"); 91*c243e490SMarcel Moolenaar } 92*c243e490SMarcel Moolenaar ATF_TC_BODY(error_new_wo_memory, tc) 93*c243e490SMarcel Moolenaar { 94*c243e490SMarcel Moolenaar atf_error_t err; 95*c243e490SMarcel Moolenaar void *invalid; 96*c243e490SMarcel Moolenaar 97*c243e490SMarcel Moolenaar invalid = (void *)1; 98*c243e490SMarcel Moolenaar 99*c243e490SMarcel Moolenaar err = atf_error_new("test_error", invalid, SIZE_MAX, NULL); 100*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "no_memory")); 101*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) == NULL); 102*c243e490SMarcel Moolenaar atf_error_free(err); 103*c243e490SMarcel Moolenaar } 104*c243e490SMarcel Moolenaar 105*c243e490SMarcel Moolenaar ATF_TC(no_error); 106*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_error, tc) 107*c243e490SMarcel Moolenaar { 108*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks that constructing a non-error " 109*c243e490SMarcel Moolenaar "object works"); 110*c243e490SMarcel Moolenaar } 111*c243e490SMarcel Moolenaar ATF_TC_BODY(no_error, tc) 112*c243e490SMarcel Moolenaar { 113*c243e490SMarcel Moolenaar atf_error_t err; 114*c243e490SMarcel Moolenaar 115*c243e490SMarcel Moolenaar err = atf_no_error(); 116*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_is_error(err)); 117*c243e490SMarcel Moolenaar } 118*c243e490SMarcel Moolenaar 119*c243e490SMarcel Moolenaar ATF_TC(is_error); 120*c243e490SMarcel Moolenaar ATF_TC_HEAD(is_error, tc) 121*c243e490SMarcel Moolenaar { 122*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the is_error method to determine " 123*c243e490SMarcel Moolenaar "if an error object holds success or an error"); 124*c243e490SMarcel Moolenaar } 125*c243e490SMarcel Moolenaar ATF_TC_BODY(is_error, tc) 126*c243e490SMarcel Moolenaar { 127*c243e490SMarcel Moolenaar atf_error_t err; 128*c243e490SMarcel Moolenaar 129*c243e490SMarcel Moolenaar err = atf_no_error(); 130*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_is_error(err)); 131*c243e490SMarcel Moolenaar 132*c243e490SMarcel Moolenaar err = atf_error_new("test_error", NULL, 0, NULL); 133*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_is_error(err)); 134*c243e490SMarcel Moolenaar atf_error_free(err); 135*c243e490SMarcel Moolenaar } 136*c243e490SMarcel Moolenaar 137*c243e490SMarcel Moolenaar ATF_TC(format); 138*c243e490SMarcel Moolenaar ATF_TC_HEAD(format, tc) 139*c243e490SMarcel Moolenaar { 140*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the default formatting function " 141*c243e490SMarcel Moolenaar "and the ability to change it"); 142*c243e490SMarcel Moolenaar } 143*c243e490SMarcel Moolenaar ATF_TC_BODY(format, tc) 144*c243e490SMarcel Moolenaar { 145*c243e490SMarcel Moolenaar atf_error_t err; 146*c243e490SMarcel Moolenaar char buf[1024]; 147*c243e490SMarcel Moolenaar 148*c243e490SMarcel Moolenaar printf("Testing default formatting function\n"); 149*c243e490SMarcel Moolenaar err = atf_error_new("test_error", NULL, 0, NULL); 150*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 151*c243e490SMarcel Moolenaar printf("Error string is: %s\n", buf); 152*c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(buf, "Error 'test_error'") == 0); 153*c243e490SMarcel Moolenaar atf_error_free(err); 154*c243e490SMarcel Moolenaar 155*c243e490SMarcel Moolenaar printf("Testing custom formatting function\n"); 156*c243e490SMarcel Moolenaar err = atf_error_new("test_error", NULL, 0, test_format); 157*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 158*c243e490SMarcel Moolenaar printf("Error string is: %s\n", buf); 159*c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(buf, "Test formatting function") == 0); 160*c243e490SMarcel Moolenaar atf_error_free(err); 161*c243e490SMarcel Moolenaar } 162*c243e490SMarcel Moolenaar 163*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 164*c243e490SMarcel Moolenaar * Tests for the "libc" error. 165*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 166*c243e490SMarcel Moolenaar 167*c243e490SMarcel Moolenaar ATF_TC(libc_new); 168*c243e490SMarcel Moolenaar ATF_TC_HEAD(libc_new, tc) 169*c243e490SMarcel Moolenaar { 170*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the construction of libc errors"); 171*c243e490SMarcel Moolenaar } 172*c243e490SMarcel Moolenaar ATF_TC_BODY(libc_new, tc) 173*c243e490SMarcel Moolenaar { 174*c243e490SMarcel Moolenaar atf_error_t err; 175*c243e490SMarcel Moolenaar 176*c243e490SMarcel Moolenaar err = atf_libc_error(ENOMEM, "Test message 1"); 177*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "libc")); 178*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOMEM); 179*c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 1") == 0); 180*c243e490SMarcel Moolenaar atf_error_free(err); 181*c243e490SMarcel Moolenaar 182*c243e490SMarcel Moolenaar err = atf_libc_error(EPERM, "%s message %d", "Test", 2); 183*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "libc")); 184*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_libc_error_code(err), EPERM); 185*c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 2") == 0); 186*c243e490SMarcel Moolenaar atf_error_free(err); 187*c243e490SMarcel Moolenaar } 188*c243e490SMarcel Moolenaar 189*c243e490SMarcel Moolenaar ATF_TC(libc_format); 190*c243e490SMarcel Moolenaar ATF_TC_HEAD(libc_format, tc) 191*c243e490SMarcel Moolenaar { 192*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the formatting of libc errors"); 193*c243e490SMarcel Moolenaar } 194*c243e490SMarcel Moolenaar ATF_TC_BODY(libc_format, tc) 195*c243e490SMarcel Moolenaar { 196*c243e490SMarcel Moolenaar atf_error_t err; 197*c243e490SMarcel Moolenaar char buf[1024]; 198*c243e490SMarcel Moolenaar 199*c243e490SMarcel Moolenaar err = atf_libc_error(ENOMEM, "Test message 1"); 200*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 201*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, strerror(ENOMEM)) != NULL); 202*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, "Test message 1") != NULL); 203*c243e490SMarcel Moolenaar atf_error_free(err); 204*c243e490SMarcel Moolenaar 205*c243e490SMarcel Moolenaar err = atf_libc_error(EPERM, "Test message 2"); 206*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 207*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL); 208*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, "Test message 2") != NULL); 209*c243e490SMarcel Moolenaar atf_error_free(err); 210*c243e490SMarcel Moolenaar 211*c243e490SMarcel Moolenaar err = atf_libc_error(EPERM, "%s message %d", "Test", 3); 212*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 213*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL); 214*c243e490SMarcel Moolenaar ATF_REQUIRE(strstr(buf, "Test message 3") != NULL); 215*c243e490SMarcel Moolenaar atf_error_free(err); 216*c243e490SMarcel Moolenaar } 217*c243e490SMarcel Moolenaar 218*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 219*c243e490SMarcel Moolenaar * Tests for the "no_memory" error. 220*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 221*c243e490SMarcel Moolenaar 222*c243e490SMarcel Moolenaar ATF_TC(no_memory_new); 223*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_new, tc) 224*c243e490SMarcel Moolenaar { 225*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory " 226*c243e490SMarcel Moolenaar "errors"); 227*c243e490SMarcel Moolenaar } 228*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_new, tc) 229*c243e490SMarcel Moolenaar { 230*c243e490SMarcel Moolenaar atf_error_t err; 231*c243e490SMarcel Moolenaar 232*c243e490SMarcel Moolenaar err = atf_no_memory_error(); 233*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "no_memory")); 234*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) == NULL); 235*c243e490SMarcel Moolenaar atf_error_free(err); 236*c243e490SMarcel Moolenaar } 237*c243e490SMarcel Moolenaar 238*c243e490SMarcel Moolenaar ATF_TC(no_memory_format); 239*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_format, tc) 240*c243e490SMarcel Moolenaar { 241*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the formatting of no_memory " 242*c243e490SMarcel Moolenaar "errors"); 243*c243e490SMarcel Moolenaar } 244*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_format, tc) 245*c243e490SMarcel Moolenaar { 246*c243e490SMarcel Moolenaar atf_error_t err; 247*c243e490SMarcel Moolenaar char buf[1024]; 248*c243e490SMarcel Moolenaar 249*c243e490SMarcel Moolenaar err = atf_no_memory_error(); 250*c243e490SMarcel Moolenaar atf_error_format(err, buf, sizeof(buf)); 251*c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(buf, "Not enough memory") == 0); 252*c243e490SMarcel Moolenaar atf_error_free(err); 253*c243e490SMarcel Moolenaar } 254*c243e490SMarcel Moolenaar 255*c243e490SMarcel Moolenaar ATF_TC(no_memory_twice); 256*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_twice, tc) 257*c243e490SMarcel Moolenaar { 258*c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory " 259*c243e490SMarcel Moolenaar "errors multiple times, as this error is initialized " 260*c243e490SMarcel Moolenaar "statically"); 261*c243e490SMarcel Moolenaar } 262*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_twice, tc) 263*c243e490SMarcel Moolenaar { 264*c243e490SMarcel Moolenaar { 265*c243e490SMarcel Moolenaar atf_error_t err = atf_no_memory_error(); 266*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "no_memory")); 267*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) == NULL); 268*c243e490SMarcel Moolenaar atf_error_free(err); 269*c243e490SMarcel Moolenaar } 270*c243e490SMarcel Moolenaar 271*c243e490SMarcel Moolenaar { 272*c243e490SMarcel Moolenaar atf_error_t err = atf_no_memory_error(); 273*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "no_memory")); 274*c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_data(err) == NULL); 275*c243e490SMarcel Moolenaar atf_error_free(err); 276*c243e490SMarcel Moolenaar } 277*c243e490SMarcel Moolenaar } 278*c243e490SMarcel Moolenaar 279*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 280*c243e490SMarcel Moolenaar * Tests cases for the header file. 281*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 282*c243e490SMarcel Moolenaar 283*c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c/error.h"); 284*c243e490SMarcel Moolenaar HEADER_TC(include_fwd, "atf-c/error_fwd.h"); 285*c243e490SMarcel Moolenaar 286*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 287*c243e490SMarcel Moolenaar * Main. 288*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 289*c243e490SMarcel Moolenaar 290*c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp) 291*c243e490SMarcel Moolenaar { 292*c243e490SMarcel Moolenaar /* Add the tests for the "atf_error" type. */ 293*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, error_new); 294*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, error_new_wo_memory); 295*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, no_error); 296*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, is_error); 297*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, format); 298*c243e490SMarcel Moolenaar 299*c243e490SMarcel Moolenaar /* Add the tests for the "libc" error. */ 300*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, libc_new); 301*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, libc_format); 302*c243e490SMarcel Moolenaar 303*c243e490SMarcel Moolenaar /* Add the tests for the "no_memory" error. */ 304*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, no_memory_new); 305*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, no_memory_format); 306*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, no_memory_twice); 307*c243e490SMarcel Moolenaar 308*c243e490SMarcel Moolenaar /* Add the test cases for the header file. */ 309*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, include); 310*c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, include_fwd); 311*c243e490SMarcel Moolenaar 312*c243e490SMarcel Moolenaar return atf_no_error(); 313*c243e490SMarcel Moolenaar } 314