diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2015-01-22 12:24:00 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2015-02-04 10:49:06 +0100 |
commit | aa09aa321b24981bf0f8f2dec97ac100727266a5 (patch) | |
tree | 9291597f54e8d86357a285f9ffd426ff435f9387 /test/fixtures | |
parent | 8a1fce547e9ad0bf750418c844c9b23a3ee6d8dd (diff) | |
download | qtlocation-mapboxgl-aa09aa321b24981bf0f8f2dec97ac100727266a5.tar.gz |
rearrange tests and make more robust
Diffstat (limited to 'test/fixtures')
-rw-r--r-- | test/fixtures/fixture_log.cpp | 96 | ||||
-rw-r--r-- | test/fixtures/fixture_log.hpp | 98 | ||||
-rw-r--r-- | test/fixtures/main.cpp | 33 | ||||
-rw-r--r-- | test/fixtures/server_environment.hpp | 51 | ||||
-rw-r--r-- | test/fixtures/util.cpp | 35 | ||||
-rw-r--r-- | test/fixtures/util.hpp | 24 |
6 files changed, 203 insertions, 134 deletions
diff --git a/test/fixtures/fixture_log.cpp b/test/fixtures/fixture_log.cpp new file mode 100644 index 0000000000..02715fd43d --- /dev/null +++ b/test/fixtures/fixture_log.cpp @@ -0,0 +1,96 @@ +#include "fixture_log.hpp" + +namespace mbgl { + +FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, int64_t code_, + const std::string &msg_) + : severity(severity_), event(event_), code(code_), msg(msg_) { +} +FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, int64_t code_) + : severity(severity_), event(event_), code(code_), msg() { +} +FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, + const std::string &msg_) + : severity(severity_), event(event_), code(), msg(msg_) { +} + +FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_) + : severity(severity_), event(event_), code(), msg() { +} + +bool FixtureLogBackend::LogMessage::operator==(const LogMessage &rhs) const { + return (!severity || !rhs.severity || severity.get() == rhs.severity.get()) && + (!event || !rhs.event || event.get() == rhs.event.get()) && + (!code || !rhs.code || code.get() == rhs.code.get()) && + (!msg || !rhs.msg || msg.get() == rhs.msg.get()); +} + +FixtureLogBackend::~FixtureLogBackend() { + std::cerr << unchecked(); +} + +void FixtureLogBackend::record(EventSeverity severity, Event event, const std::string &msg) { + messages.emplace_back(severity, event, msg); +} + +void FixtureLogBackend::record(EventSeverity severity, Event event, const char *format, ...) { + va_list args; + va_start(args, format); + const size_t len = vsnprintf(NULL, 0, format, args); + va_end(args); + std::unique_ptr<char[]> buffer(new char[len + 1]); + va_start(args, format); + vsnprintf(buffer.get(), len + 1, format, args); + va_end(args); + messages.emplace_back(severity, event, std::string{ buffer.get(), len }); +} + +void FixtureLogBackend::record(EventSeverity severity, Event event, int64_t code) { + messages.emplace_back(severity, event, code); +} + +void FixtureLogBackend::record(EventSeverity severity, Event event, int64_t code, + const std::string &msg) { + messages.emplace_back(severity, event, code, msg); +} + +size_t FixtureLogBackend::count(const LogMessage &message) const { + size_t message_count = 0; + for (const LogMessage &msg : messages) { + if (msg == message) { + message_count++; + msg.checked = true; + } + } + return message_count; +} + +std::vector<FixtureLogBackend::LogMessage> FixtureLogBackend::unchecked() const { + std::vector<LogMessage> unchecked_messages; + for (const LogMessage &msg : messages) { + if (!msg.checked) { + unchecked_messages.push_back(msg); + msg.checked = true; + } + } + return unchecked_messages; +} + +::std::ostream &operator<<(::std::ostream &os, + const std::vector<FixtureLogBackend::LogMessage> &messages) { + for (const FixtureLogBackend::LogMessage &message : messages) { + os << "- " << message; + } + return os; +} + +::std::ostream &operator<<(::std::ostream &os, const FixtureLogBackend::LogMessage &message) { + os << "[\"" << message.severity.get() << "\", \"" << message.event.get() << "\""; + if (message.code) + os << ", " << message.code.get(); + if (message.msg) + os << ", \"" << message.msg.get() << "\""; + return os << "]" << std::endl; +} + +}
\ No newline at end of file diff --git a/test/fixtures/fixture_log.hpp b/test/fixtures/fixture_log.hpp index 8df16e3086..bc7c9fab31 100644 --- a/test/fixtures/fixture_log.hpp +++ b/test/fixtures/fixture_log.hpp @@ -9,27 +9,17 @@ #include <cstdarg> #include <iostream> - namespace mbgl { class FixtureLogBackend : public LogBackend, private util::noncopyable { public: struct LogMessage { - inline LogMessage(EventSeverity severity_, Event event_, int64_t code_, const std::string &msg_) - : severity(severity_), event(event_), code(code_), msg(msg_) {} - inline LogMessage(EventSeverity severity_, Event event_, int64_t code_) - : severity(severity_), event(event_), code(code_), msg() {} - inline LogMessage(EventSeverity severity_, Event event_, const std::string &msg_) - : severity(severity_), event(event_), code(), msg(msg_) {} - inline LogMessage(EventSeverity severity_, Event event_) - : severity(severity_), event(event_), code(), msg() {} + LogMessage(EventSeverity severity_, Event event_, int64_t code_, const std::string &msg_); + LogMessage(EventSeverity severity_, Event event_, int64_t code_); + LogMessage(EventSeverity severity_, Event event_, const std::string &msg_); + LogMessage(EventSeverity severity_, Event event_); - inline bool operator==(const LogMessage &rhs) const { - return (!severity || !rhs.severity || severity.get() == rhs.severity.get()) && - (!event || !rhs.event || event.get() == rhs.event.get()) && - (!code || !rhs.code || code.get() == rhs.code.get()) && - (!msg || !rhs.msg || msg.get() == rhs.msg.get()); - } + bool operator==(const LogMessage &rhs) const; const mapbox::util::optional<EventSeverity> severity; const mapbox::util::optional<Event> event; @@ -39,81 +29,23 @@ public: mutable bool checked = false; }; - inline ~FixtureLogBackend(); - - inline void record(EventSeverity severity, Event event, const std::string &msg) { - messages.emplace_back(severity, event, msg); - } - - inline void record(EventSeverity severity, Event event, const char* format, ...) { - va_list args; - va_start(args, format); - const size_t len = vsnprintf(NULL, 0, format, args); - va_end(args); - std::unique_ptr<char[]> buffer(new char[len + 1]); - va_start(args, format); - vsnprintf(buffer.get(), len + 1, format, args); - va_end(args); - messages.emplace_back(severity, event, std::string { buffer.get(), len }); - } - - inline void record(EventSeverity severity, Event event, int64_t code) { - messages.emplace_back(severity, event, code); - } + ~FixtureLogBackend(); - inline void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { - messages.emplace_back(severity, event, code, msg); - } + inline void record(EventSeverity severity, Event event, const std::string &msg); + inline void record(EventSeverity severity, Event event, const char *format, ...); + inline void record(EventSeverity severity, Event event, int64_t code); + inline void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); - inline size_t count(const LogMessage &message) const; - inline std::vector<LogMessage> unchecked() const; + size_t count(const LogMessage &message) const; + std::vector<LogMessage> unchecked() const; public: std::vector<LogMessage> messages; }; -inline ::std::ostream& operator<<(::std::ostream& os, const std::vector<FixtureLogBackend::LogMessage>& messages); -inline ::std::ostream& operator<<(::std::ostream& os, const FixtureLogBackend::LogMessage& message); - -FixtureLogBackend::~FixtureLogBackend() { - std::cerr << unchecked(); -} - -size_t FixtureLogBackend::count(const LogMessage &message) const { - size_t message_count = 0; - for (const LogMessage &msg : messages) { - if (msg == message) { - message_count++; - msg.checked = true; - } - } - return message_count; -} - -std::vector<FixtureLogBackend::LogMessage> FixtureLogBackend::unchecked() const { - std::vector<LogMessage> unchecked_messages; - for (const LogMessage &msg : messages) { - if (!msg.checked) { - unchecked_messages.push_back(msg); - msg.checked = true; - } - } - return unchecked_messages; -} - -::std::ostream& operator<<(::std::ostream& os, const std::vector<FixtureLogBackend::LogMessage>& messages) { - for (const FixtureLogBackend::LogMessage &message : messages) { - os << "- " << message; - } - return os; -} - -::std::ostream& operator<<(::std::ostream& os, const FixtureLogBackend::LogMessage& message) { - os << "[\"" << message.severity.get() << "\", \"" << message.event.get() << "\""; - if (message.code) os << ", " << message.code.get(); - if (message.msg) os << ", \"" << message.msg.get() << "\""; - return os << "]" << std::endl; -} +::std::ostream &operator<<(::std::ostream &os, + const std::vector<FixtureLogBackend::LogMessage> &messages); +::std::ostream &operator<<(::std::ostream &os, const FixtureLogBackend::LogMessage &message); } diff --git a/test/fixtures/main.cpp b/test/fixtures/main.cpp new file mode 100644 index 0000000000..303a0b9ab5 --- /dev/null +++ b/test/fixtures/main.cpp @@ -0,0 +1,33 @@ +#include "util.hpp" + +#include <libgen.h> + +std::string baseDirectory; + +namespace mbgl { +namespace test { + +const std::string &getBaseDirectory() { + return baseDirectory; +} + +} +} + +GTEST_API_ int main(int argc, char *argv[]) { + // Note: glibc's dirname() **modifies** the argument and can't handle static strings. + std::string file { __FILE__ }; + file = dirname(const_cast<char *>(file.c_str())); + if (file[0] == '/') { + // If __FILE__ is an absolute path, we don't have to guess from the argv 0. + baseDirectory = file + "/.."; + } else { + std::string argv0 { argv[0] }; argv0 = dirname(const_cast<char *>(argv0.c_str())); + baseDirectory = argv0 + "/" + file + "/.."; + } + + fprintf(stderr, "basedir: %s\n", mbgl::test::getBaseDirectory().c_str()); + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/fixtures/server_environment.hpp b/test/fixtures/server_environment.hpp deleted file mode 100644 index 54dbb24bdd..0000000000 --- a/test/fixtures/server_environment.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef MBGL_TEST_FIXTURES_SERVER_ENVIRONMENT -#define MBGL_TEST_FIXTURES_SERVER_ENVIRONMENT - -#include <gtest/gtest.h> - -#include <dirent.h> -#include <signal.h> -#include <libgen.h> - -class ServerEnvironment : public ::testing::Environment { -public: - inline ServerEnvironment(const std::string &executable); - inline virtual void SetUp(); - inline virtual void TearDown(); - -private: - const std::string executable; - const std::string parent_pid = std::to_string(getpid()); - pid_t pid = 0; -}; - -ServerEnvironment::ServerEnvironment(const std::string &executable_) : executable(executable_) {} - -void ServerEnvironment::SetUp() { - pid = fork(); - if (pid < 0) { - throw std::runtime_error("Cannot create server process"); - } else if (pid == 0) { - char *arg[] = { - const_cast<char *>(executable.c_str()), - const_cast<char *>(parent_pid.c_str()), - nullptr - }; - int ret = execv(executable.c_str(), arg); - // This call should not return. In case execve failed, we exit anyway. - if (ret < 0) { - fprintf(stderr, "Failed to start server: %s\n", strerror(errno)); - } - exit(0); - } else { - // Wait until the server process sends SIGCONT. - raise(SIGSTOP); - } -} - -void ServerEnvironment::TearDown() { - ASSERT_TRUE(pid); - kill(pid, SIGHUP); -} - -#endif
\ No newline at end of file diff --git a/test/fixtures/util.cpp b/test/fixtures/util.cpp new file mode 100644 index 0000000000..7434393556 --- /dev/null +++ b/test/fixtures/util.cpp @@ -0,0 +1,35 @@ +#include "util.hpp" + +#include <csignal> + +namespace mbgl { +namespace test { + +pid_t startServer(const char *executable) { + const std::string parent_pid = std::to_string(getpid()); + pid_t pid = fork(); + if (pid < 0) { + throw std::runtime_error("Cannot create server process"); + } else if (pid == 0) { + char *args[] = { const_cast<char *>(executable), + const_cast<char *>(parent_pid.c_str()), + nullptr }; + int ret = execv(executable, args); + // This call should not return. In case execve failed, we exit anyway. + if (ret < 0) { + fprintf(stderr, "Failed to start server: %s\n", strerror(errno)); + } + exit(0); + } else { + // Wait until the server process sends SIGCONT. + raise(SIGSTOP); + } + return pid; +} + +void stopServer(pid_t pid) { + kill(pid, SIGTERM); +} + +} +} diff --git a/test/fixtures/util.hpp b/test/fixtures/util.hpp new file mode 100644 index 0000000000..f1201d34e7 --- /dev/null +++ b/test/fixtures/util.hpp @@ -0,0 +1,24 @@ +#ifndef MBGL_TEST_UTIL +#define MBGL_TEST_UTIL + +#include <gtest/gtest.h> + +#define SCOPED_TEST(name) \ + static class name { \ + bool completed = false; \ + public: \ + void finish() { EXPECT_FALSE(completed) << #name " was already completed."; completed = true; } \ + ~name() { if (!completed) ADD_FAILURE() << #name " didn't complete."; } \ + } name; + +namespace mbgl { +namespace test { + +const std::string &getBaseDirectory(); +pid_t startServer(const char *executable); +void stopServer(pid_t pid); + +} +} + +#endif |