public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/xeus] epel10: Backport fixes to messages to match schemas
@ 2026-07-11 22:28 Elliott Sales de Andrade
0 siblings, 0 replies; only message in thread
From: Elliott Sales de Andrade @ 2026-07-11 22:28 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/xeus
Branch : epel10
Commit : bf8ade803c5a8670fdd7817a009bc3071b0d170a
Author : Elliott Sales de Andrade <quantum.analyst@gmail.com>
Date : 2022-10-17T05:36:22-04:00
Stats : +1308/-1 in 4 file(s)
URL : https://src.fedoraproject.org/rpms/xeus/c/bf8ade803c5a8670fdd7817a009bc3071b0d170a?branch=epel10
Log:
Backport fixes to messages to match schemas
---
diff --git a/0001-switched-from-gtest-to-doctest-292.patch b/0001-switched-from-gtest-to-doctest-292.patch
new file mode 100644
index 0000000..f6aecac
--- /dev/null
+++ b/0001-switched-from-gtest-to-doctest-292.patch
@@ -0,0 +1,523 @@
+From 8964ef30354f59c19ed5f723c579350eb249c0ba Mon Sep 17 00:00:00 2001
+From: Thorsten Beier <derthorstenbeier@gmail.com>
+Date: Tue, 21 Sep 2021 13:33:39 +0200
+Subject: [PATCH 1/3] switched from gtest to doctest (#292)
+
+Switchted to doctest
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst@gmail.com>
+---
+ .appveyor.yml | 4 +-
+ .azure-pipelines/unix-build.yml | 2 +-
+ CMakeLists.txt | 3 +-
+ environment-dev.yml | 1 +
+ test/CMakeLists.txt | 55 +---------
+ test/copyGTest.cmake.in | 23 ----
+ test/downloadGTest.cmake.in | 24 -----
+ test/test_main.cpp | 2 +
+ test/test_unit_kernel.cpp | 36 ++++---
+ test/test_xin_memory_history_manager.cpp | 130 ++++++++++++-----------
+ 10 files changed, 98 insertions(+), 182 deletions(-)
+ delete mode 100644 test/copyGTest.cmake.in
+ delete mode 100644 test/downloadGTest.cmake.in
+ create mode 100644 test/test_main.cpp
+
+diff --git a/.appveyor.yml b/.appveyor.yml
+index e6596e8..a4d8393 100644
+--- a/.appveyor.yml
++++ b/.appveyor.yml
+@@ -29,12 +29,12 @@ install:
+ - conda update -q conda
+ - conda info -a
+ - conda install mamba -c conda-forge
+- - mamba install cmake cppzmq=4.7.1 zeromq=4.3.2 xtl=0.7 nlohmann_json OpenSSL=1 -c conda-forge
++ - mamba install cmake cppzmq=4.7.1 zeromq=4.3.2 xtl=0.7 nlohmann_json OpenSSL=1 doctest -c conda-forge
+ - mamba install pytest jupyter_kernel_test=0.3.0 -c conda-forge
+ # Build
+ - mkdir build
+ - cd build
+- - cmake -G "NMake Makefiles" -D CMAKE_INSTALL_PREFIX=%MINICONDA%\\LIBRARY -D XEUS_DOWNLOAD_GTEST=ON -Dgtest_force_shared_crt=ON ..
++ - cmake -G "NMake Makefiles" -D CMAKE_INSTALL_PREFIX=%MINICONDA%\\LIBRARY -D XEUS_BUILD_TESTS=ON ..
+ - nmake install
+ # Build example
+ - cd ..\example
+diff --git a/.azure-pipelines/unix-build.yml b/.azure-pipelines/unix-build.yml
+index 733972b..cfe556b 100644
+--- a/.azure-pipelines/unix-build.yml
++++ b/.azure-pipelines/unix-build.yml
+@@ -25,7 +25,7 @@ steps:
+ if [[ $(xeus_build_shared_lib) == '0' ]]; then
+ CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DXEUS_BUILD_SHARED_LIBS=OFF";
+ fi
+- cmake -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DXEUS_DOWNLOAD_GTEST=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX $CMAKE_EXTRA_ARGS $(Build.SourcesDirectory)
++ cmake -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DXEUS_BUILD_TESTS=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX $CMAKE_EXTRA_ARGS $(Build.SourcesDirectory)
+ displayName: Configure xeus
+ workingDirectory: $(Build.BinariesDirectory)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 41e6692..5cd2aab 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -55,7 +55,6 @@ option(XEUS_STATIC_DEPENDENCIES "link statically with xeus dependencies" OFF)
+
+ # Test options
+ option(XEUS_BUILD_TESTS "xeus test suite" OFF)
+-option(XEUS_DOWNLOAD_GTEST "build gtest from downloaded sources" OFF)
+
+ # Static build configuration
+ # ==========================
+@@ -352,7 +351,7 @@ endif ()
+
+ include(CTest)
+
+-if(XEUS_DOWNLOAD_GTEST OR GTEST_SRC_DIR OR XEUS_BUILD_TESTS)
++if(XEUS_BUILD_TESTS)
+ set(BUILD_TESTING ON)
+ message(STATUS "tests enabled")
+ else ()
+diff --git a/environment-dev.yml b/environment-dev.yml
+index a6c688a..d109add 100644
+--- a/environment-dev.yml
++++ b/environment-dev.yml
+@@ -14,5 +14,6 @@ dependencies:
+ - libopenssl-static=1
+ - nlohmann_json
+ # Test dependencies
++ - doctest >= 2.4.6
+ - pytest
+ - jupyter_kernel_test=0.3.0
+diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
+index 61aaade..b24a3e5 100644
+--- a/test/CMakeLists.txt
++++ b/test/CMakeLists.txt
+@@ -48,44 +48,15 @@ if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
+ set(CMAKE_EXE_LINKER_FLAGS /MANIFEST:NO)
+ endif()
+
+-if(XEUS_DOWNLOAD_GTEST OR GTEST_SRC_DIR)
+- if(XEUS_DOWNLOAD_GTEST)
+- # Download and unpack googletest at configure time
+- configure_file(downloadGTest.cmake.in googletest-download/CMakeLists.txt)
+- else()
+- # Copy local source of googletest at configure time
+- configure_file(copyGTest.cmake.in googletest-download/CMakeLists.txt)
+- endif()
+- execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
+- RESULT_VARIABLE result
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
+- if(result)
+- message(FATAL_ERROR "CMake step for googletest failed: ${result}")
+- endif()
+- execute_process(COMMAND ${CMAKE_COMMAND} --build .
+- RESULT_VARIABLE result
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
+- if(result)
+- message(FATAL_ERROR "Build step for googletest failed: ${result}")
+- endif()
+
+- # Add googletest directly to our build. This defines
+- # the gtest and gtest_main targets.
+- add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
+- ${CMAKE_CURRENT_BINARY_DIR}/googletest-build EXCLUDE_FROM_ALL)
++find_package(doctest REQUIRED)
+
+- set(GTEST_INCLUDE_DIRS "${gtest_SOURCE_DIR}/include")
+- set(GTEST_BOTH_LIBRARIES gtest_main gtest)
+-else()
+- find_package(GTest REQUIRED)
+-endif()
+
+ find_package(Threads)
+
+-find_program(PYTEST
+- NAMES pytest-3 pytest py.test-3 py.test)
++find_program(PYTEST
++ NAMES pytest-3 pytest py.test-3 py.test REQUIRED)
+
+-include_directories(${GTEST_INCLUDE_DIRS})
+
+ set(XEUS_TESTS
+ test_xin_memory_history_manager.cpp
+@@ -113,27 +84,11 @@ endif ()
+ foreach(filename IN LISTS XEUS_TESTS)
+ get_filename_component(targetname ${filename} NAME_WE)
+
+- add_executable(${targetname} ${filename})
+- target_link_libraries(${targetname} PRIVATE ${xeus_TARGET} ${GTEST_BOTH_LIBRARIES} Threads::Threads ${nlohmann_json_TARGET})
+-
++ add_executable(${targetname} test_main.cpp ${filename})
++ target_link_libraries(${targetname} PRIVATE ${xeus_TARGET} doctest::doctest Threads::Threads ${nlohmann_json_TARGET})
+ add_test(NAME ${targetname} COMMAND ${targetname})
+ endforeach()
+
+-if(XEUS_DOWNLOAD_GTEST OR GTEST_SRC_DIR)
+- # https://github.com/jupyter-xeus/xeus/pull/126
+- # This should really just be post gtest and gtest_main targets, but CMake
+- # won't allow us to do that. So do it after the last test (which depends on
+- # those anyway.)
+- if (XEUS_BUILD_SHARED_LIBS)
+- add_custom_command(
+- TARGET ${targetname} POST_BUILD
+- COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:gtest>" "${CMAKE_CURRENT_BINARY_DIR}/")
+-
+- add_custom_command(
+- TARGET ${targetname} POST_BUILD
+- COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:gtest_main>" "${CMAKE_CURRENT_BINARY_DIR}/")
+- endif ()
+-endif()
+
+ # Test_kernel tests
+ # =================
+diff --git a/test/copyGTest.cmake.in b/test/copyGTest.cmake.in
+deleted file mode 100644
+index 1e5d3ed..0000000
+--- a/test/copyGTest.cmake.in
++++ /dev/null
+@@ -1,23 +0,0 @@
+-############################################################################
+-# Copyright (c) 2016, Johan Mabille, Sylvain Corlay and Wolf Vollprecht #
+-# #
+-# Distributed under the terms of the BSD 3-Clause License. #
+-# #
+-# The full license is in the file LICENSE, distributed with this software. #
+-############################################################################
+-
+-cmake_minimum_required(VERSION 2.8.2)
+-
+-project(googletest-download NONE)
+-
+-include(ExternalProject)
+-ExternalProject_Add(googletest
+- URL "${GTEST_SRC_DIR}"
+- SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
+- BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
+- CONFIGURE_COMMAND ""
+- BUILD_COMMAND ""
+- INSTALL_COMMAND ""
+- TEST_COMMAND ""
+-)
+-
+diff --git a/test/downloadGTest.cmake.in b/test/downloadGTest.cmake.in
+deleted file mode 100644
+index 852d43c..0000000
+--- a/test/downloadGTest.cmake.in
++++ /dev/null
+@@ -1,24 +0,0 @@
+-############################################################################
+-# Copyright (c) 2016, Johan Mabille, Sylvain Corlay and Wolf Vollprecht #
+-# #
+-# Distributed under the terms of the BSD 3-Clause License. #
+-# #
+-# The full license is in the file LICENSE, distributed with this software. #
+-############################################################################
+-
+-cmake_minimum_required(VERSION 2.8.2)
+-
+-project(googletest-download NONE)
+-
+-include(ExternalProject)
+-ExternalProject_Add(googletest
+- GIT_REPOSITORY https://github.com/google/googletest.git
+- GIT_TAG release-1.10.0
+- SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
+- BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
+- CONFIGURE_COMMAND ""
+- BUILD_COMMAND ""
+- INSTALL_COMMAND ""
+- TEST_COMMAND ""
+-)
+-
+diff --git a/test/test_main.cpp b/test/test_main.cpp
+new file mode 100644
+index 0000000..84684c0
+--- /dev/null
++++ b/test/test_main.cpp
+@@ -0,0 +1,2 @@
++#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
++#include "doctest/doctest.h"
+\ No newline at end of file
+diff --git a/test/test_unit_kernel.cpp b/test/test_unit_kernel.cpp
+index 74b9f07..ee8709b 100644
+--- a/test/test_unit_kernel.cpp
++++ b/test/test_unit_kernel.cpp
+@@ -6,9 +6,10 @@
+ * The full license is in the file LICENSE, distributed with this software. *
+ ****************************************************************************/
+
+-#include "gtest/gtest.h"
++#include "doctest/doctest.h"
+
+ #include <string>
++#include <iostream>
+
+ #include "nlohmann/json.hpp"
+
+@@ -20,48 +21,51 @@ namespace nl = nlohmann;
+
+ namespace xeus
+ {
+- TEST(kernel, get_username)
++ TEST_SUITE("kernel") {
++
++ TEST_CASE("get_username")
+ {
+ std::string username;
+ username = get_user_name();
+- EXPECT_NE(username, "unspecified user");
++ REQUIRE_NE(username, "unspecified user");
+ }
+
+- TEST(kernel, find_free_port)
++ TEST_CASE("find_free_port")
+ {
+ std::string port = find_free_port();
+- EXPECT_NE(port, "");
+- EXPECT_EQ(port.length(), std::size_t(5));
++ REQUIRE_NE(port, "");
++ REQUIRE_EQ(port.length(), std::size_t(5));
+ }
+
+- TEST(kernel, temp_directory_path)
++ TEST_CASE("temp_directory_path")
+ {
+ std::string path = get_temp_directory_path();
+ std::cout << "Temporary directory path: " << path << std::endl;
+- EXPECT_NE(path, "");
+- EXPECT_NE(path.back(), '/');
+- EXPECT_NE(path.back(), '\\');
++ REQUIRE_NE(path, "");
++ REQUIRE_NE(path.back(), '/');
++ REQUIRE_NE(path.back(), '\\');
+ }
+
+- TEST(kernel, create_directory)
++ TEST_CASE("create_directory")
+ {
+ std::string temp_path = get_temp_directory_path();
+ std::string path = temp_path + "/intermediate/logs";
+ bool res = create_directory(path);
+- EXPECT_TRUE(res);
++ REQUIRE_UNARY(res);
+ }
+
+- TEST(kernel, get_current_pid)
++ TEST_CASE("get_current_pid")
+ {
+ int pid = get_current_pid();
+- EXPECT_NE(pid, -1);
++ REQUIRE_NE(pid, -1);
+ }
+
+- TEST(kernel, get_tmp_hash_seed)
++ TEST_CASE("get_tmp_hash_seed")
+ {
+ size_t hs = get_tmp_hash_seed();
+ size_t expected = static_cast<std::size_t>(0xc70f6907UL);
+- EXPECT_EQ(hs, expected);
++ REQUIRE_EQ(hs, expected);
++ }
+ }
+ }
+
+diff --git a/test/test_xin_memory_history_manager.cpp b/test/test_xin_memory_history_manager.cpp
+index df2275a..a204ca1 100644
+--- a/test/test_xin_memory_history_manager.cpp
++++ b/test/test_xin_memory_history_manager.cpp
+@@ -6,7 +6,7 @@
+ * The full license is in the file LICENSE, distributed with this software. *
+ ****************************************************************************/
+
+-#include "gtest/gtest.h"
++#include "doctest/doctest.h"
+
+ #include <vector>
+ #include <array>
+@@ -23,7 +23,8 @@ namespace xeus
+ using history_manager_ptr = std::unique_ptr<xhistory_manager>;
+ using history_type = std::vector<std::array<std::string, 3>>;
+
+- TEST(xin_memory_history_manager, get_tail)
++ TEST_SUITE("xin_memory_history_manager"){
++ TEST_CASE("get_tail")
+ {
+ history_manager_ptr hist = xeus::make_in_memory_history_manager();
+ hist->store_inputs(0, 1, "print(3)");
+@@ -32,29 +33,29 @@ namespace xeus
+ hist->store_inputs(0, 4, "a");
+
+ nl::json tail1 = hist->get_tail(1000, true, false);
+- ASSERT_EQ(tail1["status"], "ok");
++ REQUIRE_EQ(tail1["status"], "ok");
+ auto history1 = tail1["history"].get<history_type>();
+- ASSERT_EQ(history1.size(), std::size_t(4));
+- ASSERT_EQ(history1[0][1], "1");
+- ASSERT_EQ(history1[0][2], "print(3)");
+- ASSERT_EQ(history1[1][1], "2");
+- ASSERT_EQ(history1[1][2], "a = 3");
+- ASSERT_EQ(history1[2][1], "3");
+- ASSERT_EQ(history1[2][2], "print(a)");
+- ASSERT_EQ(history1[3][1], "4");
+- ASSERT_EQ(history1[3][2], "a");
++ REQUIRE_EQ(history1.size(), std::size_t(4));
++ REQUIRE_EQ(history1[0][1], "1");
++ REQUIRE_EQ(history1[0][2], "print(3)");
++ REQUIRE_EQ(history1[1][1], "2");
++ REQUIRE_EQ(history1[1][2], "a = 3");
++ REQUIRE_EQ(history1[2][1], "3");
++ REQUIRE_EQ(history1[2][2], "print(a)");
++ REQUIRE_EQ(history1[3][1], "4");
++ REQUIRE_EQ(history1[3][2], "a");
+
+ nl::json tail2 = hist->get_tail(2, true, false);
+- ASSERT_EQ(tail2["status"], "ok");
++ REQUIRE_EQ(tail2["status"], "ok");
+ auto history2 = tail2["history"].get<history_type>();
+- ASSERT_EQ(history2.size(), std::size_t(2));
+- ASSERT_EQ(history2[0][1], "3");
+- ASSERT_EQ(history2[0][2], "print(a)");
+- ASSERT_EQ(history2[1][1], "4");
+- ASSERT_EQ(history2[1][2], "a");
++ REQUIRE_EQ(history2.size(), std::size_t(2));
++ REQUIRE_EQ(history2[0][1], "3");
++ REQUIRE_EQ(history2[0][2], "print(a)");
++ REQUIRE_EQ(history2[1][1], "4");
++ REQUIRE_EQ(history2[1][2], "a");
+ }
+
+- TEST(xin_memory_history_manager, get_range)
++ TEST_CASE("get_range")
+ {
+ history_manager_ptr hist = xeus::make_in_memory_history_manager();
+ hist->store_inputs(0, 1, "print(3)");
+@@ -63,26 +64,26 @@ namespace xeus
+ hist->store_inputs(0, 4, "a");
+
+ nl::json range1 = hist->get_range(0, 1, 2, true, false);
+- ASSERT_EQ(range1["status"], "ok");
++ REQUIRE_EQ(range1["status"], "ok");
+ auto history1 = range1["history"].get<history_type>();
+- ASSERT_EQ(history1.size(), std::size_t(1));
+- ASSERT_EQ(history1[0][1], "2");
+- ASSERT_EQ(history1[0][2], "a = 3");
++ REQUIRE_EQ(history1.size(), std::size_t(1));
++ REQUIRE_EQ(history1[0][1], "2");
++ REQUIRE_EQ(history1[0][2], "a = 3");
+
+ nl::json range2 = hist->get_range(0, 1, 3, true, false);
+- ASSERT_EQ(range2["status"], "ok");
++ REQUIRE_EQ(range2["status"], "ok");
+ auto history2 = range2["history"].get<history_type>();
+- ASSERT_EQ(history2.size(), std::size_t(2));
+- ASSERT_EQ(history2[0][1], "2");
+- ASSERT_EQ(history2[0][2], "a = 3");
+- ASSERT_EQ(history2[1][1], "3");
+- ASSERT_EQ(history2[1][2], "print(a)");
++ REQUIRE_EQ(history2.size(), std::size_t(2));
++ REQUIRE_EQ(history2[0][1], "2");
++ REQUIRE_EQ(history2[0][2], "a = 3");
++ REQUIRE_EQ(history2[1][1], "3");
++ REQUIRE_EQ(history2[1][2], "print(a)");
+
+ nl::json range3 = hist->get_range(0, 1000, 2, true, false);
+- ASSERT_EQ(range3["status"], "error");
++ REQUIRE_EQ(range3["status"], "error");
+ }
+
+- TEST(xin_memory_history_manager, search)
++ TEST_CASE("search")
+ {
+ history_manager_ptr hist = xeus::make_in_memory_history_manager();
+ hist->store_inputs(0, 1, "print(36)");
+@@ -91,55 +92,56 @@ namespace xeus
+ hist->store_inputs(0, 4, "a");
+
+ nl::json search1 = hist->search("print*", true, false, 10, false);
+- ASSERT_EQ(search1["status"], "ok");
++ REQUIRE_EQ(search1["status"], "ok");
+ auto history1 = search1["history"].get<history_type>();
+- ASSERT_EQ(history1.size(), std::size_t(2));
+- ASSERT_EQ(history1[0][1], "1");
+- ASSERT_EQ(history1[0][2], "print(36)");
+- ASSERT_EQ(history1[1][1], "3");
+- ASSERT_EQ(history1[1][2], "print(a)");
++ REQUIRE_EQ(history1.size(), std::size_t(2));
++ REQUIRE_EQ(history1[0][1], "1");
++ REQUIRE_EQ(history1[0][2], "print(36)");
++ REQUIRE_EQ(history1[1][1], "3");
++ REQUIRE_EQ(history1[1][2], "print(a)");
+
+ nl::json search2 = hist->search("print(*)", true, false, 10, false);
+- ASSERT_EQ(search2["status"], "ok");
++ REQUIRE_EQ(search2["status"], "ok");
+ auto history2 = search2["history"].get<history_type>();
+- ASSERT_EQ(history2.size(), std::size_t(2));
+- ASSERT_EQ(history2[0][1], "1");
+- ASSERT_EQ(history2[0][2], "print(36)");
+- ASSERT_EQ(history2[1][1], "3");
+- ASSERT_EQ(history2[1][2], "print(a)");
++ REQUIRE_EQ(history2.size(), std::size_t(2));
++ REQUIRE_EQ(history2[0][1], "1");
++ REQUIRE_EQ(history2[0][2], "print(36)");
++ REQUIRE_EQ(history2[1][1], "3");
++ REQUIRE_EQ(history2[1][2], "print(a)");
+
+ nl::json search3 = hist->search("print(?)", true, false, 10, false);
+- ASSERT_EQ(search3["status"], "ok");
++ REQUIRE_EQ(search3["status"], "ok");
+ auto history3 = search3["history"].get<history_type>();
+- ASSERT_EQ(history3.size(), std::size_t(1));
+- ASSERT_EQ(history3[0][1], "3");
+- ASSERT_EQ(history3[0][2], "print(a)");
++ REQUIRE_EQ(history3.size(), std::size_t(1));
++ REQUIRE_EQ(history3[0][1], "3");
++ REQUIRE_EQ(history3[0][2], "print(a)");
+
+ nl::json search4 = hist->search("print*", true, false, 1, false);
+- ASSERT_EQ(search4["status"], "ok");
++ REQUIRE_EQ(search4["status"], "ok");
+ auto history4 = search4["history"].get<history_type>();
+- ASSERT_EQ(history4.size(), std::size_t(1));
+- ASSERT_EQ(history4[0][1], "3");
+- ASSERT_EQ(history4[0][2], "print(a)");
++ REQUIRE_EQ(history4.size(), std::size_t(1));
++ REQUIRE_EQ(history4[0][1], "3");
++ REQUIRE_EQ(history4[0][2], "print(a)");
+
+ hist->store_inputs(0, 3, "print(a)");
+ nl::json search5 = hist->search("print*", true, false, 10, false);
+- ASSERT_EQ(search5["status"], "ok");
++ REQUIRE_EQ(search5["status"], "ok");
+ auto history5 = search5["history"].get<history_type>();
+- ASSERT_EQ(history5.size(), std::size_t(3));
+- ASSERT_EQ(history2[0][1], "1");
+- ASSERT_EQ(history2[0][2], "print(36)");
+- ASSERT_EQ(history5[1][1], "3");
+- ASSERT_EQ(history5[1][2], "print(a)");
+- ASSERT_EQ(history5[2][1], "3");
+- ASSERT_EQ(history5[2][2], "print(a)");
++ REQUIRE_EQ(history5.size(), std::size_t(3));
++ REQUIRE_EQ(history2[0][1], "1");
++ REQUIRE_EQ(history2[0][2], "print(36)");
++ REQUIRE_EQ(history5[1][1], "3");
++ REQUIRE_EQ(history5[1][2], "print(a)");
++ REQUIRE_EQ(history5[2][1], "3");
++ REQUIRE_EQ(history5[2][2], "print(a)");
+
+ nl::json search6 = hist->search("print*", true, false, 10, true);
+- ASSERT_EQ(search6["status"], "ok");
++ REQUIRE_EQ(search6["status"], "ok");
+ auto history6 = search6["history"].get<history_type>();
+- ASSERT_EQ(history2[0][1], "1");
+- ASSERT_EQ(history2[0][2], "print(36)");
+- ASSERT_EQ(history5[1][1], "3");
+- ASSERT_EQ(history5[1][2], "print(a)");
++ REQUIRE_EQ(history2[0][1], "1");
++ REQUIRE_EQ(history2[0][2], "print(36)");
++ REQUIRE_EQ(history5[1][1], "3");
++ REQUIRE_EQ(history5[1][2], "print(a)");
++ }
+ }
+ }
+--
+2.36.1
+
diff --git a/0002-Never-delete-context-before-sockets.patch b/0002-Never-delete-context-before-sockets.patch
new file mode 100644
index 0000000..77551e5
--- /dev/null
+++ b/0002-Never-delete-context-before-sockets.patch
@@ -0,0 +1,66 @@
+From 206f54ea54c0a5355adb1531e0d523501aa9c2b9 Mon Sep 17 00:00:00 2001
+From: Johan Mabille <johan.mabille@gmail.com>
+Date: Fri, 24 Sep 2021 00:48:26 +0200
+Subject: [PATCH 2/3] Never delete context before sockets
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst@gmail.com>
+---
+ include/xeus/xkernel.hpp | 5 ++++-
+ src/xkernel.cpp | 4 ++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/include/xeus/xkernel.hpp b/include/xeus/xkernel.hpp
+index 4ef0dd3..d32c07e 100644
+--- a/include/xeus/xkernel.hpp
++++ b/include/xeus/xkernel.hpp
+@@ -84,13 +84,16 @@ namespace xeus
+ std::string m_kernel_id;
+ std::string m_session_id;
+ std::string m_user_name;
++ // The context must be declared before any other
++ // middleware component since it must be destroyed
++ // last
++ context_ptr p_context;
+ interpreter_ptr p_interpreter;
+ history_manager_ptr p_history_manager;
+ logger_ptr p_logger;
+ server_ptr p_server;
+ debugger_builder m_debugger_builder;
+ debugger_ptr p_debugger;
+- context_ptr p_context;
+ kernel_core_ptr p_core;
+ nl::json m_debugger_config;
+ nl::json::error_handler_t m_error_handler;
+diff --git a/src/xkernel.cpp b/src/xkernel.cpp
+index 2bda8af..c8e263a 100644
+--- a/src/xkernel.cpp
++++ b/src/xkernel.cpp
+@@ -82,11 +82,11 @@ namespace xeus
+ nl::json::error_handler_t eh)
+ : m_config(config)
+ , m_user_name(user_name)
++ , p_context(std::move(context))
+ , p_interpreter(std::move(interpreter))
+ , p_history_manager(std::move(history_manager))
+ , p_logger(std::move(logger))
+ , m_debugger_builder(dbuilder)
+- , p_context(std::move(context))
+ , m_debugger_config(debugger_config)
+ , m_error_handler(eh)
+ {
+@@ -103,11 +103,11 @@ namespace xeus
+ nl::json debugger_config,
+ nl::json::error_handler_t eh)
+ : m_user_name(user_name)
++ , p_context(std::move(context))
+ , p_interpreter(std::move(interpreter))
+ , p_history_manager(std::move(history_manager))
+ , p_logger(std::move(logger))
+ , m_debugger_builder(dbuilder)
+- , p_context(std::move(context))
+ , m_debugger_config(debugger_config)
+ , m_error_handler(eh)
+ {
+--
+2.36.1
+
diff --git a/0003-Fix-non-standard-messages.patch b/0003-Fix-non-standard-messages.patch
new file mode 100644
index 0000000..4c5fc5d
--- /dev/null
+++ b/0003-Fix-non-standard-messages.patch
@@ -0,0 +1,707 @@
+From 271c3e1c4c134336323b979b6b0d5d702e0baa38 Mon Sep 17 00:00:00 2001
+From: Mariana Meireles <mariana@psychonautgirl.space>
+Date: Fri, 24 Sep 2021 07:30:56 +0000
+Subject: [PATCH 3/3] Fix non-standard messages
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst@gmail.com>
+---
+ CMakeLists.txt | 4 +-
+ example/src/custom_interpreter.cpp | 61 ++++--------
+ include/xeus/xhelper.hpp | 72 ++++++++++++++
+ src/xhelper.cpp | 155 +++++++++++++++++++++++++++++
+ test/CMakeLists.txt | 3 +-
+ test/test_interpreter.cpp | 78 ++++++---------
+ test/test_unit_kernel.cpp | 127 +++++++++++++++--------
+ 7 files changed, 367 insertions(+), 133 deletions(-)
+ create mode 100644 include/xeus/xhelper.hpp
+ create mode 100644 src/xhelper.cpp
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5cd2aab..b968abb 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -133,6 +133,7 @@ set(XEUS_HEADERS
+ ${XEUS_INCLUDE_DIR}/xeus/xkernel_configuration.hpp
+ ${XEUS_INCLUDE_DIR}/xeus/xlogger.hpp
+ ${XEUS_INCLUDE_DIR}/xeus/xmessage.hpp
++ ${XEUS_INCLUDE_DIR}/xeus/xhelper.hpp
+ ${XEUS_INCLUDE_DIR}/xeus/xmiddleware.hpp
+ ${XEUS_INCLUDE_DIR}/xeus/xserver.hpp
+ ${XEUS_INCLUDE_DIR}/xeus/xserver_control_main.hpp
+@@ -168,6 +169,7 @@ set(XEUS_SOURCES
+ ${XEUS_SOURCE_DIR}/xlogger_impl.hpp
+ ${XEUS_SOURCE_DIR}/xlogger_impl.cpp
+ ${XEUS_SOURCE_DIR}/xmessage.cpp
++ ${XEUS_SOURCE_DIR}/xhelper.cpp
+ ${XEUS_SOURCE_DIR}/xmock_interpreter.cpp
+ ${XEUS_SOURCE_DIR}/xmock_interpreter.hpp
+ ${XEUS_SOURCE_DIR}/xmiddleware.cpp
+@@ -351,7 +353,7 @@ endif ()
+
+ include(CTest)
+
+-if(XEUS_BUILD_TESTS)
++if(XEUS_DOWNLOAD_GTEST OR GTEST_SRC_DIR OR XEUS_BUILD_TESTS)
+ set(BUILD_TESTING ON)
+ message(STATUS "tests enabled")
+ else ()
+diff --git a/example/src/custom_interpreter.cpp b/example/src/custom_interpreter.cpp
+index caad375..e2dbfca 100644
+--- a/example/src/custom_interpreter.cpp
++++ b/example/src/custom_interpreter.cpp
+@@ -10,7 +10,7 @@
+ #include <iostream>
+
+ #include "nlohmann/json.hpp"
+-
++#include "xeus/xhelper.hpp"
+ #include "custom_interpreter.hpp"
+
+ namespace nl = nlohmann;
+@@ -44,9 +44,7 @@ namespace custom
+ // publish_execution_error(error_name, error_value, error_traceback);
+ publish_execution_error("TypeError", "123", {"!@#$", "*(*"});
+
+- nl::json result;
+- result["status"] = "ok";
+- return result;
++ return xeus::create_successful_reply();
+ }
+
+ void custom_interpreter::configure_impl()
+@@ -57,26 +55,16 @@ namespace custom
+ nl::json custom_interpreter::complete_request_impl(const std::string& code,
+ int cursor_pos)
+ {
+- nl::json result;
+-
+ // Code starts with 'H', it could be the following completion
+ if (code[0] == 'H')
+ {
+- result["status"] = "ok";
+- result["matches"] = {"Hello", "Hey", "Howdy"};
+- result["cursor_start"] = 5;
+- result["cursor_end"] = cursor_pos;
++ return xeus::create_complete_reply({"Hello", "Hey", "Howdy"}, 5, cursor_pos);
+ }
+ // No completion result
+ else
+ {
+- result["status"] = "ok";
+- result["matches"] = nl::json::array();
+- result["cursor_start"] = cursor_pos;
+- result["cursor_end"] = cursor_pos;
++ return xeus::create_complete_reply({}, cursor_pos, cursor_pos);
+ }
+-
+- return result;
+ }
+
+ nl::json custom_interpreter::inspect_request_impl(const std::string& code,
+@@ -87,48 +75,33 @@ namespace custom
+
+ if (code.compare("print") == 0)
+ {
+- result["found"] = true;
+- result["text/plain"] = "Print objects to the text stream file, [...]";
++ return xeus::create_inspect_reply(true,
++ {"text/plain", "Print objects to the text stream file, [...]"});
+ }
+ else
+ {
+- result["found"] = false;
++ return xeus::create_inspect_reply();
+ }
+-
+- result["status"] = "ok";
+- return result;
+ }
+
+ nl::json custom_interpreter::is_complete_request_impl(const std::string& /*code*/)
+ {
+- nl::json result;
+-
+- // if (is_complete(code))
+- // {
+- result["status"] = "complete";
+- // }
+- // else
+- // {
+- // result["status"] = "incomplete";
+- // result["indent"] = 4;
+- //}
+-
+- return result;
++ return xeus::create_is_complete_reply("complete");
+ }
+
+ nl::json custom_interpreter::kernel_info_request_impl()
+ {
+- nl::json result;
+- result["implementation"] = "my_kernel";
+- result["implementation_version"] = "0.1.0";
+- result["language_info"]["name"] = "python";
+- result["language_info"]["version"] = "3.7";
+- result["language_info"]["mimetype"] = "text/x-python";
+- result["language_info"]["file_extension"] = ".py";
+- return result;
++ return xeus::create_info_reply("",
++ "my_kernel",
++ "0.1.0",
++ "python",
++ "3.7",
++ "text/x-python",
++ ".py");
+ }
+
+- void custom_interpreter::shutdown_request_impl() {
++ void custom_interpreter::shutdown_request_impl()
++ {
+ std::cout << "Bye!!" << std::endl;
+ }
+
+diff --git a/include/xeus/xhelper.hpp b/include/xeus/xhelper.hpp
+new file mode 100644
+index 0000000..584c150
+--- /dev/null
++++ b/include/xeus/xhelper.hpp
+@@ -0,0 +1,72 @@
++/***************************************************************************
++* Copyright (c) 2016, Johan Mabille, Sylvain Corlay, Martin Renou *
++* Copyright (c) 2016, QuantStack *
++* *
++* Distributed under the terms of the BSD 3-Clause License. *
++* *
++* The full license is in the file LICENSE, distributed with this software. *
++****************************************************************************/
++
++#ifndef XEUS_HELPER_HPP
++#define XEUS_HELPER_HPP
++
++#include <iostream>
++#include <string>
++#include <vector>
++
++#include "xeus/xeus.hpp"
++#include "xeus/xkernel_configuration.hpp"
++
++#include "nlohmann/json.hpp"
++
++namespace nl = nlohmann;
++
++namespace xeus
++{
++ XEUS_API std::string print_starting_message(const xconfiguration& config);
++
++ XEUS_API std::string extract_filename(int argc, char* argv[]);
++
++ XEUS_API bool should_print_version(int argc, char* argv[]);
++
++ XEUS_API
++ nl::json create_error_reply(const std::string& ename = std::string(),
++ const std::string& evalue = std::string(),
++ const nl::json& trace_back = nl::json::array());
++
++ XEUS_API
++ nl::json create_successful_reply(const nl::json& payload = nl::json::array(),
++ const nl::json& user_expressions = nl::json::object());
++
++ XEUS_API
++ nl::json create_complete_reply(const nl::json& matches,
++ const int& cursor_start,
++ const int& cursor_end,
++ const nl::json& metadata = nl::json::object());
++
++ XEUS_API
++ nl::json create_inspect_reply(const bool found = false,
++ const nl::json& data = nl::json::object(),
++ const nl::json& metadata = nl::json::object());
++
++ XEUS_API
++ nl::json create_is_complete_reply(const std::string& status = std::string(),
++ const std::string& indent = std::string(""));
++
++ XEUS_API
++ nl::json create_info_reply(const std::string& protocol_version = std::string(),
++ const std::string& implementation = std::string(),
++ const std::string& implementation_version = std::string(),
++ const std::string& language_name = std::string(),
++ const std::string& language_version = std::string(),
++ const std::string& language_mimetype = std::string(),
++ const std::string& language_file_extension = std::string(),
++ const std::string& pygments_lexer = std::string(),
++ const std::string& language_codemirror_mode = std::string(),
++ const std::string& language_nbconvert_exporter = std::string(),
++ const std::string& banner = std::string(),
++ const bool debugger = false,
++ const nl::json& help_links = nl::json::array());
++}
++
++#endif
+diff --git a/src/xhelper.cpp b/src/xhelper.cpp
+new file mode 100644
+index 0000000..7526f0d
+--- /dev/null
++++ b/src/xhelper.cpp
+@@ -0,0 +1,155 @@
++#include <string>
++#include <vector>
++
++#include "nlohmann/json.hpp"
++
++#include "xeus/xhelper.hpp"
++
++namespace nl = nlohmann;
++
++namespace xeus
++{
++ std::string print_starting_message(const xconfiguration& config)
++ {
++ std::string kernel_info;
++ kernel_info = "Starting kernel...\n\n"
++ "If you want to connect to this kernel from an other client, just copy"
++ " and paste the following content inside of a `kernel.json` file. And then run for example:\n\n"
++ "# jupyter console --existing kernel.json\n\n"
++ "kernel.json\n```\n{\n"
++ " \"transport\": \"" + config.m_transport + "\",\n"
++ " \"ip\": \"" + config.m_ip + "\",\n"
++ " \"control_port\": " + config.m_control_port + ",\n"
++ " \"shell_port\": " + config.m_shell_port + ",\n"
++ " \"stdin_port\": " + config.m_stdin_port + ",\n"
++ " \"iopub_port\": " + config.m_iopub_port + ",\n"
++ " \"hb_port\": " + config.m_hb_port + ",\n"
++ " \"signature_scheme\": \"" + config.m_signature_scheme + "\",\n"
++ " \"key\": \"" + config.m_key + "\"\n"
++ "}\n```";
++ return kernel_info;
++ }
++
++ std::string extract_filename(int argc, char* argv[])
++ {
++ std::string res = "";
++ for (int i = 0; i < argc; ++i)
++ {
++ if ((std::string(argv[i]) == "-f") && (i + 1 < argc))
++ {
++ res = argv[i + 1];
++ for(int j = i; j < argc - 2; ++j)
++ {
++ argv[j] = argv[j + 2];
++ }
++ argc -= 2;
++ break;
++ }
++ }
++ return res;
++ }
++
++ bool should_print_version(int argc, char* argv[])
++ {
++ for (int i = 0; i < argc; ++i)
++ {
++ if (std::string(argv[i]) == "--version")
++ {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ // Helpers that create replies to the server
++ nl::json create_error_reply(const std::string& evalue,
++ const std::string& ename,
++ const nl::json& trace_back)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = "error";
++ kernel_res["ename"] = ename;
++ kernel_res["evalue"] = evalue;
++ kernel_res["traceback"] = trace_back;
++ return kernel_res;
++ }
++
++ nl::json create_successful_reply(const nl::json& payload,
++ const nl::json& user_expressions)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = "ok";
++ kernel_res["payload"] = payload;
++ kernel_res["user_expressions"] = user_expressions;
++ return kernel_res;
++ }
++
++ nl::json create_complete_reply(const nl::json& matches,
++ const int& cursor_start,
++ const int& cursor_end,
++ const nl::json& metadata)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = "ok";
++ kernel_res["matches"] = matches;
++ kernel_res["cursor_start"] = cursor_start;
++ kernel_res["cursor_end"] = cursor_end;
++ kernel_res["metadata"] = metadata;
++ return kernel_res;
++ }
++
++ nl::json create_inspect_reply(const bool found,
++ const nl::json& data,
++ const nl::json& metadata)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = "ok";
++ kernel_res["found"] = found;
++ kernel_res["data"] = data;
++ kernel_res["metadata"] = metadata;
++ return kernel_res;
++ }
++
++ nl::json create_is_complete_reply(const std::string& status,
++ const std::string& indent)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = status;
++ kernel_res["indent"] = indent;
++ return kernel_res;
++ }
++
++ nl::json create_info_reply(const std::string& protocol_version,
++ const std::string& implementation,
++ const std::string& implementation_version,
++ const std::string& language_name,
++ const std::string& language_version,
++ const std::string& language_mimetype,
++ const std::string& language_file_extension,
++ const std::string& language_pygments_lexer,
++ const std::string& language_codemirror_mode,
++ const std::string& language_nbconvert_exporter,
++ const std::string& banner,
++ const bool debugger,
++ const nl::json& help_links)
++ {
++ nl::json kernel_res;
++ kernel_res["status"] = "ok";
++ kernel_res["protocol_version"] = protocol_version;
++ kernel_res["implementation"] = implementation;
++ kernel_res["implementation_version"] = implementation_version;
++ kernel_res["language_info"]["name"] = language_name;
++ kernel_res["language_info"]["version"] = language_version;
++ kernel_res["language_info"]["mimetype"] = language_mimetype;
++ kernel_res["language_info"]["file_extension"] = language_file_extension;
++ kernel_res["language_info"]["pygments_lexer"] = language_pygments_lexer;
++ kernel_res["language_info"]["codemirror_mode"] = language_codemirror_mode;
++ kernel_res["language_info"]["nbconvert_exporter"] = language_nbconvert_exporter;
++ kernel_res["banner"] = banner;
++ kernel_res["debugger"] = debugger;
++ kernel_res["help_links"] = help_links;
++ return kernel_res;
++ }
++
++}
++
+diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
+index b24a3e5..176ef2a 100644
+--- a/test/CMakeLists.txt
++++ b/test/CMakeLists.txt
+@@ -84,7 +84,7 @@ endif ()
+ foreach(filename IN LISTS XEUS_TESTS)
+ get_filename_component(targetname ${filename} NAME_WE)
+
+- add_executable(${targetname} test_main.cpp ${filename})
++ add_executable(${targetname} test_main.cpp ${filename} test_interpreter.cpp)
+ target_link_libraries(${targetname} PRIVATE ${xeus_TARGET} doctest::doctest Threads::Threads ${nlohmann_json_TARGET})
+ add_test(NAME ${targetname} COMMAND ${targetname})
+ endforeach()
+@@ -179,3 +179,4 @@ add_test(NAME test_kernel_shell
+ set_tests_properties(test_kernel_shell
+ PROPERTIES
+ ENVIRONMENT "JUPYTER_PATH=${CMAKE_CURRENT_BINARY_DIR}")
++
+diff --git a/test/test_interpreter.cpp b/test/test_interpreter.cpp
+index dd7491e..f01aac9 100644
+--- a/test/test_interpreter.cpp
++++ b/test/test_interpreter.cpp
+@@ -11,6 +11,8 @@
+ #include "nlohmann/json.hpp"
+
+ #include "test_interpreter.hpp"
++
++#include "xeus/xhelper.hpp"
+ #include "xeus/xguid.hpp"
+
+ namespace nl = nlohmann;
+@@ -34,8 +36,6 @@ namespace test_kernel
+ nl::json /* user_expressions */,
+ bool /* allow_stdin */)
+ {
+- nl::json kernel_res;
+-
+ if (code.compare("hello, world") == 0)
+ {
+ publish_stream("stdout", code);
+@@ -49,62 +49,44 @@ namespace test_kernel
+ if (code.compare("?") == 0)
+ {
+ std::string html_content = R"(<iframe class="xpyt-iframe-pager" src="
+- https://xeus.readthedocs.io"></iframe>)";
+-
+- kernel_res["status"] = "ok";
+- kernel_res["payload"] = nl::json::array();
+- kernel_res["payload"][0] = nl::json::object({
+- {"data", {
+- {"text/plain", "https://xeus.readthedocs.io"},
+- {"text/html", html_content}}
+- },
+- {"source", "page"},
+- {"start", 0}
+- });
+- kernel_res["user_expressions"] = nl::json::object();
+-
+- return kernel_res;
++ https://xeus.readthedocs.io"></iframe>)";
++
++ auto payload = nl::json::array();
++ payload[0] = nl::json::object({
++ {"data", {
++ {"text/plain", "https://xeus.readthedocs.io"},
++ {"text/html", html_content}}
++ },
++ {"source", "page"},
++ {"start", 0}
++ });
++
++ return xeus::create_successful_reply(payload);
+ }
+
+ nl::json pub_data;
+ pub_data["text/plain"] = code;
+- publish_execution_result(execution_counter, std::move(pub_data), nl::json());
++ publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
+
+- kernel_res["status"] = "ok";
+- kernel_res["payload"] = nl::json::array();
+- kernel_res["user_expressions"] = nl::json::object();
+-
+- return kernel_res;
++ return xeus::create_successful_reply();
+ }
+
+ nl::json test_interpreter::complete_request_impl(const std::string& /* code */,
+ int /* cursor_pos */)
+ {
+- nl::json result;
+- result["status"] = "ok";
+- result["matches"] = {"a.test1", "a.test2"};
+- result["cursor_start"] = 2;
+- result["cursor_end"] = 6;
+-
+- return result;
++ return xeus::create_complete_reply({"a.test1", "a.test2"}, 2, 6);
+ }
+
+ nl::json test_interpreter::inspect_request_impl(const std::string& /* code */,
+ int /* cursor_pos */,
+ int /* detail_level */)
+ {
+- nl::json result;
+- result["status"] = "ok";
+- result["found"] = true;
+- result["data"] = {{"text/plain", ""}};
+- result["metadata"] = {{"text/plain", ""}};
+- return result;
++ return xeus::create_inspect_reply(true, {{"text/plain", ""}}, {{"text/plain", ""}});
+ }
+
+ nl::json test_interpreter::is_complete_request_impl(const std::string& code)
+ {
+- nl::json result;
+- result["status"] = code;
++ nl::json result = xeus::create_is_complete_reply(code);
+ if (code.compare("incomplete") == 0)
+ {
+ result["indent"] = " ";
+@@ -114,15 +96,17 @@ namespace test_kernel
+
+ nl::json test_interpreter::kernel_info_request_impl()
+ {
+- nl::json result;
+- result["implementation"] = "cpp_test";
+- result["implementation_version"] = "1.0.0";
+- result["banner"] = "test_kernel";
+- result["language_info"]["name"] = "cpp";
+- result["language_info"]["version"] = "14.0.0";
+- result["language_info"]["mimetype"] = "text/x-c++src";
+- result["language_info"]["file_extension"] = ".cpp";
+- return result;
++ return xeus::create_info_reply("",
++ "cpp_test",
++ "1.0.0",
++ "cpp",
++ "14.0.0",
++ "text/x-c++src",
++ ".cpp",
++ "",
++ "",
++ "",
++ "test_kernel");
+ }
+
+ void test_interpreter::shutdown_request_impl()
+diff --git a/test/test_unit_kernel.cpp b/test/test_unit_kernel.cpp
+index ee8709b..789bbc9 100644
+--- a/test/test_unit_kernel.cpp
++++ b/test/test_unit_kernel.cpp
+@@ -9,63 +9,110 @@
+ #include "doctest/doctest.h"
+
+ #include <string>
+-#include <iostream>
++#include <memory>
+
+ #include "nlohmann/json.hpp"
+
++#include "test_interpreter.hpp"
++
+ #include "xeus/xkernel.hpp"
+ #include "xeus/xmiddleware.hpp"
+ #include "xeus/xsystem.hpp"
++#include "xeus/xeus_context.hpp"
++#include "xeus/xhelper.hpp"
++#include "xeus/xkernel_configuration.hpp"
++#include "xeus/xserver_zmq.hpp"
+
+ namespace nl = nlohmann;
+
+ namespace xeus
+ {
+- TEST_SUITE("kernel") {
+-
+- TEST_CASE("get_username")
++ TEST_SUITE("kernel")
+ {
+- std::string username;
+- username = get_user_name();
+- REQUIRE_NE(username, "unspecified user");
+- }
++ TEST_CASE("print_starting_message")
++ {
++ auto context = make_context<zmq::context_t>();
+
+- TEST_CASE("find_free_port")
+- {
+- std::string port = find_free_port();
+- REQUIRE_NE(port, "");
+- REQUIRE_EQ(port.length(), std::size_t(5));
+- }
++ using interpreter_ptr = std::unique_ptr<test_kernel::test_interpreter>;
++ interpreter_ptr interpreter = interpreter_ptr(new test_kernel::test_interpreter());
++ xkernel kernel(get_user_name(),
++ std::move(context),
++ std::move(interpreter),
++ make_xserver_zmq);
++ std::string kernel_config = print_starting_message(kernel.get_config());
++ std::cout << kernel_config << std::endl;
++ size_t pos = kernel_config.find("Starting kernel...\n"
++ "\n"
++ "If you want to connect to this kernel from an other client, just copy and paste the following content inside of a `kernel.json` file. And then run for example:\n"
++ "\n"
++ "# jupyter console --existing kernel.json\n"
++ "\n"
++ "kernel.json\n"
++ "```\n"
++ "{\n"
++ " \"transport\": \"tcp\",\n");
++ REQUIRE_NE(pos, std::string::npos);
++ }
+
+- TEST_CASE("temp_directory_path")
+- {
+- std::string path = get_temp_directory_path();
+- std::cout << "Temporary directory path: " << path << std::endl;
+- REQUIRE_NE(path, "");
+- REQUIRE_NE(path.back(), '/');
+- REQUIRE_NE(path.back(), '\\');
+- }
++ TEST_CASE("extract_filename")
++ {
++ char* argv[2];
++ argv[0] = (char*)"-f";
++ argv[1] = (char*)"connection.json";
++ std::string file_name = extract_filename(3, argv);
++ REQUIRE_EQ(file_name, "connection.json");
++ }
+
+- TEST_CASE("create_directory")
+- {
+- std::string temp_path = get_temp_directory_path();
+- std::string path = temp_path + "/intermediate/logs";
+- bool res = create_directory(path);
+- REQUIRE_UNARY(res);
+- }
++ TEST_CASE("should_print_version")
++ {
++ char* argv[2];
++ argv[0] = (char*)"--version";
++ REQUIRE_EQ(should_print_version(1, argv), true);
++ }
+
+- TEST_CASE("get_current_pid")
+- {
+- int pid = get_current_pid();
+- REQUIRE_NE(pid, -1);
+- }
++ TEST_CASE("get_username")
++ {
++ std::string username;
++ username = get_user_name();
++ REQUIRE_NE(username, "unspecified user");
++ }
+
+- TEST_CASE("get_tmp_hash_seed")
+- {
+- size_t hs = get_tmp_hash_seed();
+- size_t expected = static_cast<std::size_t>(0xc70f6907UL);
+- REQUIRE_EQ(hs, expected);
+- }
++ TEST_CASE("find_free_port")
++ {
++ std::string port = find_free_port();
++ REQUIRE_NE(port, "");
++ REQUIRE_EQ(port.length(), std::size_t(5));
++ }
++
++ TEST_CASE("temp_directory_path")
++ {
++ std::string path = get_temp_directory_path();
++ std::cout << "Temporary directory path: " << path << std::endl;
++ REQUIRE_NE(path, "");
++ REQUIRE_NE(path.back(), '/');
++ REQUIRE_NE(path.back(), '\\');
++ }
++
++ TEST_CASE("create_directory")
++ {
++ std::string temp_path = get_temp_directory_path();
++ std::string path = temp_path + "/intermediate/logs";
++ bool res = create_directory(path);
++ REQUIRE_EQ(res, true);
++ }
++
++ TEST_CASE("get_current_pid")
++ {
++ int pid = get_current_pid();
++ REQUIRE_NE(pid, -1);
++ }
++
++ TEST_CASE("get_tmp_hash_seed")
++ {
++ size_t hs = get_tmp_hash_seed();
++ size_t expected = static_cast<std::size_t>(0xc70f6907UL);
++ REQUIRE_EQ(hs, expected);
++ }
+ }
+ }
+
+--
+2.36.1
+
diff --git a/xeus.spec b/xeus.spec
index 5c551c6..8346a0a 100644
--- a/xeus.spec
+++ b/xeus.spec
@@ -6,14 +6,25 @@ Summary: C++ implementation of the Jupyter kernel protocol
License: BSD
URL: https://github.com/jupyter-xeus/xeus
Source0: https://github.com/jupyter-xeus/xeus/archive/%{version}/%{name}-%{version}.tar.gz
+# Backport to make further backports easier
+# https://github.com/jupyter-xeus/xeus/pull/292
+Patch: 0001-switched-from-gtest-to-doctest-292.patch
+# https://github.com/jupyter-xeus/xeus/pull/298
+Patch: 0002-Never-delete-context-before-sockets.patch
+# Backport a refactor that only adds API, but leave out the documentation
+# changes, plus a few later bug fixes.
+# https://github.com/jupyter-xeus/xeus/pull/285
+# https://github.com/jupyter-xeus/xeus/pull/314
+# https://github.com/jupyter-xeus/xeus/pull/315
+Patch: 0003-Fix-non-standard-messages.patch
BuildRequires: cmake >= 3.8
BuildRequires: cmake(cppzmq) >= 4.3.0
BuildRequires: cmake(nlohmann_json) >= 3.2.0
BuildRequires: cmake(xtl) >= 0.7
+BuildRequires: doctest-devel
BuildRequires: doxygen
BuildRequires: gcc-c++
-BuildRequires: gtest-devel
BuildRequires: libuuid-devel
BuildRequires: make
BuildRequires: openssl-devel >= 1.0.1
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-11 22:28 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-11 22:28 [rpms/xeus] epel10: Backport fixes to messages to match schemas Elliott Sales de Andrade
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox