📄 testrun.c
字号:
/*
* CUnit - A Unit testing framework library for C.
* Copyright (C) 2001 Anil Kumar
* Copyright (C) 2004,2005,2006 Anil Kumar, Jerry St.Clair
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Implementation of Console Test Interface.
*
* Aug 2001 Initial implementaion (AK)
*
* 19/Aug/2001 Added initial registry/Suite/test framework implementation. (AK)
*
* 24/Aug/2001 Changed Data structure from SLL to DLL for all linked lists. (AK)
*
* 25/Nov/2001 Added notification for Suite Initialization failure condition. (AK)
*
* 5-Aug-2004 New interface, doxygen comments, moved add_failure on suite
* initialization so called even if a callback is not registered,
* moved CU_assertImplementation into TestRun.c, consolidated
* all run summary info out of CU_TestRegistry into TestRun.c,
* revised counting and reporting of run stats to cleanly
* differentiate suite, test, and assertion failures. (JDS)
*
* 1-Sep-2004 Modified CU_assertImplementation() and run_single_test() for
* setjmp/longjmp mechanism of aborting test runs, add asserts in
* CU_assertImplementation() to trap use outside a registered
* test function during an active test run. (JDS)
*
* 22-Sep-2004 Initial implementation of internal unit tests, added nFailureRecords
* to CU_Run_Summary, added CU_get_n_failure_records(), removed
* requirement for registry to be initialized in order to run
* CU_run_suite() and CU_run_test(). (JDS)
*
* 30-Apr-2005 Added callback for suite cleanup function failure,
* updated unit tests. (JDS)
*/
/** @file
* Test run management functions (implementation).
*/
/** @addtogroup Framework
@{
*/
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <setjmp.h>
#include "CUnit.h"
#include "MyMem.h"
#include "TestDB.h"
#include "TestRun.h"
static CU_BOOL f_bTestIsRunning = CU_FALSE; /**< Flag for whether a test run is in progress */
static CU_pSuite f_pCurSuite = NULL; /**< Pointer to the suite currently being run. */
static CU_pTest f_pCurTest = NULL; /**< Pointer to the test currently being run. */
/** CU_RunSummary to hold results of each test run. */
static CU_RunSummary f_run_summary = {0, 0, 0, 0, 0, 0, 0};
/** CU_pFailureRecord to hold head of failure record list of each test run. */
static CU_pFailureRecord f_failure_list = NULL;
/** CU_pFailureRecord to hold head of failure record list of each test run. */
static CU_pFailureRecord f_last_failure = NULL;
/* Forward declarations of static functions. */
static void clear_previous_results(CU_pRunSummary pRunSummary, CU_pFailureRecord* ppFailure);
static void cleanup_failure_list(CU_pFailureRecord* ppFailure);
static CU_ErrorCode run_single_suite(CU_pSuite pSuite, CU_pRunSummary pRunSummary);
static CU_ErrorCode run_single_test(CU_pTest pTest, CU_pRunSummary pRunSummary);
static void add_failure(CU_pFailureRecord* ppFailure,
CU_pRunSummary pRunSummary,
unsigned int uiLineNumber,
char szCondition[],
char szFileName[],
CU_pSuite pSuite,
CU_pTest pTest);
/** Pointer to the function to be called before running a test. */
static CU_TestStartMessageHandler f_pTestStartMessageHandler = NULL;
/** Pointer to the function to be called after running a test. */
static CU_TestCompleteMessageHandler f_pTestCompleteMessageHandler = NULL;
/** Pointer to the function to be called when all tests have been run. */
static CU_AllTestsCompleteMessageHandler f_pAllTestsCompleteMessageHandler = NULL;
/** Pointer to the function to be called if a suite initialization function returns an error. */
static CU_SuiteInitFailureMessageHandler f_pSuiteInitFailureMessageHandler = NULL;
/** Pointer to the function to be called if a suite cleanup function returns an error. */
static CU_SuiteCleanupFailureMessageHandler f_pSuiteCleanupFailureMessageHandler = NULL;
/*------------------------------------------------------------------------*/
/** Assertion implementation function.
* All CUnit assertions reduce to a call to this function.
* It should only be called during an active test run (checked
* by assertion). This means that CUnit assertions should only
* be used in registered test functions during a test run.
* @param bValue Value of the assertion (CU_TRUE or CU_FALSE).
* @param uiLine Line number of failed test statement.
* @param strCondition String containing logical test that failed.
* @param strFile Source file where test statement failed.
* @param strFunction Function where test statement failed.
* @param bFatal CU_TRUE to abort test (via longjmp()), CU_FALSE to continue test.
* @return As a convenience, returns the value of the assertion.
*/
CU_BOOL CU_assertImplementation(CU_BOOL bValue,
unsigned int uiLine,
char strCondition[],
char strFile[],
char strFunction[],
CU_BOOL bFatal)
{
/* not used in current implementation - stop compiler warning */
CU_UNREFERENCED_PARAMETER(strFunction);
/* these should always be non-NULL (i.e. a test run is in progress) */
assert(NULL != f_pCurSuite);
assert(NULL != f_pCurTest);
++f_run_summary.nAsserts;
if (CU_FALSE == bValue) {
++f_run_summary.nAssertsFailed;
add_failure(&f_failure_list, &f_run_summary,
uiLine, strCondition, strFile, f_pCurSuite, f_pCurTest);
if ((CU_TRUE == bFatal) && (NULL != f_pCurTest->pJumpBuf)) {
longjmp(*(f_pCurTest->pJumpBuf), 1);
}
}
return bValue;
}
/*
* Get/Set functions for Message Handlers.
*/
/*------------------------------------------------------------------------*/
/** Set the message handler to call before each test is run. */
void CU_set_test_start_handler(CU_TestStartMessageHandler pTestStartHandler)
{
f_pTestStartMessageHandler = pTestStartHandler;
}
/*------------------------------------------------------------------------*/
/** Set the message handler to call after each test is run. */
void CU_set_test_complete_handler(CU_TestCompleteMessageHandler pTestCompleteHandler)
{
f_pTestCompleteMessageHandler = pTestCompleteHandler;
}
/*------------------------------------------------------------------------*/
/** Set the message handler to call after all tests have been run. */
void CU_set_all_test_complete_handler(CU_AllTestsCompleteMessageHandler pAllTestsCompleteHandler)
{
f_pAllTestsCompleteMessageHandler = pAllTestsCompleteHandler;
}
/*------------------------------------------------------------------------*/
/** Set the message handler to call when a suite
* initialization function returns an error.
*/
void CU_set_suite_init_failure_handler(CU_SuiteInitFailureMessageHandler pSuiteInitFailureHandler)
{
f_pSuiteInitFailureMessageHandler = pSuiteInitFailureHandler;
}
/*------------------------------------------------------------------------*/
/** Set the message handler to call when a suite
* cleanup function returns an error.
*/
void CU_set_suite_cleanup_failure_handler(CU_SuiteCleanupFailureMessageHandler pSuiteCleanupFailureHandler)
{
f_pSuiteCleanupFailureMessageHandler = pSuiteCleanupFailureHandler;
}
/*------------------------------------------------------------------------*/
/** Retrieve the message handler called before each test is run. */
CU_TestStartMessageHandler CU_get_test_start_handler(void)
{
return f_pTestStartMessageHandler;
}
/*------------------------------------------------------------------------*/
/** Retrieve the message handler called after each test is run. */
CU_TestCompleteMessageHandler CU_get_test_complete_handler(void)
{
return f_pTestCompleteMessageHandler;
}
/*------------------------------------------------------------------------*/
/** Retrieve the message handler called after all tests are run. */
CU_AllTestsCompleteMessageHandler CU_get_all_test_complete_handler(void)
{
return f_pAllTestsCompleteMessageHandler;
}
/*------------------------------------------------------------------------*/
/** Retrieve the message handler called when a suite
* initialization error occurs.
*/
CU_SuiteInitFailureMessageHandler CU_get_suite_init_failure_handler(void)
{
return f_pSuiteInitFailureMessageHandler;
}
/*------------------------------------------------------------------------*/
/** Retrieve the message handler called when a suite
* cleanup error occurs.
*/
CU_SuiteCleanupFailureMessageHandler CU_get_suite_cleanup_failure_handler(void)
{
return f_pSuiteCleanupFailureMessageHandler;
}
/*
* Functions to get the Run statistics for the Test Run.
*/
/*------------------------------------------------------------------------*/
/** Retrieve the number of suites completed during the previous run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_tests_run()
*/
unsigned int CU_get_number_of_suites_run(void)
{
return f_run_summary.nSuitesRun;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of suites which failed to initialize
* during the previous run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_tests_run()
*/
unsigned int CU_get_number_of_suites_failed(void)
{
return f_run_summary.nSuitesFailed;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of tests completed during the previous run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_suites_run()
*/
unsigned int CU_get_number_of_tests_run(void)
{
return f_run_summary.nTestsRun;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of tests which contained failed
* assertions during the previous run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_suites_run()
*/
unsigned int CU_get_number_of_tests_failed(void)
{
return f_run_summary.nTestsFailed;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of assertions processed during the last run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_successes()
* @see CU_get_number_of_failures()
*/
unsigned int CU_get_number_of_asserts(void)
{
return f_run_summary.nAsserts;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of successful assertions during the last run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_failures()
*/
unsigned int CU_get_number_of_successes(void)
{
return (f_run_summary.nAsserts - f_run_summary.nAssertsFailed);
}
/*------------------------------------------------------------------------*/
/** Retrieve the number of failed assertions during the last run.
* The count is reset each time the client initiates a run.
* @see CU_get_number_of_successes()
*/
unsigned int CU_get_number_of_failures(void)
{
return f_run_summary.nAssertsFailed;
}
/*------------------------------------------------------------------------*/
/** Retrieve the number failure records created during
* the previous run. Note that this may be more than the
* number of failed assertions, since failure records may also
* be created for failed suite initialization and cleanup.
* The count is reset each time the client initiates a run.
*/
unsigned int CU_get_number_of_failure_records(void)
{
return f_run_summary.nFailureRecords;
}
/*------------------------------------------------------------------------*/
/** Retrieve the list of failures which occurred during
* the last test run. Note that the pointer returned
* is invalidated when the client initiates a run using
* CU_run_all_tests(), CU_run_suite(), or CU_run_test().
* @see CU_get_number_of_successes()
*/
CU_pFailureRecord CU_get_failure_list(void)
{
return f_failure_list;
}
/*------------------------------------------------------------------------*/
/** Retrieve the entire run summary for the last test run.
* Note that the pFailure pointer in the run summary is
* invalidated when the client initiates a run using
* CU_run_all_tests(), CU_run_suite(), or CU_run_test().
* @see CU_get_number_of_successes()
*/
CU_pRunSummary CU_get_run_summary(void)
{
return &f_run_summary;
}
/*
* Functions for running suites and tests.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -