You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
13 KiB
312 lines
13 KiB
/* /////////////////////////////////////////////////////////////////////////
|
|
* File: test/unit/test.unit.be.N/test.unit.be.N.c
|
|
*
|
|
* Purpose: Implementation file for the test.unit.be.N project.
|
|
*
|
|
* Created: 29th January 2008
|
|
* Updated: 22nd March 2010
|
|
*
|
|
* Status: Wizard-generated
|
|
*
|
|
* License: (Licensed under the Synesis Software Open License)
|
|
*
|
|
* Copyright (c) 2008-2010, Synesis Software Pty Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* www: http://www.synesis.com.au/software
|
|
*
|
|
* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
|
|
#include <pantheios/backends/be.N.h>
|
|
#include <pantheios/init_codes.h>
|
|
|
|
#include <xtests/xtests.h>
|
|
|
|
#include <stlsoft/stlsoft.h> /* for STLSOFT_NUM_ELEMENTS */
|
|
|
|
#include <stdio.h> /* for fprintf() */
|
|
#include <stdlib.h> /* for EXIT_SUCCESS, EXIT_FAILURE */
|
|
|
|
const PAN_CHAR_T PANTHEIOS_FE_PROCESS_IDENTITY[] = PANTHEIOS_LITERAL_STRING("test.unit.be.N");
|
|
|
|
|
|
#define DECLARE_BACK_END_IMPL_N(n) \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_N_test_ ## n ## _init( \
|
|
PAN_CHAR_T const* processIdentity \
|
|
, int backEndId \
|
|
, void const* init \
|
|
, void* reserved \
|
|
, void** ptoken \
|
|
); \
|
|
PANTHEIOS_CALL(void) pantheios_be_N_test_ ## n ## _uninit(void* token); \
|
|
PANTHEIOS_CALL(int) pantheios_be_N_test_ ## n ## _logEntry( \
|
|
void* beToken \
|
|
, void* feToken \
|
|
, int severity \
|
|
, PAN_CHAR_T const* entry \
|
|
, size_t cchEntry \
|
|
); \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_N_test_ ## n ## _init( \
|
|
PAN_CHAR_T const* processIdentity \
|
|
, int backEndId \
|
|
, void const* init \
|
|
, void* reserved \
|
|
, void** ptoken \
|
|
) \
|
|
{ \
|
|
STLSOFT_SUPPRESS_UNUSED(processIdentity); \
|
|
STLSOFT_SUPPRESS_UNUSED(backEndId); \
|
|
STLSOFT_SUPPRESS_UNUSED(init); \
|
|
STLSOFT_SUPPRESS_UNUSED(reserved); \
|
|
STLSOFT_SUPPRESS_UNUSED(ptoken); \
|
|
\
|
|
if(s_retVals[n] >= 0) \
|
|
{ \
|
|
++s_initCounts[n]; \
|
|
} \
|
|
\
|
|
return s_retVals[n]; \
|
|
} \
|
|
\
|
|
PANTHEIOS_CALL(void) pantheios_be_N_test_ ## n ## _uninit(void* token) \
|
|
{ \
|
|
STLSOFT_SUPPRESS_UNUSED(token); \
|
|
\
|
|
--s_initCounts[n]; \
|
|
} \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_N_test_ ## n ## _logEntry( \
|
|
void* beToken \
|
|
, void* feToken \
|
|
, int severity \
|
|
, PAN_CHAR_T const* entry \
|
|
, size_t cchEntry \
|
|
) \
|
|
{ \
|
|
STLSOFT_SUPPRESS_UNUSED(beToken); \
|
|
STLSOFT_SUPPRESS_UNUSED(feToken); \
|
|
STLSOFT_SUPPRESS_UNUSED(severity); \
|
|
STLSOFT_SUPPRESS_UNUSED(entry); \
|
|
STLSOFT_SUPPRESS_UNUSED(cchEntry); \
|
|
\
|
|
return 0; \
|
|
}
|
|
|
|
#define NUM_BACKENDS (5)
|
|
|
|
static int s_retVals[1 + NUM_BACKENDS]; /* 0th element is not used. */
|
|
static int s_initCounts[1 + NUM_BACKENDS]; /* 0th element is not used. */
|
|
static int s_flags[1 + NUM_BACKENDS] =
|
|
{
|
|
-1, /* 0th element is not used. */
|
|
0,
|
|
PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE,
|
|
0,
|
|
0,
|
|
PANTHEIOS_BE_N_F_INIT_ONLY_IF_PREVIOUS_FAILED
|
|
};
|
|
|
|
DECLARE_BACK_END_IMPL_N(1)
|
|
DECLARE_BACK_END_IMPL_N(2)
|
|
DECLARE_BACK_END_IMPL_N(3)
|
|
DECLARE_BACK_END_IMPL_N(4)
|
|
DECLARE_BACK_END_IMPL_N(5)
|
|
|
|
pan_be_N_t PAN_BE_N_BACKEND_LIST[] =
|
|
{
|
|
/* NOTE: The flags in this one are ignored, as they're set up every time
|
|
* by the reset_state_() function (below) and the test setup code.
|
|
*/
|
|
|
|
PANTHEIOS_BE_N_STDFORM_ENTRY(1, pantheios_be_N_test_1, 0),
|
|
PANTHEIOS_BE_N_STDFORM_ENTRY(2, pantheios_be_N_test_2, 0),
|
|
PANTHEIOS_BE_N_STDFORM_ENTRY(3, pantheios_be_N_test_3, 0),
|
|
PANTHEIOS_BE_N_STDFORM_ENTRY(4, pantheios_be_N_test_4, 0),
|
|
PANTHEIOS_BE_N_STDFORM_ENTRY(5, pantheios_be_N_test_5, 0),
|
|
PANTHEIOS_BE_N_TERMINATOR_ENTRY
|
|
};
|
|
|
|
|
|
static void reset_state_(void)
|
|
{
|
|
int i;
|
|
for(i = 0; i != NUM_BACKENDS; ++i)
|
|
{
|
|
PAN_BE_N_BACKEND_LIST[i].flags = s_flags[1 + i]; /* Replace the desired flags */
|
|
s_retVals[i] = 0; /* Mark to pass */
|
|
s_initCounts[0] = 0; /* Reset init ref count */
|
|
}
|
|
}
|
|
|
|
/* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
int retCode = EXIT_SUCCESS;
|
|
int verbosity = 2;
|
|
|
|
XTESTS_COMMANDLINE_PARSEVERBOSITY(argc, argv, &verbosity);
|
|
|
|
|
|
STLSOFT_STATIC_ASSERT(NUM_BACKENDS + 1 == STLSOFT_NUM_ELEMENTS(s_retVals));
|
|
STLSOFT_STATIC_ASSERT(NUM_BACKENDS + 1 == STLSOFT_NUM_ELEMENTS(s_initCounts));
|
|
STLSOFT_STATIC_ASSERT(NUM_BACKENDS + 1 == STLSOFT_NUM_ELEMENTS(s_flags));
|
|
|
|
|
|
if(XTESTS_START_RUNNER("test.unit.be.N", verbosity))
|
|
{
|
|
/* Test-1 */
|
|
if(XTESTS_CASE_BEGIN("Test-1", "Verify that all five succeed"))
|
|
{
|
|
void* token;
|
|
int res;
|
|
|
|
reset_state_();
|
|
|
|
res = pantheios_be_init(PANTHEIOS_FE_PROCESS_IDENTITY, NULL, &token);
|
|
|
|
XTESTS_TEST_INTEGER_EQUAL(PANTHEIOS_INIT_RC_SUCCESS, res);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[1]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[2]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[3]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[4]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[5]);
|
|
|
|
pantheios_be_uninit(token);
|
|
|
|
XTESTS_CASE_END("Test-1");
|
|
}
|
|
|
|
|
|
/* Test-2 */
|
|
if(XTESTS_CASE_BEGIN("Test-2", "Verify that #1 failure causes all to fail"))
|
|
{
|
|
void* token;
|
|
int res;
|
|
|
|
reset_state_();
|
|
|
|
s_retVals[1] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
|
|
res = pantheios_be_init(PANTHEIOS_FE_PROCESS_IDENTITY, NULL, &token);
|
|
|
|
XTESTS_TEST_INTEGER_EQUAL(PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE, res);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[1]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[2]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[3]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[4]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[5]);
|
|
|
|
/* pantheios_be_uninit(token); */
|
|
|
|
XTESTS_CASE_END("Test-2");
|
|
}
|
|
|
|
|
|
/* Test-3 */
|
|
if(XTESTS_CASE_BEGIN("Test-3", "Verify that #2 failure is benign"))
|
|
{
|
|
void* token;
|
|
int res;
|
|
|
|
reset_state_();
|
|
|
|
s_retVals[2] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
|
|
res = pantheios_be_init(PANTHEIOS_FE_PROCESS_IDENTITY, NULL, &token);
|
|
|
|
XTESTS_TEST_INTEGER_EQUAL(PANTHEIOS_INIT_RC_SUCCESS, res);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[1]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[2]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[3]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[4]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[5]);
|
|
|
|
pantheios_be_uninit(token);
|
|
|
|
XTESTS_CASE_END("Test-3");
|
|
}
|
|
|
|
|
|
/* Test-4 */
|
|
if(XTESTS_CASE_BEGIN("Test-4", "Verify that failure of 4 out of five, where all ignore init-failure, does not cause failure"))
|
|
{
|
|
void* token;
|
|
int res;
|
|
|
|
reset_state_();
|
|
|
|
PAN_BE_N_BACKEND_LIST[0].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[1].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[2].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[3].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[4].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
|
|
s_retVals[1] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[2] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[3] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[4] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[5] = 0;
|
|
|
|
res = pantheios_be_init(PANTHEIOS_FE_PROCESS_IDENTITY, NULL, &token);
|
|
|
|
XTESTS_TEST_INTEGER_EQUAL(PANTHEIOS_INIT_RC_SUCCESS, res);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[1]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[2]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[3]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[4]);
|
|
XTESTS_TEST_INTEGER_EQUAL(1, s_initCounts[5]);
|
|
|
|
pantheios_be_uninit(token);
|
|
|
|
XTESTS_CASE_END("Test-4");
|
|
}
|
|
|
|
|
|
/* Test-5 */
|
|
if(XTESTS_CASE_BEGIN("Test-5", "Verify that failure of 5 out of five, where all ignore init-failure, does cause failure"))
|
|
{
|
|
void* token;
|
|
int res;
|
|
|
|
reset_state_();
|
|
|
|
PAN_BE_N_BACKEND_LIST[0].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[1].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[2].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[3].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
PAN_BE_N_BACKEND_LIST[4].flags = PANTHEIOS_BE_N_F_IGNORE_INIT_FAILURE;
|
|
|
|
s_retVals[1] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[2] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[3] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[4] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
s_retVals[5] = PANTHEIOS_FE_INIT_RC_INTENDED_FAILURE;
|
|
|
|
res = pantheios_be_init(PANTHEIOS_FE_PROCESS_IDENTITY, NULL, &token);
|
|
|
|
XTESTS_TEST_INTEGER_EQUAL(PANTHEIOS_BE_INIT_RC_ALL_BACKEND_INITS_FAILED, res);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[1]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[2]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[3]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[4]);
|
|
XTESTS_TEST_INTEGER_EQUAL(0, s_initCounts[5]);
|
|
|
|
/* pantheios_be_uninit(token); */
|
|
|
|
XTESTS_CASE_END("Test-5");
|
|
}
|
|
|
|
|
|
XTESTS_PRINT_RESULTS();
|
|
|
|
XTESTS_END_RUNNER_UPDATE_EXITCODE(&retCode);
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/* ///////////////////////////// end of file //////////////////////////// */
|