This file provides implementation of 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.
Scope of the Test
Some scenarios tested:
- no exception situation
- basic TRY/CATCH
- multiple exception handlers
- default handlers
This file is pjlib-test/exception.c
#include "test.h"
#if INCLUDE_EXCEPTION_TEST
#include <pjlib.h>
#ifdef _MSC_VER
#pragma warning(disable:4702)
#endif
#define ID_1 1
#define ID_2 2
static int throw_id_1(void)
{
PJ_UNREACHED(return -1;)
}
static int throw_id_2(void)
{
PJ_UNREACHED(return -1;)
}
static int try_catch_test(void)
{
int rc = -200;
}
rc = 0;
}
return rc;
}
static int throw_in_handler(void)
{
int rc = 0;
}
rc = -300;
else
}
return rc;
}
static int return_in_handler(void)
{
}
return 0;
}
return -400;
}
static int test(void)
{
int rc = 0;
}
rc = -3;
}
if (rc != 0)
return rc;
rc = throw_id_1();
rc = -10;
}
if (id != ID_1) {
PJ_LOG(3,(
"",
"...error: got unexpected exception %d (%s)",
if (!rc) rc = -20;
}
}
if (rc != 0)
return rc;
rc = throw_id_2();
rc = -25;
}
case ID_1:
if (!rc) rc = -30;
break;
case ID_2:
if (!rc) rc = 0;
break;
default:
if (!rc) rc = -40;
break;
}
}
if (rc != 0)
return rc;
rc = throw_id_1();
rc = -50;
}
case ID_1:
if (!rc) rc = 0;
break;
default:
if (!rc) rc = -60;
break;
}
}
if (rc != 0)
return rc;
rc = try_catch_test();
}
rc = -70;
}
if (rc != 0)
return rc;
rc = -80;
int rc2;
rc2 = throw_in_handler();
if (rc2)
rc = rc2;
}
rc = 0;
} else {
rc = -90;
}
}
if (rc != 0)
return rc;
int rc2;
rc2 = return_in_handler();
if (rc2)
rc = rc2;
}
rc = -100;
}
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
int dummy_exception_test;
#endif
#define PJ_CATCH_ANY
Definition: except.h:388
#define PJ_TRY
Definition: except.h:373
#define PJ_THROW(exception_id)
Definition: except.h:402
#define PJ_GET_EXCEPTION()
Definition: except.h:409
#define PJ_END
Definition: except.h:394
#define PJ_USE_EXCEPTION
Definition: except.h:367
const char * pj_exception_id_name(pj_exception_id_t id)
#define PJ_LOG(level, arg)
Definition: log.h:106
#define PJ_UNUSED_ARG(arg)
Definition: config.h:1343