Due to the default automake compilation flags including -I. -I.., it is possible to pick up an xorg-gtest header like device.h instead of a project header. Namespacing the headers should resolve this issue. Users should be including xorg-gtest.h instead of individual headers, so this should not cause compilation failures.
Signed-off-by: Chase Douglas <[email protected]> --- include/Makefile.am | 8 +- include/xorg/gtest/environment.h | 184 -------------------------- include/xorg/gtest/evemu/device.h | 91 ------------- include/xorg/gtest/evemu/xorg-gtest_device.h | 91 +++++++++++++ include/xorg/gtest/process.h | 166 ----------------------- include/xorg/gtest/test.h | 104 --------------- include/xorg/gtest/xorg-gtest.h | 8 +- include/xorg/gtest/xorg-gtest_environment.h | 184 ++++++++++++++++++++++++++ include/xorg/gtest/xorg-gtest_process.h | 166 +++++++++++++++++++++++ include/xorg/gtest/xorg-gtest_test.h | 104 +++++++++++++++ 10 files changed, 553 insertions(+), 553 deletions(-) delete mode 100644 include/xorg/gtest/environment.h delete mode 100644 include/xorg/gtest/evemu/device.h create mode 100644 include/xorg/gtest/evemu/xorg-gtest_device.h delete mode 100644 include/xorg/gtest/process.h delete mode 100644 include/xorg/gtest/test.h create mode 100644 include/xorg/gtest/xorg-gtest_environment.h create mode 100644 include/xorg/gtest/xorg-gtest_process.h create mode 100644 include/xorg/gtest/xorg-gtest_test.h diff --git a/include/Makefile.am b/include/Makefile.am index 0256685..6b39d0b 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -24,8 +24,8 @@ # nobase_include_HEADERS = \ - xorg/gtest/environment.h \ - xorg/gtest/process.h \ - xorg/gtest/test.h \ - xorg/gtest/evemu/device.h \ + xorg/gtest/xorg-gtest_environment.h \ + xorg/gtest/xorg-gtest_process.h \ + xorg/gtest/xorg-gtest_test.h \ + xorg/gtest/evemu/xorg-gtest_device.h \ xorg/gtest/xorg-gtest.h diff --git a/include/xorg/gtest/environment.h b/include/xorg/gtest/environment.h deleted file mode 100644 index e113cd7..0000000 --- a/include/xorg/gtest/environment.h +++ /dev/null @@ -1,184 +0,0 @@ -/******************************************************************************* - * - * X testing environment - Google Test environment feat. dummy x server - * - * Copyright (C) 2011, 2012 Canonical Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - ******************************************************************************/ - -#ifndef XORG_GTEST_ENVIRONMENT_H -#define XORG_GTEST_ENVIRONMENT_H - -#include <memory> -#include <string> - -#include <gtest/gtest.h> - -namespace xorg { -namespace testing { - -/** - * \mainpage X.org Google %Test Framework - * - * Xorg-gtest makes it easy to write test cases - * for a dummy headless X.org server. It can also run tests - * using a running X11 server. - * - */ - -/** - * @class Environment environment.h xorg/gtest/environment.h - * - * Global Google %Test environment providing a dummy X server. - * - * Starts up a dummy X server for testing purposes. - * Either associate the environment manually - * with the overall testing framework like - * @code - * xorg::testing::Environment* environment = new xorg::testing::Environment; - * environment->set_server("Xorg"); - * environment->set_display(133); - * environment->set_conf_file("conf/dummy.conf"); - * environment->set_log_file("/tmp/MyDummyXorg.log"); - * testing::AddGlobalTestEnvironment(environment); - * @endcode - * or link to libxorg-gtest_main. - */ -class Environment : public ::testing::Environment { - public: - /** - * Constructs an object to provide a global X server dummy environment. - */ - Environment(); - - virtual ~Environment(); - - /** - * Sets the path where the server log file will be created. - * - * The path will be passed on to the server via the command line argument - * "-logfile". The default value is "/tmp/Xorg.GTest.log". - * - * @param path_to_log_file Path to server logfile. - */ - void set_log_file(const std::string& path_to_log_file); - - /** - * Returns the path where the server log file will be created. - * - * @return Path to server logfile. - */ - const std::string& log_file() const; - - /** - * Sets the path to the desired server configuration file. - * - * The path will be passed on to the server via the command line argument - * "-config". The default value is "[datadir]/xorg/gtest/dummy.conf". - * - * @param path_conf_file Path to a Xorg X server .conf file. - */ - void set_conf_file(const std::string& path_conf_file); - - /** - * Returns the path of the server configuration file to be used. - * - * @return File path of the server configuration currently set - */ - const std::string& conf_file() const; - - /** - * Sets the path to the server executable - * - * The default value is "Xorg". - * - * @param path_to_server Path to an X.org server executable - */ - void set_server(const std::string& path_to_server); - - /** - * Returns the path of the server executable to be used. - * - * @return Path to server executable. - */ - const std::string& server() const; - - /** - * Sets the display number that the server will use. - * - * The display number will be passed on to the server via the command line. - * The default value is 133. - * - * @param diplay_num A display number. - */ - void set_display(int display_num); - - /** - * Returns the display number of the server instance. - * - * @return Display number of the server. - */ - int display() const; - - /** - * Kill the dummy Xorg server with SIGKILL. - */ - void Kill(); - - protected: - /** - * Starts the dummy X server. - * - * Reimplemented from ::testing::Environment. See Google %Test documentation - * for details. - * - * @throws std::runtime_error if a dummy X server cannot be started. - * - * @post If successful: subsequent connections to the dummy X server succeed. - * @post If successful: %Environment variable DISPLAY contains the - * display port for connecting to the dummy X server. - */ - virtual void SetUp(); - - /** - * Stops the dummy X server. - * - * Reimplemented from ::testing::Environment. See Google %Test documentation - * for details. - * - * @post Dummy X server stopped. - */ - virtual void TearDown(); - - private: - struct Private; - std::auto_ptr<Private> d_; - - /* Disable copy constructor & assignment operator */ - Environment(const Environment&); - Environment& operator=(const Environment&); -}; - -} // namespace testing -} // namespace xorg - -#endif // XORG_GTEST_ENVIRONMENT_H diff --git a/include/xorg/gtest/evemu/device.h b/include/xorg/gtest/evemu/device.h deleted file mode 100644 index 4e456ce..0000000 --- a/include/xorg/gtest/evemu/device.h +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * - * X testing environment - Google Test environment feat. dummy x server - * - * Copyright (C) 2012 Canonical Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - ******************************************************************************/ - -#ifndef XORG_GTEST_EVEMU_DEVICE_H_ -#define XORG_GTEST_EVEMU_DEVICE_H_ - -#include <memory> -#include <string> - -extern "C" { - -#include <evemu.h> - -} // extern "C" - -namespace xorg { -namespace testing { -namespace evemu { - -/** - * @class Device device.h xorg/gtest/evemu/device.h - * - * uTouch-Evemu input device for replaying events through the Linux uinput - * evdev subsystem. - * - * Use the Recording class to play back a specific recording. - */ - -class Device { - public: - /** - * Create a new device context. - * - * @param [in] path Path to uTouch-Evemu device property file. - * - * @throws std::runtime_error if the device property file could not be found - * or the device could not be created. - */ - explicit Device(const std::string& path); - ~Device(); - - /** - * Play a uTouch-Evemu recording through the device. - * - * Plays the recording from the beginning through the end. This call will - * block until the recording has finished. - * - * @param [in] path Path to uTouch-Evemu recording file. - * - * @throws std::runtime_error if playback failed for any reason. - */ - void Play(const std::string& path) const; - - private: - struct Private; - std::auto_ptr<Private> d_; - - /* Disable copy constructor & assignment operator */ - Device(const Device&); - Device& operator=(const Device&); -}; - -} // namespace evemu -} // namespace testing -} // namespace xorg - -#endif // XORG_GTEST_EVEMU_DEVICE_H_ diff --git a/include/xorg/gtest/evemu/xorg-gtest_device.h b/include/xorg/gtest/evemu/xorg-gtest_device.h new file mode 100644 index 0000000..4e456ce --- /dev/null +++ b/include/xorg/gtest/evemu/xorg-gtest_device.h @@ -0,0 +1,91 @@ +/******************************************************************************* + * + * X testing environment - Google Test environment feat. dummy x server + * + * Copyright (C) 2012 Canonical Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ******************************************************************************/ + +#ifndef XORG_GTEST_EVEMU_DEVICE_H_ +#define XORG_GTEST_EVEMU_DEVICE_H_ + +#include <memory> +#include <string> + +extern "C" { + +#include <evemu.h> + +} // extern "C" + +namespace xorg { +namespace testing { +namespace evemu { + +/** + * @class Device device.h xorg/gtest/evemu/device.h + * + * uTouch-Evemu input device for replaying events through the Linux uinput + * evdev subsystem. + * + * Use the Recording class to play back a specific recording. + */ + +class Device { + public: + /** + * Create a new device context. + * + * @param [in] path Path to uTouch-Evemu device property file. + * + * @throws std::runtime_error if the device property file could not be found + * or the device could not be created. + */ + explicit Device(const std::string& path); + ~Device(); + + /** + * Play a uTouch-Evemu recording through the device. + * + * Plays the recording from the beginning through the end. This call will + * block until the recording has finished. + * + * @param [in] path Path to uTouch-Evemu recording file. + * + * @throws std::runtime_error if playback failed for any reason. + */ + void Play(const std::string& path) const; + + private: + struct Private; + std::auto_ptr<Private> d_; + + /* Disable copy constructor & assignment operator */ + Device(const Device&); + Device& operator=(const Device&); +}; + +} // namespace evemu +} // namespace testing +} // namespace xorg + +#endif // XORG_GTEST_EVEMU_DEVICE_H_ diff --git a/include/xorg/gtest/process.h b/include/xorg/gtest/process.h deleted file mode 100644 index d7e1143..0000000 --- a/include/xorg/gtest/process.h +++ /dev/null @@ -1,166 +0,0 @@ -/******************************************************************************* - * - * X testing environment - Google Test environment feat. dummy x server - * - * Copyright (C) 2011, 2012 Canonical Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - ******************************************************************************/ - -#ifndef XORG_GTEST_PROCESS_H -#define XORG_GTEST_PROCESS_H - -#include <stdarg.h> - -#include <memory> -#include <string> - -namespace xorg { -namespace testing { - -/** - * @class Process test.h xorg/gtest/process.h - * - * Class that abstracts child process creation and termination. - * - * This class allows for forking, running and terminating child processes. - * In addition, manipulation of the child process' environment is supported. - * For example, starting an X server instance on display port 133 as a child - * process can be realized with the following code snippet: - * @code - * Process xorgServer; - * try { - * xorgServer.Start("Xorg", "Xorg", ":133"); - * } catch (const std::runtime_error&e) { - * std::cerr << "Problem starting the X server: " << e.what() << std::endl; - * } - * ... - * if (!xorgServer.Terminate()) { - * std::cerr << "Problem terminating server ... killing now ..." << std::endl; - * if (!xorgServer.Kill()) - * std::cerr << "Problem killing server" << std::endl; - * } - * @endcode - */ -class Process { - public: - /** - * Helper function to adjust the environment of the current process. - * - * @param [in] name Name of the environment variable. - * @param [in] value Value of the environment variable. - * @param [in] overwrite Whether to overwrite the value of existing env - * variables. - * - * @throws std::runtime_error if adjusting the environment does not succeed. - */ - static void SetEnv(const std::string& name, const std::string& value, - bool overwrite); - - /** - * Helper function to query the environment of the current process. - * - * @param [in] name The name of the environment variable. - * @param [out] exists If not NULL, the variable will be set to true if the - * environment variable exists and to false otherwise. - * @returns The value of the environment variable, or an empty string. - */ - static std::string GetEnv(const std::string& name, bool* exists = NULL); - - /** - * Creates a child-process that is in a terminated state. - */ - Process(); - - /** - * Starts a program as a child process. - * - * See 'man execvp' for further information on the variadic argument list. - * - * @param program The program to start. - * @param args Variadic list of arguments passed to the program. - * - * @throws std::runtime_error on failure. - * - * @post If successful: Child process forked and program started. - * @post If successful: Subsequent calls to Pid() return child process pid. - */ - void Start(const std::string& program, va_list args); - - /** - * Starts a program as a child process. - * - * Takes a variadic list of arguments passed to the program. - * See 'man execvp' for further information on the variadic argument list. - * - * @param program The program to start. - * - * @throws std::runtime_error on failure. - * - * @post If successful: Child process forked and program started. - * @post If successful: Subsequent calls to Pid() return child process pid. - */ - void Start(const std::string& program, ...); - - /** - * Terminates (SIGTERM) this child process. - * - * @throws std::runtime_error if child tries to terminate itself. - * - * @returns true if termination succeeded, false otherwise. - * - * @post If successful: Child process terminated. - * @post If successful: Subsequent calls to Pid() return -1. - */ - bool Terminate(); - - /** - * Kills (SIGKILL) this child process. - * - * @throws std::runtime_error if child tries to kill itself. - * - * @returns true if kill succeeded, false otherwise. - * - * @post If successful: Child process killed. - * @post If successful: Subsequent calls to Pid() return -1. - */ - bool Kill(); - - /** - * Accesses the pid of the child process. - * - * @returns The pid of the child process or -1. - */ - pid_t Pid() const; - - private: - struct Private; - std::auto_ptr<Private> d_; - - /* Disable copy constructor, assignment operator */ - Process(const Process&); - Process& operator=(const Process&); -}; - -} // testing -} // xorg - -#endif // XORG_GTEST_PROCESS_H diff --git a/include/xorg/gtest/test.h b/include/xorg/gtest/test.h deleted file mode 100644 index 093890b..0000000 --- a/include/xorg/gtest/test.h +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* - * - * X testing environment - Google Test environment feat. dummy x server - * - * Copyright (C) 2011, 2012 Canonical Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - ******************************************************************************/ - -#ifndef XORG_GTEST_TEST_H_ -#define XORG_GTEST_TEST_H_ - -#include <memory> - -#include <gtest/gtest.h> -#include <X11/Xlib.h> - -namespace xorg { -namespace testing { - -/** - * @class Test test.h xorg/gtest/test.h - * - * Google %Test fixture providing an Xlib connection to an X11 server. - * - * Sets up and tears down an XLib connection to an X11 server. - * Rely on Google %Test's TEST_F macro to use this fixture for your - * own tests or subclass it and override the SetUp and TearDown - * methods. - * - * @remark The display port is read from the environment variable DISPLAY. - */ -class Test : public ::testing::Test { - public: - - Test(); - - virtual ~Test(); - - protected: - /** - * Tries to connect to an X server instance. - * - * Fails if no X server is running. Updates the display object. - * Reimplemented from ::testing::Test. See Google %Test documentation for - * details. - * - * @post Subsequent calls to Display() return a valid pointer or NULL if an error occured. - * - * @throws std::runtime_error if no X server is running. - */ - virtual void SetUp(); - - /** - * Closes the display. - * - * Reimplemented from ::testing::Test. See Google %Test documentation for - * details. - * - * @post Subsequent calls to Display() return NULL. - */ - virtual void TearDown(); - - /** - * Accesses the display representing an Xlib connection. - * - * Accessible by subclasses and test cases relying on this fixture. - * - * @returns Pointer to a display or NULL. - */ - ::Display* Display() const; - - /** @cond Implementation */ - struct Private; - std::auto_ptr<Private> d_; - /** @endcond Implementation */ - private: - /* Disable copy c'tor, assignment operator */ - Test(const Test&); - Test& operator=(const Test&); -}; - -} // namespace testing -} // namespace xorg - -#endif // XORG_GTEST_TEST_H_ diff --git a/include/xorg/gtest/xorg-gtest.h b/include/xorg/gtest/xorg-gtest.h index 5568185..deb2ad7 100644 --- a/include/xorg/gtest/xorg-gtest.h +++ b/include/xorg/gtest/xorg-gtest.h @@ -25,10 +25,10 @@ * ******************************************************************************/ -#include "environment.h" -#include "process.h" -#include "test.h" +#include "xorg-gtest_environment.h" +#include "xorg-gtest_process.h" +#include "xorg-gtest_test.h" #ifdef HAVE_EVEMU -#include "evemu/device.h" +#include "evemu/xorg-gtest_device.h" #endif diff --git a/include/xorg/gtest/xorg-gtest_environment.h b/include/xorg/gtest/xorg-gtest_environment.h new file mode 100644 index 0000000..e113cd7 --- /dev/null +++ b/include/xorg/gtest/xorg-gtest_environment.h @@ -0,0 +1,184 @@ +/******************************************************************************* + * + * X testing environment - Google Test environment feat. dummy x server + * + * Copyright (C) 2011, 2012 Canonical Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ******************************************************************************/ + +#ifndef XORG_GTEST_ENVIRONMENT_H +#define XORG_GTEST_ENVIRONMENT_H + +#include <memory> +#include <string> + +#include <gtest/gtest.h> + +namespace xorg { +namespace testing { + +/** + * \mainpage X.org Google %Test Framework + * + * Xorg-gtest makes it easy to write test cases + * for a dummy headless X.org server. It can also run tests + * using a running X11 server. + * + */ + +/** + * @class Environment environment.h xorg/gtest/environment.h + * + * Global Google %Test environment providing a dummy X server. + * + * Starts up a dummy X server for testing purposes. + * Either associate the environment manually + * with the overall testing framework like + * @code + * xorg::testing::Environment* environment = new xorg::testing::Environment; + * environment->set_server("Xorg"); + * environment->set_display(133); + * environment->set_conf_file("conf/dummy.conf"); + * environment->set_log_file("/tmp/MyDummyXorg.log"); + * testing::AddGlobalTestEnvironment(environment); + * @endcode + * or link to libxorg-gtest_main. + */ +class Environment : public ::testing::Environment { + public: + /** + * Constructs an object to provide a global X server dummy environment. + */ + Environment(); + + virtual ~Environment(); + + /** + * Sets the path where the server log file will be created. + * + * The path will be passed on to the server via the command line argument + * "-logfile". The default value is "/tmp/Xorg.GTest.log". + * + * @param path_to_log_file Path to server logfile. + */ + void set_log_file(const std::string& path_to_log_file); + + /** + * Returns the path where the server log file will be created. + * + * @return Path to server logfile. + */ + const std::string& log_file() const; + + /** + * Sets the path to the desired server configuration file. + * + * The path will be passed on to the server via the command line argument + * "-config". The default value is "[datadir]/xorg/gtest/dummy.conf". + * + * @param path_conf_file Path to a Xorg X server .conf file. + */ + void set_conf_file(const std::string& path_conf_file); + + /** + * Returns the path of the server configuration file to be used. + * + * @return File path of the server configuration currently set + */ + const std::string& conf_file() const; + + /** + * Sets the path to the server executable + * + * The default value is "Xorg". + * + * @param path_to_server Path to an X.org server executable + */ + void set_server(const std::string& path_to_server); + + /** + * Returns the path of the server executable to be used. + * + * @return Path to server executable. + */ + const std::string& server() const; + + /** + * Sets the display number that the server will use. + * + * The display number will be passed on to the server via the command line. + * The default value is 133. + * + * @param diplay_num A display number. + */ + void set_display(int display_num); + + /** + * Returns the display number of the server instance. + * + * @return Display number of the server. + */ + int display() const; + + /** + * Kill the dummy Xorg server with SIGKILL. + */ + void Kill(); + + protected: + /** + * Starts the dummy X server. + * + * Reimplemented from ::testing::Environment. See Google %Test documentation + * for details. + * + * @throws std::runtime_error if a dummy X server cannot be started. + * + * @post If successful: subsequent connections to the dummy X server succeed. + * @post If successful: %Environment variable DISPLAY contains the + * display port for connecting to the dummy X server. + */ + virtual void SetUp(); + + /** + * Stops the dummy X server. + * + * Reimplemented from ::testing::Environment. See Google %Test documentation + * for details. + * + * @post Dummy X server stopped. + */ + virtual void TearDown(); + + private: + struct Private; + std::auto_ptr<Private> d_; + + /* Disable copy constructor & assignment operator */ + Environment(const Environment&); + Environment& operator=(const Environment&); +}; + +} // namespace testing +} // namespace xorg + +#endif // XORG_GTEST_ENVIRONMENT_H diff --git a/include/xorg/gtest/xorg-gtest_process.h b/include/xorg/gtest/xorg-gtest_process.h new file mode 100644 index 0000000..d7e1143 --- /dev/null +++ b/include/xorg/gtest/xorg-gtest_process.h @@ -0,0 +1,166 @@ +/******************************************************************************* + * + * X testing environment - Google Test environment feat. dummy x server + * + * Copyright (C) 2011, 2012 Canonical Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ******************************************************************************/ + +#ifndef XORG_GTEST_PROCESS_H +#define XORG_GTEST_PROCESS_H + +#include <stdarg.h> + +#include <memory> +#include <string> + +namespace xorg { +namespace testing { + +/** + * @class Process test.h xorg/gtest/process.h + * + * Class that abstracts child process creation and termination. + * + * This class allows for forking, running and terminating child processes. + * In addition, manipulation of the child process' environment is supported. + * For example, starting an X server instance on display port 133 as a child + * process can be realized with the following code snippet: + * @code + * Process xorgServer; + * try { + * xorgServer.Start("Xorg", "Xorg", ":133"); + * } catch (const std::runtime_error&e) { + * std::cerr << "Problem starting the X server: " << e.what() << std::endl; + * } + * ... + * if (!xorgServer.Terminate()) { + * std::cerr << "Problem terminating server ... killing now ..." << std::endl; + * if (!xorgServer.Kill()) + * std::cerr << "Problem killing server" << std::endl; + * } + * @endcode + */ +class Process { + public: + /** + * Helper function to adjust the environment of the current process. + * + * @param [in] name Name of the environment variable. + * @param [in] value Value of the environment variable. + * @param [in] overwrite Whether to overwrite the value of existing env + * variables. + * + * @throws std::runtime_error if adjusting the environment does not succeed. + */ + static void SetEnv(const std::string& name, const std::string& value, + bool overwrite); + + /** + * Helper function to query the environment of the current process. + * + * @param [in] name The name of the environment variable. + * @param [out] exists If not NULL, the variable will be set to true if the + * environment variable exists and to false otherwise. + * @returns The value of the environment variable, or an empty string. + */ + static std::string GetEnv(const std::string& name, bool* exists = NULL); + + /** + * Creates a child-process that is in a terminated state. + */ + Process(); + + /** + * Starts a program as a child process. + * + * See 'man execvp' for further information on the variadic argument list. + * + * @param program The program to start. + * @param args Variadic list of arguments passed to the program. + * + * @throws std::runtime_error on failure. + * + * @post If successful: Child process forked and program started. + * @post If successful: Subsequent calls to Pid() return child process pid. + */ + void Start(const std::string& program, va_list args); + + /** + * Starts a program as a child process. + * + * Takes a variadic list of arguments passed to the program. + * See 'man execvp' for further information on the variadic argument list. + * + * @param program The program to start. + * + * @throws std::runtime_error on failure. + * + * @post If successful: Child process forked and program started. + * @post If successful: Subsequent calls to Pid() return child process pid. + */ + void Start(const std::string& program, ...); + + /** + * Terminates (SIGTERM) this child process. + * + * @throws std::runtime_error if child tries to terminate itself. + * + * @returns true if termination succeeded, false otherwise. + * + * @post If successful: Child process terminated. + * @post If successful: Subsequent calls to Pid() return -1. + */ + bool Terminate(); + + /** + * Kills (SIGKILL) this child process. + * + * @throws std::runtime_error if child tries to kill itself. + * + * @returns true if kill succeeded, false otherwise. + * + * @post If successful: Child process killed. + * @post If successful: Subsequent calls to Pid() return -1. + */ + bool Kill(); + + /** + * Accesses the pid of the child process. + * + * @returns The pid of the child process or -1. + */ + pid_t Pid() const; + + private: + struct Private; + std::auto_ptr<Private> d_; + + /* Disable copy constructor, assignment operator */ + Process(const Process&); + Process& operator=(const Process&); +}; + +} // testing +} // xorg + +#endif // XORG_GTEST_PROCESS_H diff --git a/include/xorg/gtest/xorg-gtest_test.h b/include/xorg/gtest/xorg-gtest_test.h new file mode 100644 index 0000000..093890b --- /dev/null +++ b/include/xorg/gtest/xorg-gtest_test.h @@ -0,0 +1,104 @@ +/******************************************************************************* + * + * X testing environment - Google Test environment feat. dummy x server + * + * Copyright (C) 2011, 2012 Canonical Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ******************************************************************************/ + +#ifndef XORG_GTEST_TEST_H_ +#define XORG_GTEST_TEST_H_ + +#include <memory> + +#include <gtest/gtest.h> +#include <X11/Xlib.h> + +namespace xorg { +namespace testing { + +/** + * @class Test test.h xorg/gtest/test.h + * + * Google %Test fixture providing an Xlib connection to an X11 server. + * + * Sets up and tears down an XLib connection to an X11 server. + * Rely on Google %Test's TEST_F macro to use this fixture for your + * own tests or subclass it and override the SetUp and TearDown + * methods. + * + * @remark The display port is read from the environment variable DISPLAY. + */ +class Test : public ::testing::Test { + public: + + Test(); + + virtual ~Test(); + + protected: + /** + * Tries to connect to an X server instance. + * + * Fails if no X server is running. Updates the display object. + * Reimplemented from ::testing::Test. See Google %Test documentation for + * details. + * + * @post Subsequent calls to Display() return a valid pointer or NULL if an error occured. + * + * @throws std::runtime_error if no X server is running. + */ + virtual void SetUp(); + + /** + * Closes the display. + * + * Reimplemented from ::testing::Test. See Google %Test documentation for + * details. + * + * @post Subsequent calls to Display() return NULL. + */ + virtual void TearDown(); + + /** + * Accesses the display representing an Xlib connection. + * + * Accessible by subclasses and test cases relying on this fixture. + * + * @returns Pointer to a display or NULL. + */ + ::Display* Display() const; + + /** @cond Implementation */ + struct Private; + std::auto_ptr<Private> d_; + /** @endcond Implementation */ + private: + /* Disable copy c'tor, assignment operator */ + Test(const Test&); + Test& operator=(const Test&); +}; + +} // namespace testing +} // namespace xorg + +#endif // XORG_GTEST_TEST_H_ -- 1.7.9.5 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
