blob: 034330b6af650d46d77e3af419c248813589f6ae [file] [log] [blame]
/* $Id$
*
*/
#include "test.h"
/**
* \page page_pjlib_exception_test Test: Exception Handling
*
* This file provides implementation of \b exception_test(). It tests the
* functionality of the exception handling API.
*
* @note This test use static ID not acquired through proper registration.
* This is not recommended, since it may create ID collissions.
*
* \section exception_test_sec Scope of the Test
*
* Some scenarios tested:
* - no exception situation
* - basic TRY/CATCH
* - multiple exception handlers
* - default handlers
*
*
* This file is <b>pjlib-test/exception.c</b>
*
* \include pjlib-test/exception.c
*/
#if INCLUDE_EXCEPTION_TEST
#include <pjlib.h>
#define ID_1 1
#define ID_2 2
static int throw_id_1(void)
{
PJ_THROW( ID_1 );
return -1;
}
static int throw_id_2(void)
{
PJ_THROW( ID_2 );
return -1;
}
static int test(void)
{
PJ_USE_EXCEPTION;
int rc = 0;
/*
* No exception situation.
*/
PJ_TRY {
rc = rc;
}
PJ_CATCH( ID_1 ) {
rc = -2;
}
PJ_DEFAULT {
rc = -3;
}
PJ_END;
if (rc != 0)
return rc;
/*
* Basic TRY/CATCH
*/
PJ_TRY {
rc = throw_id_1();
// should not reach here.
rc = -10;
}
PJ_CATCH( ID_1 ) {
if (!rc) rc = 0;
}
PJ_DEFAULT {
if (!rc) rc = -20;
}
PJ_END;
if (rc != 0)
return rc;
/*
* Multiple exceptions handlers
*/
PJ_TRY {
rc = throw_id_2();
// should not reach here.
rc = -25;
}
PJ_CATCH( ID_1 ) {
if (!rc) rc = -30;
}
PJ_CATCH( ID_2 ) {
if (!rc) rc = 0;
}
PJ_DEFAULT {
if (!rc) rc = -40;
}
PJ_END;
if (rc != 0)
return rc;
/*
* Test default handler.
*/
PJ_TRY {
rc = throw_id_1();
// should not reach here
rc = -50;
}
PJ_CATCH( ID_2 ) {
if (!rc) rc = -60;
}
PJ_DEFAULT {
if (!rc) rc = 0;
}
PJ_END;
if (rc != 0)
return rc;
return 0;
}
int exception_test(void)
{
int i, rc;
enum { LOOP = 10 };
for (i=0; i<LOOP; ++i) {
if ((rc=test()) != 0)
return rc;
}
return 0;
}
#else
/* To prevent warning about "translation unit is empty"
* when this test is disabled.
*/
int dummy_exception_test;
#endif /* INCLUDE_EXCEPTION_TEST */