t-exc.c revision 90792
1492SN/A/*
21345Sihse * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
3492SN/A *	All rights reserved.
4492SN/A *
5492SN/A * By using this file, you agree to the terms and conditions set
6492SN/A * forth in the LICENSE file which can be found at the top level of
7492SN/A * the sendmail distribution.
8492SN/A */
9492SN/A
10492SN/A#include <sm/gen.h>
11492SN/ASM_IDSTR(id, "@(#)$Id: t-exc.c,v 1.20 2001/09/11 04:04:49 gshapiro Exp $")
12492SN/A
13492SN/A#include <string.h>
14492SN/A#include <sm/heap.h>
15492SN/A#include <sm/io.h>
16492SN/A#include <sm/test.h>
17492SN/A
18492SN/Aconst SM_EXC_TYPE_T EtypeTest1 =
19492SN/A{
20492SN/A	SmExcTypeMagic,
21492SN/A	"E:test1",
22492SN/A	"i",
23492SN/A	sm_etype_printf,
24492SN/A	"test1 exception argv[0]=%0",
25492SN/A};
261120Schegar
271120Schegarconst SM_EXC_TYPE_T EtypeTest2 =
281120Schegar{
291410Sihse	SmExcTypeMagic,
301120Schegar	"E:test2",
311120Schegar	"i",
321120Schegar	sm_etype_printf,
33492SN/A	"test2 exception argv[0]=%0",
341410Sihse};
351410Sihse
361410Sihseint
371410Sihsemain(argc, argv)
38492SN/A	int argc;
39492SN/A	char **argv;
40492SN/A{
411410Sihse	void *p;
421120Schegar	int volatile x;
43837SN/A	char *unknown, *cant;
44910Sihse
451131Serikj	sm_test_begin(argc, argv, "test exception handling");
46492SN/A
471120Schegar	/*
481236Sihse	**  SM_TRY
491120Schegar	*/
501120Schegar
511120Schegar	cant = "can't happen";
52968Sihse	x = 0;
53968Sihse	SM_TRY
54492SN/A		x = 1;
551120Schegar	SM_END_TRY
561120Schegar	SM_TEST(x == 1);
571120Schegar
581120Schegar	/*
591120Schegar	**  SM_FINALLY-0
601120Schegar	*/
611120Schegar
621120Schegar	x = 0;
631120Schegar	SM_TRY
641120Schegar		x = 1;
651120Schegar	SM_FINALLY
661120Schegar		x = 2;
671120Schegar	SM_END_TRY
681120Schegar	SM_TEST(x == 2);
691223Schegar
701223Schegar	/*
711223Schegar	**  SM_FINALLY-1
721120Schegar	*/
731120Schegar
741120Schegar	x = 0;
751120Schegar	SM_TRY
761120Schegar		SM_TRY
771120Schegar			x = 1;
781600Snaoto			sm_exc_raisenew_x(&EtypeTest1, 17);
791600Snaoto		SM_FINALLY
801600Snaoto			x = 2;
811223Schegar			sm_exc_raisenew_x(&EtypeTest2, 42);
821120Schegar		SM_END_TRY
831120Schegar	SM_EXCEPT(exc, "E:test2")
841659Serikj		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
851600Snaoto			 "got exception test2: can't happen\n");
861120Schegar	SM_EXCEPT(exc, "E:test1")
871120Schegar		SM_TEST(x == 2 && exc->exc_argv[0].v_int == 17);
881120Schegar		if (!(x == 2 && exc->exc_argv[0].v_int == 17))
891120Schegar		{
901120Schegar			(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
911120Schegar				"can't happen: x=%d argv[0]=%d\n",
92492SN/A				x, exc->exc_argv[0].v_int);
931120Schegar		}
941120Schegar	SM_EXCEPT(exc, "*")
951120Schegar	{
961735Sbobv		unknown = "unknown exception: ";
971735Sbobv		SM_TEST(strcmp(unknown, cant) == 0);
981735Sbobv	}
991735Sbobv	SM_END_TRY
100492SN/A
1011120Schegar	x = 3;
1021120Schegar	SM_TRY
1031223Schegar		x = 4;
1041223Schegar		sm_exc_raisenew_x(&EtypeTest1, 94);
1051223Schegar	SM_FINALLY
1061223Schegar		x = 5;
1071223Schegar		sm_exc_raisenew_x(&EtypeTest2, 95);
1081223Schegar	SM_EXCEPT(exc, "E:test2")
109492SN/A	{
1101223Schegar		unknown = "got exception test2: ";
1111223Schegar		SM_TEST(strcmp(unknown, cant) == 0);
1121223Schegar	}
1131695Stwisti	SM_EXCEPT(exc, "E:test1")
114557SN/A		SM_TEST(x == 5 && exc->exc_argv[0].v_int == 94);
1151120Schegar		if (!(x == 5 && exc->exc_argv[0].v_int == 94))
1161120Schegar		{
1171120Schegar			(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
1181120Schegar				"can't happen: x=%d argv[0]=%d\n",
1191223Schegar				x, exc->exc_argv[0].v_int);
1201223Schegar		}
1211223Schegar	SM_EXCEPT(exc, "*")
1221223Schegar	{
1231223Schegar		unknown = "unknown exception: ";
1241223Schegar		SM_TEST(strcmp(unknown, cant) == 0);
1251120Schegar	}
1261120Schegar	SM_END_TRY
1271120Schegar
1281120Schegar	SM_TRY
1291120Schegar		sm_exc_raisenew_x(&SmEtypeErr, "test %d", 0);
1301223Schegar	SM_EXCEPT(exc, "*")
1311223Schegar#if DEBUG
1321223Schegar		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
1331223Schegar			"test 0 got an exception, as expected:\n");
1341223Schegar		sm_exc_print(exc, smioout);
1351695Stwisti#endif /* DEBUG */
1361695Stwisti		return sm_test_end();
1371120Schegar	SM_END_TRY
1381120Schegar
139607SN/A	p = sm_malloc_x((size_t)(-1));
1401120Schegar	(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
1411120Schegar		"sm_malloc_x unexpectedly succeeded, returning %p\n", p);
1421120Schegar	unknown = "sm_malloc_x unexpectedly succeeded";
1431120Schegar	SM_TEST(strcmp(unknown, cant) == 0);
144492SN/A	return sm_test_end();
1451120Schegar}
1461120Schegar