blob: b77c79b86ead601e91083d39fd258605f50524f2 [file] [log] [blame] [edit]
/*
* Copyright © 2017 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authored by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
*/
#include <gtest/gtest.h>
#include <iostream>
#include <memory>
#include <dlfcn.h>
#include "xfail_supporting_test_listener.h"
#include "shared_library.h"
#include "wlcs/display_server.h"
#include "helpers.h"
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
if (argc < 2 || !argv[1] || std::string{"--help"} == argv[1])
{
std::cerr
<< "WayLand Conformance Suite test runner" << std::endl
<< "Usage: " << argv[0] << " COMPOSITOR_INTEGRATION_MODULE [GTEST OPTIONS]... [COMPOSITOR_OPTIONS]..." << std::endl;
return 1;
}
auto const integration_filename = argv[1];
// Shuffle the integration module argument out of argv
for (auto i = 1 ; i < (argc - 1) ; ++i)
{
argv[i] = argv[i + 1];
}
wlcs::helpers::set_command_line(argc - 1, const_cast<char const**>(argv));
std::shared_ptr<wlcs::SharedLibrary> dso;
try
{
dso = std::make_shared<wlcs::SharedLibrary>(integration_filename);
}
catch (std::exception const& err)
{
std::cerr
<< "Failed to load compositor integration module " << integration_filename << ": " << err.what() << std::endl;
return 1;
}
std::shared_ptr<WlcsServerIntegration const> entry_point;
try
{
entry_point = std::shared_ptr<WlcsServerIntegration const>{
dso,
dso->load_function<WlcsServerIntegration const*>("wlcs_server_integration")
};
}
catch (std::exception const& err)
{
std::cerr
<< "Failed to load compositor entry point: " << err.what() << std::endl;
return 1;
}
wlcs::helpers::set_entry_point(entry_point);
auto& listeners = ::testing::UnitTest::GetInstance()->listeners();
auto wrapping_listener = new testing::XFailSupportingTestListenerWrapper{
std::unique_ptr<::testing::TestEventListener>{
listeners.Release(listeners.default_result_printer())}};
listeners.Append(wrapping_listener);
/* (void)! is apparently the magical incantation required to get GCC to
* *actually* silently ignore the return value of a function declared with
* __attribute__(("warn_unused_result"))
* cf: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
*/
(void)!RUN_ALL_TESTS();
if (wrapping_listener->failed())
{
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}