1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: 2 * 3 * Data Differential YATL (i.e. libtest) library 4 * 5 * Copyright (C) 2012 Data Differential, http://datadifferential.com/ 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are 9 * met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * * Redistributions in binary form must reproduce the above 15 * copyright notice, this list of conditions and the following disclaimer 16 * in the documentation and/or other materials provided with the 17 * distribution. 18 * 19 * * The names of its contributors may not be used to endorse or 20 * promote products derived from this software without specific prior 21 * written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 * 35 */ 36 37 #pragma once 38 39 #include <libtest/signal.h> 40 41 /** 42 Framework is the structure which is passed to the test implementation to be filled. 43 This must be implemented in order for the test framework to load the tests. We call 44 get_world() in order to fill this structure. 45 */ 46 47 #include <vector> 48 49 namespace { class Collection; } 50 typedef std::vector<libtest::Collection*> Suites; 51 52 namespace libtest { 53 54 class Framework { 55 public: 56 57 public: 58 test_return_t create(); 59 name()60 const std::string& name() const 61 { 62 return _name; 63 } 64 create(test_callback_create_fn * arg)65 void create(test_callback_create_fn* arg) 66 { 67 _create= arg; 68 } 69 destroy(test_callback_destroy_fn * arg)70 void destroy(test_callback_destroy_fn* arg) 71 { 72 _destroy= arg; 73 } 74 75 void collections(collection_st arg[]); 76 set_on_error(test_callback_error_fn * arg)77 void set_on_error(test_callback_error_fn *arg) 78 { 79 _on_error= arg; 80 } 81 82 test_return_t on_error(const enum test_return_t, void *); 83 set_socket()84 void set_socket() 85 { 86 _servers.set_socket(); 87 } 88 set_sasl(const std::string & username_arg,const std::string & password_arg)89 void set_sasl(const std::string& username_arg, const std::string& password_arg) 90 { 91 _servers.set_sasl(username_arg, password_arg); 92 } 93 servers()94 libtest::server_startup_st& servers() 95 { 96 return _servers; 97 } 98 set_runner(libtest::Runner * arg)99 void set_runner(libtest::Runner *arg) 100 { 101 _runner= arg; 102 } 103 104 libtest::Runner *runner(); 105 106 void exec(); 107 108 libtest::Collection& collection(); 109 110 virtual ~Framework(); 111 112 Framework(libtest::SignalThread&, 113 const std::string&, 114 const std::string&, 115 const std::string&); 116 117 bool match(const char* arg); 118 creators_ptr()119 void *creators_ptr() 120 { 121 return _creators_ptr; 122 } 123 signal()124 libtest::SignalThread& signal() 125 { 126 return _signal; 127 } 128 129 uint32_t sum_total(); 130 uint32_t sum_success(); 131 uint32_t sum_skipped(); 132 uint32_t sum_failed(); 133 size()134 size_t size() 135 { 136 return _collection.size(); 137 } 138 total()139 uint32_t total() const 140 { 141 return _total; 142 } 143 success()144 uint32_t success() const 145 { 146 return _success; 147 } 148 skipped()149 uint32_t skipped() const 150 { 151 return _skipped; 152 } 153 failed()154 uint32_t failed() const 155 { 156 return _failed; 157 } 158 suites()159 Suites& suites() 160 { 161 return _collection; 162 } 163 164 private: 165 uint32_t _total; 166 uint32_t _success; 167 uint32_t _skipped; 168 uint32_t _failed; 169 170 /* These methods are called outside of any collection call. */ 171 test_callback_create_fn *_create; 172 test_callback_destroy_fn *_destroy; 173 174 /** 175 If an error occurs during the test, this is called. 176 */ 177 test_callback_error_fn *_on_error; 178 179 /** 180 Runner represents the callers for the tests. If not implemented we will use 181 a set of default implementations. 182 */ 183 libtest::Runner *_runner; 184 185 libtest::server_startup_st _servers; 186 bool _socket; 187 void *_creators_ptr; 188 unsigned long int _servers_to_run; 189 Suites _collection; 190 libtest::SignalThread& _signal; 191 std::string _only_run; 192 std::string _wildcard; 193 std::string _name; 194 195 private: 196 Framework( const Framework& ); 197 const Framework& operator=( const Framework& ); 198 }; 199 200 } // namespace libtest 201