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