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