1 // test.h -- simplistic test framework for gold unittests -*- C++ -*- 2 3 // Copyright (C) 2006-2014 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant@google.com>. 5 6 // This file is part of gold. 7 8 // This program is free software; you can redistribute it and/or modify 9 // it under the terms of the GNU General Public License as published by 10 // the Free Software Foundation; either version 3 of the License, or 11 // (at your option) any later version. 12 13 // This program is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 18 // You should have received a copy of the GNU General Public License 19 // along with this program; if not, write to the Free Software 20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 // MA 02110-1301, USA. 22 23 #ifndef GOLD_TESTSUITE_TEST_H 24 #define GOLD_TESTSUITE_TEST_H 25 26 namespace gold_testsuite 27 { 28 29 class Test_report; 30 31 // This class handles basic test framework functionality. 32 33 class Test_framework 34 { 35 public: Test_framework()36 Test_framework() 37 : testname_(NULL), current_fail_(0), passes_(0), failures_(0) 38 { } 39 40 // Return number of failures. 41 unsigned int failures()42 failures() const 43 { return this->failures_; } 44 45 // Run a test. 46 void 47 run(const char* name, bool (*pfn)(Test_report*)); 48 49 // Get the current Test_report. This is used by the test support 50 // macros. 51 static Test_report* report()52 report() 53 { return Test_framework::current_report; } 54 55 private: 56 friend class Test_report; 57 58 // Cause the current test to fail. 59 void 60 fail(const char* filename, int lineno); 61 62 // Report an error from the current test. 63 void 64 error(const char* message); 65 66 // Current Test_report. This is a static variable valid while a 67 // test is being run. 68 static Test_report* current_report; 69 70 // Current test being run. 71 const char* testname_; 72 // Whether the current test is failing. 73 bool current_fail_; 74 // Total number of passeed tests. 75 unsigned int passes_; 76 // Total number of failed tests. 77 unsigned int failures_; 78 }; 79 80 // An instance of this class is passed to each test function. 81 82 class Test_report 83 { 84 public: Test_report(Test_framework * tf)85 Test_report(Test_framework* tf) 86 : tf_(tf) 87 { } 88 89 // Mark the test as failing. 90 void fail(const char * filename,int lineno)91 fail(const char* filename, int lineno) 92 { this->tf_->fail(filename, lineno); } 93 94 // Report an error. 95 void error(const char * message)96 error(const char* message) 97 { this->tf_->error(message); } 98 99 private: 100 Test_framework* tf_; 101 }; 102 103 // This class registers a test function so that the testsuite runs it. 104 105 class Register_test 106 { 107 public: 108 Register_test(const char* name, bool (*pfn)(Test_report*)); 109 110 // Run all registered tests. 111 static void 112 run_tests(Test_framework*); 113 114 private: 115 // Linked list of all tests. 116 static Register_test* all_tests; 117 118 // Test name. 119 const char* name_; 120 // Function to call. It should return true if the test passes, 121 // false if it fails. 122 bool (*pfn_)(Test_report*); 123 // Next test in linked list. 124 Register_test* next_; 125 }; 126 127 } // End namespace gold_testsuite. 128 129 // These macros are for convenient use in tests. 130 131 // Check that a condition is true. If it is false, report a failure. 132 133 #define CHECK(cond) \ 134 ((void) \ 135 ((cond) \ 136 ? 0 \ 137 : (::gold_testsuite::Test_framework::report()->fail(__FILE__, \ 138 __LINE__), \ 139 0))) 140 141 // Report an error during a test. 142 143 #define ERROR(msg) (::gold_testsuite::Test_framework::report()->error(msg)) 144 145 #endif // !defined(GOLD_TESTSUITE_TEST_H) 146