From 7ea6b9da31a8911016178ef7d7c07422f814ae42 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 27 Oct 2017 23:37:45 +0200 Subject: [PATCH] Added Seasocks packaging --- Seasocks/conanfile.py | 36 +++++++++++++ Seasocks/test_package/CMakeLists.txt | 16 ++++++ Seasocks/test_package/ServerTests.cpp | 78 +++++++++++++++++++++++++++ Seasocks/test_package/conanfile.py | 22 ++++++++ 4 files changed, 152 insertions(+) create mode 100644 Seasocks/conanfile.py create mode 100644 Seasocks/test_package/CMakeLists.txt create mode 100644 Seasocks/test_package/ServerTests.cpp create mode 100644 Seasocks/test_package/conanfile.py diff --git a/Seasocks/conanfile.py b/Seasocks/conanfile.py new file mode 100644 index 0000000..18b2759 --- /dev/null +++ b/Seasocks/conanfile.py @@ -0,0 +1,36 @@ +from conans import ConanFile, CMake, tools + + +class SeasocksConan(ConanFile): + name = "Seasocks" + version = "1.3.2" + license = "BSD 2-clause \"Simplified\" License" + url = "https://github.com/Minres/conan-recipes/blob/master/Seasocks" + description = "Simple, small, C++ embeddable webserver with WebSockets support" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False]} + default_options = "shared=True" + generators = "cmake" + exports_sources = "src/main/c/*" + reuires = "zlib/1.2.11@conan/stable" + + + def source(self): + self.run("git clone https://github.com/mattgodbolt/seasocks.git") + self.run("cd seasocks && git checkout tags/v1.3.2") + # This small hack might be useful to guarantee proper /MT /MD linkage in MSVC + # if the packaged project doesn't have variables to set it properly + tools.replace_in_file("seasocks/CMakeLists.txt", "project(Seasocks VERSION 1.3.2)", '''project(Seasocks VERSION 1.3.2) +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup()''') + + def build(self): + cmake = CMake(self) + self.run('cmake seasocks %s' % cmake.command_line) + self.run("cmake --build . --target install %s" % cmake.build_config) + + #def package(self): + # nothing to do here now + + def package_info(self): + self.cpp_info.libs = ["seasocks"] diff --git a/Seasocks/test_package/CMakeLists.txt b/Seasocks/test_package/CMakeLists.txt new file mode 100644 index 0000000..d7aee5e --- /dev/null +++ b/Seasocks/test_package/CMakeLists.txt @@ -0,0 +1,16 @@ +project(PackageTest CXX) +cmake_minimum_required(VERSION 2.8.12) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +find_package(Threads) + +add_executable(ServerTests ServerTests.cpp) +target_link_libraries(ServerTests ${CONAN_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + +# CTest is a testing tool that can be used to test your project. +# enable_testing() +# add_test(NAME example +# WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin +# COMMAND example) diff --git a/Seasocks/test_package/ServerTests.cpp b/Seasocks/test_package/ServerTests.cpp new file mode 100644 index 0000000..29f2045 --- /dev/null +++ b/Seasocks/test_package/ServerTests.cpp @@ -0,0 +1,78 @@ +// Copyright (c) 2013-2017, Matt Godbolt +// All rights reserved. +// +// 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. +// +// 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 HOLDER 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 "seasocks/Server.h" +#include "seasocks/Connection.h" +#include "seasocks/IgnoringLogger.h" + +#define CATCH_CONFIG_MAIN +#include "catch.hpp" + +#include +#include + +using namespace seasocks; + + +TEST_CASE("Server tests", "[ServerTests]") { + auto logger = std::make_shared(); + Server server(logger); + REQUIRE(server.startListening(0)); + std::thread seasocksThread([&]{ + REQUIRE(server.loop()); + }); + + std::atomic test(0); + SECTION("execute should work") { + server.execute([&]{ + CHECK(test == 0); + test++; + }); + for (int i = 0; i < 1000 * 1000 * 1000; ++i) { + if (test) break; + } + CHECK(test == 1); + } + + SECTION("many executes") { + std::atomic latch(false); + for (auto i = 0; i < 100; ++i) { + for (auto j = 0; j < 100; ++j) { + server.execute([&] { test++; }); + } + usleep(10); + } + server.execute([&] { latch = true; }); + for (int i = 0; i < 1000; ++i) { + usleep(1000); + if (latch) break; + } + CHECK(latch == 1); + CHECK(test == 10000); + } + + server.terminate(); + seasocksThread.join(); +} diff --git a/Seasocks/test_package/conanfile.py b/Seasocks/test_package/conanfile.py new file mode 100644 index 0000000..8463f53 --- /dev/null +++ b/Seasocks/test_package/conanfile.py @@ -0,0 +1,22 @@ +from conans import ConanFile, CMake +import os + +class SeasocksTestConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "cmake" + build_requires = "Catch/1.9.2@uilianries/stable" + + def build(self): + cmake = CMake(self) + # Current dir is "test_package/build/" and CMakeLists.txt is in "test_package" + cmake.configure(source_dir=self.conanfile_directory, build_dir="./") + cmake.build() + + def imports(self): + self.copy("*.dll", dst="bin", src="bin") + self.copy("*.dylib*", dst="bin", src="lib") + self.copy('*.so*', dst='bin', src='lib') + + def test(self): + os.chdir("bin") + self.run(".%sServerTests" % os.sep)