blob: b09ba11c031171a6c1c928780eb19c8e261a5d39 [file] [log] [blame]
/* $Id$ */
/*
* Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#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 {
int id = PJ_GET_EXCEPTION();
PJ_LOG(3,("", "...error: got unexpected exception %d (%s)",
id, pj_exception_id_name(id)));
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) {
PJ_LOG(3,("", "...failed at i=%d (rc=%d)", i, rc));
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 */