190792Sgshapiro/* 2261363Sgshapiro * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers. 390792Sgshapiro * All rights reserved. 490792Sgshapiro * 590792Sgshapiro * By using this file, you agree to the terms and conditions set 690792Sgshapiro * forth in the LICENSE file which can be found at the top level of 790792Sgshapiro * the sendmail distribution. 890792Sgshapiro */ 990792Sgshapiro 1090792Sgshapiro#include <sm/gen.h> 11266692SgshapiroSM_IDSTR(id, "@(#)$Id: t-exc.c,v 1.21 2013-11-22 20:51:43 ca Exp $") 1290792Sgshapiro 1390792Sgshapiro#include <string.h> 1490792Sgshapiro#include <sm/heap.h> 1590792Sgshapiro#include <sm/io.h> 1690792Sgshapiro#include <sm/test.h> 1790792Sgshapiro 1890792Sgshapiroconst SM_EXC_TYPE_T EtypeTest1 = 1990792Sgshapiro{ 2090792Sgshapiro SmExcTypeMagic, 2190792Sgshapiro "E:test1", 2290792Sgshapiro "i", 2390792Sgshapiro sm_etype_printf, 2490792Sgshapiro "test1 exception argv[0]=%0", 2590792Sgshapiro}; 2690792Sgshapiro 2790792Sgshapiroconst SM_EXC_TYPE_T EtypeTest2 = 2890792Sgshapiro{ 2990792Sgshapiro SmExcTypeMagic, 3090792Sgshapiro "E:test2", 3190792Sgshapiro "i", 3290792Sgshapiro sm_etype_printf, 3390792Sgshapiro "test2 exception argv[0]=%0", 3490792Sgshapiro}; 3590792Sgshapiro 3690792Sgshapiroint 3790792Sgshapiromain(argc, argv) 3890792Sgshapiro int argc; 3990792Sgshapiro char **argv; 4090792Sgshapiro{ 4190792Sgshapiro void *p; 4290792Sgshapiro int volatile x; 4390792Sgshapiro char *unknown, *cant; 4490792Sgshapiro 4590792Sgshapiro sm_test_begin(argc, argv, "test exception handling"); 4690792Sgshapiro 4790792Sgshapiro /* 4890792Sgshapiro ** SM_TRY 4990792Sgshapiro */ 5090792Sgshapiro 5190792Sgshapiro cant = "can't happen"; 5290792Sgshapiro x = 0; 5390792Sgshapiro SM_TRY 5490792Sgshapiro x = 1; 5590792Sgshapiro SM_END_TRY 5690792Sgshapiro SM_TEST(x == 1); 5790792Sgshapiro 5890792Sgshapiro /* 5990792Sgshapiro ** SM_FINALLY-0 6090792Sgshapiro */ 6190792Sgshapiro 6290792Sgshapiro x = 0; 6390792Sgshapiro SM_TRY 6490792Sgshapiro x = 1; 6590792Sgshapiro SM_FINALLY 6690792Sgshapiro x = 2; 6790792Sgshapiro SM_END_TRY 6890792Sgshapiro SM_TEST(x == 2); 6990792Sgshapiro 7090792Sgshapiro /* 7190792Sgshapiro ** SM_FINALLY-1 7290792Sgshapiro */ 7390792Sgshapiro 7490792Sgshapiro x = 0; 7590792Sgshapiro SM_TRY 7690792Sgshapiro SM_TRY 7790792Sgshapiro x = 1; 7890792Sgshapiro sm_exc_raisenew_x(&EtypeTest1, 17); 7990792Sgshapiro SM_FINALLY 8090792Sgshapiro x = 2; 8190792Sgshapiro sm_exc_raisenew_x(&EtypeTest2, 42); 8290792Sgshapiro SM_END_TRY 8390792Sgshapiro SM_EXCEPT(exc, "E:test2") 8490792Sgshapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 8590792Sgshapiro "got exception test2: can't happen\n"); 8690792Sgshapiro SM_EXCEPT(exc, "E:test1") 8790792Sgshapiro SM_TEST(x == 2 && exc->exc_argv[0].v_int == 17); 8890792Sgshapiro if (!(x == 2 && exc->exc_argv[0].v_int == 17)) 8990792Sgshapiro { 9090792Sgshapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 9190792Sgshapiro "can't happen: x=%d argv[0]=%d\n", 9290792Sgshapiro x, exc->exc_argv[0].v_int); 9390792Sgshapiro } 9490792Sgshapiro SM_EXCEPT(exc, "*") 9590792Sgshapiro { 9690792Sgshapiro unknown = "unknown exception: "; 9790792Sgshapiro SM_TEST(strcmp(unknown, cant) == 0); 9890792Sgshapiro } 9990792Sgshapiro SM_END_TRY 10090792Sgshapiro 10190792Sgshapiro x = 3; 10290792Sgshapiro SM_TRY 10390792Sgshapiro x = 4; 10490792Sgshapiro sm_exc_raisenew_x(&EtypeTest1, 94); 10590792Sgshapiro SM_FINALLY 10690792Sgshapiro x = 5; 10790792Sgshapiro sm_exc_raisenew_x(&EtypeTest2, 95); 10890792Sgshapiro SM_EXCEPT(exc, "E:test2") 10990792Sgshapiro { 11090792Sgshapiro unknown = "got exception test2: "; 11190792Sgshapiro SM_TEST(strcmp(unknown, cant) == 0); 11290792Sgshapiro } 11390792Sgshapiro SM_EXCEPT(exc, "E:test1") 11490792Sgshapiro SM_TEST(x == 5 && exc->exc_argv[0].v_int == 94); 11590792Sgshapiro if (!(x == 5 && exc->exc_argv[0].v_int == 94)) 11690792Sgshapiro { 11790792Sgshapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 11890792Sgshapiro "can't happen: x=%d argv[0]=%d\n", 11990792Sgshapiro x, exc->exc_argv[0].v_int); 12090792Sgshapiro } 12190792Sgshapiro SM_EXCEPT(exc, "*") 12290792Sgshapiro { 12390792Sgshapiro unknown = "unknown exception: "; 12490792Sgshapiro SM_TEST(strcmp(unknown, cant) == 0); 12590792Sgshapiro } 12690792Sgshapiro SM_END_TRY 12790792Sgshapiro 12890792Sgshapiro SM_TRY 12990792Sgshapiro sm_exc_raisenew_x(&SmEtypeErr, "test %d", 0); 13090792Sgshapiro SM_EXCEPT(exc, "*") 13190792Sgshapiro#if DEBUG 13290792Sgshapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 13390792Sgshapiro "test 0 got an exception, as expected:\n"); 13490792Sgshapiro sm_exc_print(exc, smioout); 13590792Sgshapiro#endif /* DEBUG */ 13690792Sgshapiro return sm_test_end(); 13790792Sgshapiro SM_END_TRY 13890792Sgshapiro 13990792Sgshapiro p = sm_malloc_x((size_t)(-1)); 14090792Sgshapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 14190792Sgshapiro "sm_malloc_x unexpectedly succeeded, returning %p\n", p); 14290792Sgshapiro unknown = "sm_malloc_x unexpectedly succeeded"; 14390792Sgshapiro SM_TEST(strcmp(unknown, cant) == 0); 14490792Sgshapiro return sm_test_end(); 14590792Sgshapiro} 146