Multi Process Testing framework
Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
parent
0269774a60
commit
17f9c361ea
30 changed files with 2934 additions and 1 deletions
186
src/mpt/tests/self/usage.c
Normal file
186
src/mpt/tests/self/usage.c
Normal file
|
@ -0,0 +1,186 @@
|
|||
#include <stdio.h>
|
||||
#include "mpt/mpt.h"
|
||||
#include "mpt/resource.h" /* MPT_SOURCE_ROOT_DIR */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* First, we need a process entry-point that can be used in tests.
|
||||
*****************************************************************************/
|
||||
/* | name | arguments | */
|
||||
MPT_ProcessEntry(proc_noargs, MPT_NoArgs())
|
||||
{
|
||||
// Do stuff
|
||||
|
||||
// The test processes will use asserts to indicate success/failures.
|
||||
MPT_ASSERT(1, "The problem is: %s", "existential crisis");
|
||||
|
||||
// No need to return anything, that's handled by the assert calls.
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* A process entry-point can have arguments.
|
||||
*****************************************************************************/
|
||||
/* | name | arguments | */
|
||||
MPT_ProcessEntry(proc_args, MPT_Args(int domain, const char* text))
|
||||
{
|
||||
int expected = 1;
|
||||
MPT_ASSERT(expected == domain, "proc_args(%d, %s)", domain, text);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Process entry-points can communicate to be able to sync fi.
|
||||
*****************************************************************************/
|
||||
MPT_ProcessEntry(proc_recv, MPT_NoArgs())
|
||||
{
|
||||
/* This will wait until another process sends the same string. */
|
||||
MPT_Wait("some state reached");
|
||||
}
|
||||
MPT_ProcessEntry(proc_send, MPT_NoArgs())
|
||||
{
|
||||
/* If this fails, an internal MPT_ASSERT will be triggered.
|
||||
* The same is true for MPT_Wait(). */
|
||||
MPT_Send("some state reached");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testA
|
||||
******************************************************************************
|
||||
* A simple test that starts two processes. Because a test can use the same
|
||||
* process entry-point to start multiple processes, each process has to have
|
||||
* its own unique id within the test.
|
||||
*/
|
||||
/* | process identification | entry-point | arguments | */
|
||||
MPT_TestProcess(suitename, testA, id1, proc_noargs, MPT_NoArgValues());
|
||||
MPT_TestProcess(suitename, testA, id2, proc_noargs, MPT_NoArgValues());
|
||||
MPT_Test(suitename, testA);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testB
|
||||
******************************************************************************
|
||||
* Of course, different processes can be started as well.
|
||||
* Argument values are provided per test process.
|
||||
*/
|
||||
MPT_TestProcess(suitename, testB, id1, proc_noargs, MPT_NoArgValues( ));
|
||||
MPT_TestProcess(suitename, testB, id2, proc_args, MPT_ArgValues(1, "2"));
|
||||
MPT_TestProcess(suitename, testB, id3, proc_args, MPT_ArgValues(1, "3"));
|
||||
MPT_Test(suitename, testB);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testC
|
||||
******************************************************************************
|
||||
* The processes can have different or equal 'system environments'.
|
||||
*/
|
||||
mpt_env_t environment_C1[] = {
|
||||
{ "CYCLONEDDS_URI", "file://config1.xml" },
|
||||
{ "PERMISSIONS", "file://permissions.p7s" },
|
||||
{ "GOVERNANCE", "file://governance.p7s" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
mpt_env_t environment_C2[] = {
|
||||
{ "CYCLONEDDS_URI", "file://config2.xml" },
|
||||
{ "PERMISSIONS", "file://permissions.p7s" },
|
||||
{ "GOVERNANCE", "file://governance.p7s" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
MPT_TestProcess(suitename, testC, id1, proc_noargs, MPT_NoArgValues(), .environment=environment_C1);
|
||||
MPT_TestProcess(suitename, testC, id2, proc_noargs, MPT_NoArgValues(), .environment=environment_C1);
|
||||
MPT_TestProcess(suitename, testC, id3, proc_noargs, MPT_NoArgValues(), .environment=environment_C2);
|
||||
MPT_Test(suitename, testC);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testD
|
||||
******************************************************************************
|
||||
* The two environments in the previous example are partly the same.
|
||||
* It's possible set the environment on test level. The environment variables
|
||||
* related to the test are set before the ones related to a process. This
|
||||
* means that a process can overrule variables.
|
||||
*
|
||||
* The following test is the same as the previous one.
|
||||
*/
|
||||
mpt_env_t environment_D1[] = {
|
||||
{ "CYCLONEDDS_URI", "file://config1.xml" },
|
||||
{ "PERMISSIONS", "file://permissions.p7s" },
|
||||
{ "GOVERNANCE", "file://governance.p7s" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
mpt_env_t environment_D2[] = {
|
||||
{ "CYCLONEDDS_URI", "file://config2.xml" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
MPT_TestProcess(suitename, testD, id1, proc_noargs, MPT_NoArgValues());
|
||||
MPT_TestProcess(suitename, testD, id2, proc_noargs, MPT_NoArgValues());
|
||||
MPT_TestProcess(suitename, testD, id3, proc_noargs, MPT_NoArgValues(), .environment=environment_D2);
|
||||
MPT_Test(suitename, testD, .environment=environment_D1);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testE
|
||||
******************************************************************************
|
||||
* Environment variables will be expanded.
|
||||
* Also, the MPT_SOURCE_ROOT_DIR define contains a string to that particular
|
||||
* directory.
|
||||
* This can be combined to easily point to files.
|
||||
*/
|
||||
mpt_env_t environment_E[] = {
|
||||
{ "ETC_DIR", MPT_SOURCE_ROOT_DIR"/tests/self/etc" },
|
||||
{ "CYCLONEDDS_URI", "file://${ETC_DIR}/config.xml" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
MPT_TestProcess(suitename, testE, id, proc_noargs, MPT_NoArgValues(), .environment=environment_E);
|
||||
MPT_Test(suitename, testE);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testF
|
||||
******************************************************************************
|
||||
* The processes and tests can use init/fini fixtures.
|
||||
* The test init is executed before the process init.
|
||||
* The process fini is executed before the test fini.
|
||||
*/
|
||||
void proc_setup(void) { /* do stuff */ }
|
||||
void proc_teardown(void) { /* do stuff */ }
|
||||
void test_setup(void) { /* do stuff */ }
|
||||
void test_teardown(void) { /* do stuff */ }
|
||||
MPT_TestProcess(suitename, testF, id1, proc_noargs, MPT_NoArgValues(), .init=proc_setup);
|
||||
MPT_TestProcess(suitename, testF, id2, proc_noargs, MPT_NoArgValues(), .fini=proc_teardown);
|
||||
MPT_TestProcess(suitename, testF, id3, proc_noargs, MPT_NoArgValues(), .init=proc_setup, .fini=proc_teardown);
|
||||
MPT_Test(suitename, testF, .init=test_setup, .fini=test_teardown);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testG
|
||||
******************************************************************************
|
||||
* The timeout and disable options are handled by test fixtures.
|
||||
*/
|
||||
MPT_TestProcess(suitename, testG, id1, proc_noargs, MPT_NoArgValues());
|
||||
MPT_TestProcess(suitename, testG, id2, proc_noargs, MPT_NoArgValues());
|
||||
MPT_Test(suitename, testG, .timeout=10, .disabled=true);
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Test: suitename_testH
|
||||
******************************************************************************
|
||||
* See the process entries to notice the MPT Send/Wait IPC.
|
||||
*/
|
||||
MPT_TestProcess(suitename, testH, id1, proc_recv, MPT_NoArgValues());
|
||||
MPT_TestProcess(suitename, testH, id2, proc_send, MPT_NoArgValues());
|
||||
MPT_Test(suitename, testH);
|
Loading…
Add table
Add a link
Reference in a new issue