blob: 9be692b03313b1b78286506dfa6532e0e936c992 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Salikh Zakirov
*/
#ifndef _TESTFRAME_H_
#define _TESTFRAME_H_
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/** \mainpage Testframe testing framework
*
* \section intro_sec Introduction
*
* Testframe is testing framework developed in C language. It will be used (hopely) for testing DRL VM internals and PVL interfaces.
*
* \section usage_sec Usage
* You need to include files testframe.h and testframe.c in your project.
*
*
*
*/
/**
@defgroup testframe Testframe testing framework
*/
/**
@file testframe.h
Main include for Testframe testing framework
@ingroup testframe
*/
#ifndef NULL
#define NULL 0
#endif
/* status codes */
/**
* Status code to indicate test success
@ingroup testframe
*/
#define TEST_PASSED 0
/**
* Status code to indicate test failure
@ingroup testframe
*/
#define TEST_FAILED 1
/**
* Status code to indicate error
@ingroup testframe
*/
#define TEST_ERROR 2
/**
@defgroup assertions Assertion checks
*/
/* helper functions */
/**
A helper macro to indicate test failure with given message. Source file name and line number will be appended to the message.
@param message - text reason of test failure
@ingroup assertions
*/
#define tf_fail(message) log_error("Test failed: %s (%s:%d)", message, __FILE__, __LINE__); return TEST_FAILED
/**
A helper macro to indicate test success.
@ingroup assertions
*/
#define tf_pass() return TEST_PASSED
/**
A helper macro to check test assertion
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert(expression) if (!(expression)) { log_error("Assertion '%s' failed at %s:%d", #expression, __FILE__, __LINE__); return TEST_FAILED; }
/**
A helper macro to check test assertion (for use in void function)
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_v(expression) if (!(expression)) { log_error("Assertion '%s' failed at %s:%d", #expression, __FILE__, __LINE__); return; }
/**
A helper macro to check test assertion and report message in case of check failure.
Source file name and line nimber will be appended to the message.
@param message - text reason of test failure.
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_message(message, expression) if (!(expression)) { log_error("Assertion '%s' failed, message: %s at %s:%d", #expression, #message, __FILE__, __LINE__); return TEST_FAILED; }
/**
A helper macro to check whether supplied expression is NULL
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_null(expression) tf_assert((expression)==NULL)
/**
A helper macro to check whether supplied expression is NULL and report message in case of check failure.
Source file name and line nimber will be appended to the message.
@param message - text reason of test failure.
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_null_message(message, expression) tf_assert_message(message, (expression)==NULL)
/**
A helper macro to check whether supplied expression is not NULL
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_not_null(expression) tf_assert((expression)!=NULL)
/**
A helper macro to check whether supplied expression is not NULL and report message in case of check failure.
Source file name and line nimber will be appended to the message.
@param message - text reason of test failure.
@param expression - a boolean expression to check, if it results in false then test will be failed.
@ingroup assertions
*/
#define tf_assert_not_null_message(message, expression) tf_assert(message, (expression)!=NULL)
/**
A helper macro to compare values of two expressions
@param expected - expected value
@param actual - actual value
@ingroup assertions
*/
#define tf_assert_same(expected, actual) tf_assert((expected)==(actual))
/**
A helper macro to compare values of two expressions (for use in void function)
@param expected - expected value
@param actual - actual value
@ingroup assertions
*/
#define tf_assert_same_v(expected, actual) tf_assert_v((expected)==(actual))
/**
A helper macro to compare values of two expressions and report message in case of mismatch
Source file name and line nimber will be appended to the message.
@param message - text reason of test failure.
@param expected - expected value
@param actual - actual value
@ingroup assertions
*/
#define tf_assert_same_message(message, expected, actual) tf_assert_message(message, (expected)==(actual))
/* test management macros */
/*
@struct TestDescriptor
Structure describing test, holds test name and pointer to test function
for internal use only
*/
typedef struct {
char *name;
int (*func)(void);
} TestDescriptor;
/**
Helper macro to start test list declarion. This list is necessary for test case execution engine.
@ingroup testframe
*/
#define TEST_LIST_START \
TestDescriptor testDescriptor[] = {
/**
Helper macro to include a test case into test list for execution engine.
@param name of function, which implements test case
@ingroup testframe
*/
#define TEST(name) {#name , name},
/**
Helper macro to end test list declarion. This list is necessary for test case execution engine.
@ingroup testframe
*/
#define TEST_LIST_END {NULL, NULL}};
/* these functions must be implemented by test */
/**
Setup function for test case. Must be implemented by test writer.
@ingroup testframe
*/
extern void setup();
/**
Clean up function for test case. Must be implemented by test writer
@ingroup testframe
*/
extern void teardown();
/* these structure must be implemented by test via TEST_LIST_* macros */
extern TestDescriptor testDescriptor[];
/**
Engin for running test case. Should be included in the main() in form<br>
return default_main(int argc, char *argv[]);<br>
@param argc - number of command line arguments
@param argv - command line arguments (list of names of test cases to run)
@return TEST_PASSED if all test cases passed, TEST_FAIL or TEST_ERROR otherwise
@ingroup testframe
*/
extern int default_main(int argc, char *argv[]);
/**
@defgroup logging Logging functions
*/
/* logging functions */
/**
logs error, arguments are the same as for printf()
prints to standard error
@ingroup logging
*/
extern void log_error(char *format, ...);
/**
logs message, arguments are the same as for printf()
prints to standard output
@ingroup logging
*/
extern void log_info(char *format, ...);
/**
logs message, arguments are the same as for printf()
prints to standard output
@ingroup logging
*/
extern void log_debug(char *format, ...);
/**
Defines error-only log level
@ingroup logging
*/
#define LOG_LEVEL_ERROR 0
/**
Defines error and info only log level
@ingroup logging
*/
#define LOG_LEVEL_INFO 1
/**
Defines debug log level
@ingroup logging
*/
#define LOG_LEVEL_DEBUG 2
/**
Sets logging level
@param level - controls which messages to log <UL><LI>LOG_LEVEL_ERROR - log error only<LI>LOG_LEVEL_INFO - log errors and info<LI>LOG_LEVEL_INFO - logs everything</UL>
@ingroup logging
*/
extern void log_set_level(int level);
/**
logs debug output
TODO - decide how to enable/disable it
*/
#ifdef __cplusplus
}
#endif
#endif