Line data Source code
1 :
2 : /* Copyright (c) 2005-2014, Stefan Eilemann <eile@equalizergraphics.com>
3 : *
4 : * Redistribution and use in source and binary forms, with or without
5 : * modification, are permitted provided that the following conditions are met:
6 : *
7 : * - Redistributions of source code must retain the above copyright notice, this
8 : * list of conditions and the following disclaimer.
9 : * - Redistributions in binary form must reproduce the above copyright notice,
10 : * this list of conditions and the following disclaimer in the documentation
11 : * and/or other materials provided with the distribution.
12 : * - Neither the name of Eyescale Software GmbH nor the names of its
13 : * contributors may be used to endorse or promote products derived from this
14 : * software without specific prior written permission.
15 : *
16 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 : * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 : * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 : * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 : * POSSIBILITY OF SUCH DAMAGE.
27 : */
28 :
29 : #ifndef LBTEST_TEST_H
30 : #define LBTEST_TEST_H
31 :
32 : #include <lunchbox/log.h>
33 : #include <lunchbox/sleep.h>
34 : #include <lunchbox/thread.h>
35 :
36 : #include <cstdlib>
37 : #include <fstream>
38 : #include <stdexcept>
39 :
40 : #define OUTPUT lunchbox::Log::instance( __FILE__, __LINE__ )
41 :
42 : #define TEST( x ) \
43 : { \
44 : LBVERB << "Test " << #x << std::endl; \
45 : if( !(x) ) \
46 : { \
47 : OUTPUT << #x << " failed (l." << __LINE__ << ')' << std::endl; \
48 : lunchbox::abort(); \
49 : ::exit( EXIT_FAILURE ); \
50 : } \
51 : }
52 :
53 : #define TESTINFO( x, info ) \
54 : { \
55 : LBVERB << "Test " << #x << ": " << info << std::endl; \
56 : if( !(x) ) \
57 : { \
58 : OUTPUT << #x << " failed (l." << __LINE__ << "): " << info \
59 : << std::endl; \
60 : lunchbox::abort(); \
61 : ::exit( EXIT_FAILURE ); \
62 : } \
63 : }
64 :
65 : #define TESTRESULT( x, type ) \
66 : { \
67 : LBVERB << "Test " << #x << std::endl; \
68 : const type& testRes = (x); \
69 : if( !testRes ) \
70 : { \
71 : OUTPUT << #x << " failed with " << testRes << " (l." \
72 : << __LINE__ << ")" << std::endl; \
73 : lunchbox::abort(); \
74 : ::exit( EXIT_FAILURE ); \
75 : } \
76 : }
77 :
78 : int testMain( int argc, char **argv );
79 :
80 : namespace
81 : {
82 21 : class Watchdog : public lunchbox::Thread
83 : {
84 : public:
85 21 : explicit Watchdog( const std::string& name ) : _name( name ) {}
86 :
87 19 : virtual void run()
88 : {
89 19 : lunchbox::Thread::setName( "Watchdog" );
90 : #ifdef TEST_RUNTIME
91 3 : lunchbox::sleep( TEST_RUNTIME * 1000 );
92 : std::cerr << "Watchdog triggered - " << _name
93 0 : << " did not terminate within " << TEST_RUNTIME << "s"
94 0 : << std::endl;
95 : #else
96 16 : lunchbox::sleep( 60000 );
97 : std::cerr << "Watchdog triggered - " << _name
98 0 : << " did not terminate within 1 minute" << std::endl;
99 : #endif
100 0 : lunchbox::abort( true /*dumpThreads*/ );
101 0 : }
102 :
103 : private:
104 : const std::string _name;
105 : };
106 : }
107 :
108 21 : int main( int argc, char **argv )
109 : {
110 : #ifndef TEST_NO_WATCHDOG
111 42 : Watchdog watchdog( argv[0] );
112 21 : watchdog.start();
113 : #endif
114 :
115 : try
116 : {
117 21 : const int result = testMain( argc, argv );
118 21 : if( result != EXIT_SUCCESS )
119 0 : return result;
120 : }
121 0 : catch( const std::runtime_error& e )
122 : {
123 0 : LBINFO << "Test exception: " << e.what() << std::endl;
124 0 : return EXIT_FAILURE;
125 : }
126 :
127 : #ifndef TEST_NO_WATCHDOG
128 21 : watchdog.cancel();
129 21 : lunchbox::sleep( 10 ); // give watchdog time to terminate
130 : #endif
131 21 : return EXIT_SUCCESS;
132 : }
133 :
134 : # define main testMain
135 :
136 : #endif // LBTEST_TEST_H
|