diff options
author | Brian Aker <brian@tangent.org> | 2013-04-20 21:17:49 -0400 |
---|---|---|
committer | Brian Aker <brian@tangent.org> | 2013-04-20 21:17:49 -0400 |
commit | 321fb333c1f00bec9c70a8f58187eb6a500a7f62 (patch) | |
tree | 3aebcdce919e503f2c588047e7bec218101b1975 /libtest | |
parent | 19f4ac3359a324785d2c7f094d378cd4afa1b76e (diff) | |
download | libmemcached-321fb333c1f00bec9c70a8f58187eb6a500a7f62.tar.gz |
Clean up exception classes.
Diffstat (limited to 'libtest')
-rw-r--r-- | libtest/cmdline.cc | 1 | ||||
-rw-r--r-- | libtest/exception.cc | 108 | ||||
-rw-r--r-- | libtest/exception.hpp (renamed from libtest/failed.h) | 65 | ||||
-rw-r--r-- | libtest/exception/disconnected.hpp (renamed from libtest/fatal.hpp) | 30 | ||||
-rw-r--r-- | libtest/exception/fatal.cc (renamed from libtest/fatal.cc) | 28 | ||||
-rw-r--r-- | libtest/exception/fatal.hpp (renamed from libtest/result/fatal.hpp) | 31 | ||||
-rw-r--r-- | libtest/has.cc | 2 | ||||
-rw-r--r-- | libtest/include.am | 9 | ||||
-rw-r--r-- | libtest/result.cc | 46 | ||||
-rw-r--r-- | libtest/result.hpp | 26 | ||||
-rw-r--r-- | libtest/result/base.hpp | 42 | ||||
-rw-r--r-- | libtest/result/fail.hpp | 5 | ||||
-rw-r--r-- | libtest/result/skip.hpp | 5 | ||||
-rw-r--r-- | libtest/result/success.hpp | 5 | ||||
-rw-r--r-- | libtest/test.hpp | 5 |
15 files changed, 241 insertions, 167 deletions
diff --git a/libtest/cmdline.cc b/libtest/cmdline.cc index fd9e510d..3ecf63df 100644 --- a/libtest/cmdline.cc +++ b/libtest/cmdline.cc @@ -59,6 +59,7 @@ using namespace libtest; #include <unistd.h> #include <algorithm> +#include <stdexcept> #ifndef __USE_GNU static char **environ= NULL; diff --git a/libtest/exception.cc b/libtest/exception.cc new file mode 100644 index 00000000..0b18f777 --- /dev/null +++ b/libtest/exception.cc @@ -0,0 +1,108 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * Data Differential YATL (i.e. libtest) library + * + * Copyright (C) 2012-2013 Data Differential, http://datadifferential.com/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * * The names of its contributors may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "libtest/yatlcon.h" +#include <libtest/common.h> +#include <cstdarg> + +namespace libtest { + +exception::exception(const char *file_arg, int line_arg, const char *func_arg): + std::exception(), + _line(line_arg), + _file(file_arg), + _func(func_arg), + _error_message(NULL), + _error_message_size(0) +{ +} + +#ifndef __INTEL_COMPILER +# pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif +void exception::init(va_list args_) +{ + const char *format= va_arg(args_, const char *); + int error_message_length= vasprintf(&_error_message, format, args_); + assert(error_message_length != -1); + if (error_message_length > 0) + { + _error_message_size= error_message_length +1; + } +} + +exception::~exception() throw() +{ + if (_error_message) + { + free(_error_message); + } +} + +void exception::what(size_t length_, const char* message_) +{ + if (length_ > 0 and message_) + { + char *ptr= (char*) realloc(_error_message, length_ +1); + if (ptr) + { + _error_message= ptr; + memcpy(_error_message, message_, length_); + _error_message[length_]= 0; + } + } +} + +exception::exception(const exception& other) : + std::exception(), + _line(other._line), + _file(other._file), + _func(other._func), + _error_message_size(0) +{ + if (other.length() > 0) + { + _error_message= (char*) malloc(other.length() +1); + if (_error_message) + { + memcpy(_error_message, other._error_message, other.length()); + _error_message_size= other.length(); + } + } +} + +} // namespace libtest + diff --git a/libtest/failed.h b/libtest/exception.hpp index bc459660..3d20e8ba 100644 --- a/libtest/failed.h +++ b/libtest/exception.hpp @@ -2,7 +2,7 @@ * * Data Differential YATL (i.e. libtest) library * - * Copyright (C) 2012 Data Differential, http://datadifferential.com/ + * Copyright (C) 2012-2013 Data Differential, http://datadifferential.com/ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -36,16 +36,59 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif +namespace libtest { -LIBTEST_INTERNAL_API - void push_failed_test(const char *collection, const char *test); +class exception : public std::exception +{ +public: + exception(const char *file, int line, const char *func); -LIBTEST_INTERNAL_API - void print_failed_test(void); + exception( const exception& ); + + virtual ~exception() throw(); + + virtual const char* what() const throw() + { + if (_error_message) + { + return _error_message; + } + + return ""; + } + + void what(size_t, const char*); + + size_t length() const + { + return _error_message_size; + } + + int line() const + { + return _line; + } + + const char* file() const + { + return _file; + } + + const char* func() const + { + return _func; + } + +protected: + void init(va_list); + +private: + int _line; + const char* _file; + const char* _func; + char* _error_message; + size_t _error_message_size; +}; + +} // namespace libtest -#ifdef __cplusplus -} -#endif diff --git a/libtest/fatal.hpp b/libtest/exception/disconnected.hpp index c679f9b0..fb3a2adb 100644 --- a/libtest/fatal.hpp +++ b/libtest/exception/disconnected.hpp @@ -2,7 +2,7 @@ * * Data Differential YATL (i.e. libtest) library * - * Copyright (C) 2012 Data Differential, http://datadifferential.com/ + * Copyright (C) 2012-2013 Data Differential, http://datadifferential.com/ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -36,20 +36,15 @@ #pragma once -#include <stdexcept> +#include "libtest/exception.hpp" namespace libtest { -class disconnected : public std::runtime_error +class disconnected : public libtest::exception { public: disconnected(const char *file, int line, const char *func, const std::string&, const in_port_t port, ...); - const char* what() const throw() - { - return _error_message; - } - disconnected(const disconnected&); // The following are just for unittesting the exception class @@ -59,28 +54,9 @@ public: static uint32_t disabled_counter(); static void increment_disabled_counter(); - int line() const - { - return _line; - } - - const char* file() const - { - return _file; - } - - const char* func() const - { - return _func; - } - private: - char _error_message[BUFSIZ]; in_port_t _port; char _instance[BUFSIZ]; - int _line; - const char* _file; - const char* _func; }; } // namespace libtest diff --git a/libtest/fatal.cc b/libtest/exception/fatal.cc index 0ed06c2c..21a8ca79 100644 --- a/libtest/fatal.cc +++ b/libtest/exception/fatal.cc @@ -36,6 +36,7 @@ #include "libtest/yatlcon.h" #include <libtest/common.h> +#include "libtest/exception.hpp" #include <cstdarg> namespace libtest { @@ -43,7 +44,7 @@ namespace libtest { #pragma GCC diagnostic ignored "-Wformat-nonliteral" fatal::fatal(const char *file_arg, int line_arg, const char *func_arg, ...) : - __test_result(file_arg, line_arg, func_arg) + libtest::exception(file_arg, line_arg, func_arg) { va_list args; va_start(args, func_arg); @@ -52,7 +53,7 @@ fatal::fatal(const char *file_arg, int line_arg, const char *func_arg, ...) : } fatal::fatal( const fatal& other ) : - __test_result(other) + libtest::exception(other) { } @@ -89,11 +90,8 @@ void fatal::increment_disabled_counter() throw() #pragma GCC diagnostic ignored "-Wformat-nonliteral" disconnected::disconnected(const char *file_arg, int line_arg, const char *func_arg, const std::string& instance, const in_port_t port, ...) : - std::runtime_error(func_arg), - _port(port), - _line(line_arg), - _file(file_arg), - _func(func_arg) + libtest::exception(file_arg, line_arg, func_arg), + _port(port) { va_list args; va_start(args, port); @@ -102,17 +100,19 @@ disconnected::disconnected(const char *file_arg, int line_arg, const char *func_ (void)vsnprintf(last_error, sizeof(last_error), format, args); va_end(args); - snprintf(_error_message, sizeof(_error_message), "%s:%u %s", instance.c_str(), uint32_t(port), last_error); + char buffer_error[BUFSIZ]; + int error_length= snprintf(buffer_error, sizeof(buffer_error), "%s:%u %s", instance.c_str(), uint32_t(port), last_error); + + if (error_length > 0) + { + what(size_t(error_length), buffer_error); + } } disconnected::disconnected(const disconnected& other): - std::runtime_error(other._func), - _port(other._port), - _line(other._line), - _file(other._file), - _func(other._func) + libtest::exception(other), + _port(other._port) { - strncpy(_error_message, other._error_message, BUFSIZ); strncpy(_instance, other._instance, BUFSIZ); } diff --git a/libtest/result/fatal.hpp b/libtest/exception/fatal.hpp index 8e6d1346..5ee1aac5 100644 --- a/libtest/result/fatal.hpp +++ b/libtest/exception/fatal.hpp @@ -38,7 +38,7 @@ namespace libtest { -class fatal : public __test_result +class fatal : public libtest::exception { public: fatal(const char *file, int line, const char *func, ...); @@ -52,7 +52,36 @@ public: static uint32_t disabled_counter() throw(); static void increment_disabled_counter() throw(); + test_return_t return_code() const + { + return TEST_SKIPPED; + } + private: }; } // namespace libtest + +#define FATAL(...) \ +do \ +{ \ + throw libtest::fatal(LIBYATL_DEFAULT_PARAM, __VA_ARGS__); \ +} while (0) + +#define FATAL_IF(__expression, ...) \ +do \ +{ \ + if ((__expression)) { \ + throw libtest::fatal(LIBYATL_DEFAULT_PARAM, (#__expression)); \ + } \ +} while (0) + +#define FATAL_IF_(__expression, ...) \ +do \ +{ \ + if ((__expression)) { \ + throw libtest::fatal(LIBYATL_DEFAULT_PARAM, __VA_ARGS__); \ + } \ +} while (0) + +#define fatal_assert(__assert) if((__assert)) {} else { throw libtest::fatal(LIBYATL_DEFAULT_PARAM, #__assert); } diff --git a/libtest/has.cc b/libtest/has.cc index a7a09cb4..fd25550e 100644 --- a/libtest/has.cc +++ b/libtest/has.cc @@ -143,7 +143,7 @@ static char memcached_binary_path[FILENAME_MAX]; static void initialize_curl_startup() { - memcached_binary_path[0]= NULL; + memcached_binary_path[0]= 0; #if defined(HAVE_MEMCACHED_BINARY) && HAVE_MEMCACHED_BINARY if (HAVE_MEMCACHED_BINARY) diff --git a/libtest/include.am b/libtest/include.am index c9368c4f..9ef6d0ba 100644 --- a/libtest/include.am +++ b/libtest/include.am @@ -67,8 +67,9 @@ noinst_HEADERS+= libtest/comparison.hpp noinst_HEADERS+= libtest/core.h noinst_HEADERS+= libtest/dream.h noinst_HEADERS+= libtest/error.h -noinst_HEADERS+= libtest/failed.h -noinst_HEADERS+= libtest/fatal.hpp +noinst_HEADERS+= libtest/exception.hpp +noinst_HEADERS+= libtest/exception/disconnected.hpp +noinst_HEADERS+= libtest/exception/fatal.hpp noinst_HEADERS+= libtest/framework.h noinst_HEADERS+= libtest/gearmand.h noinst_HEADERS+= libtest/drizzled.h @@ -86,7 +87,6 @@ noinst_HEADERS+= libtest/port.h noinst_HEADERS+= libtest/result.hpp noinst_HEADERS+= libtest/result/base.hpp noinst_HEADERS+= libtest/result/fail.hpp -noinst_HEADERS+= libtest/result/fatal.hpp noinst_HEADERS+= libtest/result/skip.hpp noinst_HEADERS+= libtest/result/success.hpp noinst_HEADERS+= libtest/runner.h @@ -132,7 +132,8 @@ libtest_libtest_la_SOURCES+= libtest/cpu.cc libtest_libtest_la_SOURCES+= libtest/dns.cc libtest_libtest_la_SOURCES+= libtest/dream.cc libtest_libtest_la_SOURCES+= libtest/drizzled.cc -libtest_libtest_la_SOURCES+= libtest/fatal.cc +libtest_libtest_la_SOURCES+= libtest/exception.cc +libtest_libtest_la_SOURCES+= libtest/exception/fatal.cc libtest_libtest_la_SOURCES+= libtest/formatter.cc libtest_libtest_la_SOURCES+= libtest/client.cc libtest_libtest_la_SOURCES+= libtest/framework.cc diff --git a/libtest/result.cc b/libtest/result.cc index a102b4f7..3e4523d3 100644 --- a/libtest/result.cc +++ b/libtest/result.cc @@ -41,53 +41,9 @@ namespace libtest { __test_result::__test_result(const char *file_arg, int line_arg, const char *func_arg): - _line(line_arg), - _file(file_arg), - _func(func_arg), - _error_message(NULL), - _error_message_size(0) -{ -} - -#ifndef __INTEL_COMPILER -# pragma GCC diagnostic ignored "-Wformat-nonliteral" -#endif -void __test_result::init(va_list args_) -{ - const char *format= va_arg(args_, const char *); - _error_message_size= vasprintf(&_error_message, format, args_); - assert(_error_message_size != -1); - if (_error_message_size > 0) + libtest::exception(file_arg, line_arg, func_arg) { - _error_message_size++; } -} - -__test_result::~__test_result() throw() -{ - free(_error_message); -} - -__test_result::__test_result(const __test_result& other) : - std::exception(), - _line(other._line), - _file(other._file), - _func(other._func), - _error_message_size(other._error_message_size) -{ - if (_error_message_size > 0) - { - _error_message= (char*) malloc(_error_message_size); - if (_error_message) - { - memcpy(_error_message, other._error_message, _error_message_size); - } - else - { - _error_message_size= -1; - } - } -} __success::__success(const char *file_arg, int line_arg, const char *func_arg): __test_result(file_arg, line_arg, func_arg) diff --git a/libtest/result.hpp b/libtest/result.hpp index 0c78b998..79acbb40 100644 --- a/libtest/result.hpp +++ b/libtest/result.hpp @@ -36,10 +36,8 @@ #pragma once -#include <libtest/fatal.hpp> #include <libtest/result/base.hpp> #include <libtest/result/fail.hpp> -#include <libtest/result/fatal.hpp> #include <libtest/result/skip.hpp> #include <libtest/result/success.hpp> @@ -56,27 +54,3 @@ do \ { \ throw libtest::__failure(LIBYATL_DEFAULT_PARAM, __VA_ARGS__); \ } while (0) - -#define FATAL(...) \ -do \ -{ \ - throw libtest::fatal(LIBYATL_DEFAULT_PARAM, __VA_ARGS__); \ -} while (0) - -#define FATAL_IF(__expression, ...) \ -do \ -{ \ - if ((__expression)) { \ - throw libtest::fatal(LIBYATL_DEFAULT_PARAM, (#__expression)); \ - } \ -} while (0) - -#define FATAL_IF_(__expression, ...) \ -do \ -{ \ - if ((__expression)) { \ - throw libtest::fatal(LIBYATL_DEFAULT_PARAM, __VA_ARGS__); \ - } \ -} while (0) - -#define fatal_assert(__assert) if((__assert)) {} else { throw libtest::fatal(LIBYATL_DEFAULT_PARAM, #__assert); } diff --git a/libtest/result/base.hpp b/libtest/result/base.hpp index 51ee995d..5f093f83 100644 --- a/libtest/result/base.hpp +++ b/libtest/result/base.hpp @@ -36,51 +36,19 @@ #pragma once +#include "libtest/exception.hpp" +#include "libtest/error.h" + namespace libtest { -class __test_result : public std::exception +class __test_result : public libtest::exception { public: __test_result(const char *file, int line, const char *func); - __test_result( const __test_result& ); - - virtual ~__test_result() throw(); - - virtual const char* what() const throw() - { - if (_error_message) - { - return _error_message; - } - - return ""; - } - - int line() const - { - return _line; - } - - const char* file() const - { - return _file; - } - - const char* func() const - { - return _func; - } - -protected: - void init(va_list); + virtual test_return_t return_code() const= 0; private: - int _line; - const char* _file; - const char* _func; - char* _error_message; - int _error_message_size; }; } // namespace libtest diff --git a/libtest/result/fail.hpp b/libtest/result/fail.hpp index fd8766a9..3aec9c1e 100644 --- a/libtest/result/fail.hpp +++ b/libtest/result/fail.hpp @@ -45,6 +45,11 @@ public: __failure(const __failure&); + test_return_t return_code() const + { + return TEST_FAILURE; + } + private: }; diff --git a/libtest/result/skip.hpp b/libtest/result/skip.hpp index d0226e9f..7409d718 100644 --- a/libtest/result/skip.hpp +++ b/libtest/result/skip.hpp @@ -44,6 +44,11 @@ public: __skipped(const char *file, int line, const char *func, ...); __skipped(const __skipped&); + + test_return_t return_code() const + { + return TEST_SKIPPED; + } }; } // namespace libtest diff --git a/libtest/result/success.hpp b/libtest/result/success.hpp index 2931f2d0..a34e677e 100644 --- a/libtest/result/success.hpp +++ b/libtest/result/success.hpp @@ -48,6 +48,11 @@ public: return "SUCCESS"; } + test_return_t return_code() const + { + return TEST_SUCCESS; + } + private: }; diff --git a/libtest/test.hpp b/libtest/test.hpp index 7c18d6bc..d9040700 100644 --- a/libtest/test.hpp +++ b/libtest/test.hpp @@ -65,7 +65,10 @@ #include <libtest/version.h> #include <libtest/vchar.hpp> -#include <libtest/fatal.hpp> +#include <libtest/error.h> +#include <libtest/exception.hpp> +#include <libtest/exception/disconnected.hpp> +#include <libtest/exception/fatal.hpp> #include <libtest/result.hpp> #include <libtest/has.hpp> |