Added tests for Iq Stanza errors
This commit is contained in:
parent
b565a09c1a
commit
a6c89dee5a
5 changed files with 129 additions and 7 deletions
|
@ -134,6 +134,8 @@ jobs:
|
||||||
-GNinja -DCMAKE_BUILD_TYPE=Release \
|
-GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||||
-DENABLE_EXAMPLES=ON \
|
-DENABLE_EXAMPLES=ON \
|
||||||
-DENABLE_TESTS=ON \
|
-DENABLE_TESTS=ON \
|
||||||
|
-DMAX_LOG_LEVEL=0 \
|
||||||
|
-DTEST_MAX_LOG_LEVEL=0 \
|
||||||
-DCMAKE_CXX_FLAGS="-ftemplate-backtrace-limit=0"
|
-DCMAKE_CXX_FLAGS="-ftemplate-backtrace-limit=0"
|
||||||
cmake --build ${{ github.workspace }}/build_gcc --parallel `nproc`
|
cmake --build ${{ github.workspace }}/build_gcc --parallel `nproc`
|
||||||
|
|
||||||
|
@ -160,6 +162,8 @@ jobs:
|
||||||
-GNinja -DCMAKE_BUILD_TYPE=Release \
|
-GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||||
-DENABLE_EXAMPLES=ON \
|
-DENABLE_EXAMPLES=ON \
|
||||||
-DENABLE_TESTS=ON \
|
-DENABLE_TESTS=ON \
|
||||||
|
-DMAX_LOG_LEVEL=0 \
|
||||||
|
-DTEST_MAX_LOG_LEVEL=0 \
|
||||||
-DCMAKE_CXX_FLAGS="-stdlib=libc++ -I/home/LLVM-${LLVM_VER}/include/c++/v1 -fno-modules"
|
-DCMAKE_CXX_FLAGS="-stdlib=libc++ -I/home/LLVM-${LLVM_VER}/include/c++/v1 -fno-modules"
|
||||||
|
|
||||||
echo "::group::compile_commands.json content"
|
echo "::group::compile_commands.json content"
|
||||||
|
|
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
|
@ -9,7 +9,10 @@
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Debug: connect",
|
"name": "Debug: connect",
|
||||||
"program": "${workspaceFolder}/build/examples/output/connect",
|
"program": "${workspaceFolder}/build/examples/output/connect",
|
||||||
"args": [],
|
"args": [
|
||||||
|
"--log_level=0"
|
||||||
|
// --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
|
||||||
|
],
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"preLaunchTask": "GCC: Build"
|
"preLaunchTask": "GCC: Build"
|
||||||
},
|
},
|
||||||
|
@ -19,6 +22,7 @@
|
||||||
"name": "Debug: tests",
|
"name": "Debug: tests",
|
||||||
"program": "${workspaceFolder}/build/larra_xmpp_tests",
|
"program": "${workspaceFolder}/build/larra_xmpp_tests",
|
||||||
"args": [
|
"args": [
|
||||||
|
"--log_level=0"
|
||||||
// --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
|
// --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
|
||||||
// "--gtest_filter=Roster*"
|
// "--gtest_filter=Roster*"
|
||||||
],
|
],
|
||||||
|
|
7
.vscode/tasks.json
vendored
7
.vscode/tasks.json
vendored
|
@ -79,8 +79,8 @@
|
||||||
"command": [
|
"command": [
|
||||||
"cd ${workspaceFolder} &&",
|
"cd ${workspaceFolder} &&",
|
||||||
"mkdir -p build && cd build &&",
|
"mkdir -p build && cd build &&",
|
||||||
"cmake cmake -Wno-dev ",
|
"cmake -Wno-dev ",
|
||||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON .."
|
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON -DMAX_LOG_LEVEL=0 -DTEST_MAX_LOG_LEVEL=0 .."
|
||||||
],
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"env": {
|
"env": {
|
||||||
|
@ -138,6 +138,7 @@
|
||||||
"mkdir -p build_clang && cd build_clang &&",
|
"mkdir -p build_clang && cd build_clang &&",
|
||||||
"cmake -Wno-dev ",
|
"cmake -Wno-dev ",
|
||||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON ",
|
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON ",
|
||||||
|
" -DMAX_LOG_LEVEL=0 -DTEST_MAX_LOG_LEVEL=0",
|
||||||
" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++\"",
|
" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++\"",
|
||||||
" -DCMAKE_EXE_LINKER_FLAGS=\"-L/usr/lib/x86_64-linux-gnu -lstdc++\" .."
|
" -DCMAKE_EXE_LINKER_FLAGS=\"-L/usr/lib/x86_64-linux-gnu -lstdc++\" .."
|
||||||
],
|
],
|
||||||
|
@ -160,6 +161,7 @@
|
||||||
"mkdir -p build_clang && cd build_clang &&",
|
"mkdir -p build_clang && cd build_clang &&",
|
||||||
"cmake -Wno-dev ",
|
"cmake -Wno-dev ",
|
||||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON",
|
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON",
|
||||||
|
" -DMAX_LOG_LEVEL=0 -DTEST_MAX_LOG_LEVEL=0",
|
||||||
//
|
//
|
||||||
// Uncomment for GCC standart library: libstdc++
|
// Uncomment for GCC standart library: libstdc++
|
||||||
//" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++ -fno-omit-frame-pointer -g -fsanitize=address,undefined,leak,function,nullability,vptr\"",
|
//" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++ -fno-omit-frame-pointer -g -fsanitize=address,undefined,leak,function,nullability,vptr\"",
|
||||||
|
@ -211,6 +213,7 @@
|
||||||
"mkdir -p build_clang && cd build_clang &&",
|
"mkdir -p build_clang && cd build_clang &&",
|
||||||
"cmake -Wno-dev ",
|
"cmake -Wno-dev ",
|
||||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON ",
|
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON ",
|
||||||
|
" -DMAX_LOG_LEVEL=0 -DTEST_MAX_LOG_LEVEL=0",
|
||||||
" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++ -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -fsanitize=memory\"",
|
" -DCMAKE_CXX_FLAGS=\"-stdlib=libstdc++ -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -fsanitize=memory\"",
|
||||||
" -DCMAKE_EXE_LINKER_FLAGS=\"-L/usr/lib/x86_64-linux-gnu -lstdc++ -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -fsanitize=memory\" ..",
|
" -DCMAKE_EXE_LINKER_FLAGS=\"-L/usr/lib/x86_64-linux-gnu -lstdc++ -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -fsanitize=memory\" ..",
|
||||||
],
|
],
|
||||||
|
|
|
@ -22,7 +22,8 @@ set(BOOST_INCLUDE_LIBRARIES "pfr;asio;serialization")
|
||||||
option(CPM_USE_LOCAL_PACKAGES "Use local packages" ON)
|
option(CPM_USE_LOCAL_PACKAGES "Use local packages" ON)
|
||||||
option(UTEMPL_USE_LOCAL_PACKAGE "Use utempl local package" OFF)
|
option(UTEMPL_USE_LOCAL_PACKAGE "Use utempl local package" OFF)
|
||||||
option(BUILD_EXECUTABLE ON)
|
option(BUILD_EXECUTABLE ON)
|
||||||
option(LOG_LEVEL 0 "Available log levels: 0=TRACE, 1=DEBUG,2= INFO,3= WARN, 4=ERROR, 5=CRITICAL, 6=OFF") # Compile program with highest available log levle to trace everything
|
set(MAX_LOG_LEVEL 2 CACHE STRING "Available log levels: 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=CRITICAL, 6=OFF")
|
||||||
|
set(TEST_MAX_LOG_LEVEL 2 CACHE STRING "Available log levels: 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=CRITICAL, 6=OFF")
|
||||||
set(UTEMPL_URL
|
set(UTEMPL_URL
|
||||||
"https://sha512sum.xyz/git/sha512sum/utempl"
|
"https://sha512sum.xyz/git/sha512sum/utempl"
|
||||||
CACHE STRING "utempl repository URL")
|
CACHE STRING "utempl repository URL")
|
||||||
|
@ -260,7 +261,7 @@ if(ENABLE_TESTS)
|
||||||
target_sources(larra_xmpp_tests PUBLIC ${SOURCES})
|
target_sources(larra_xmpp_tests PUBLIC ${SOURCES})
|
||||||
target_link_libraries(larra_xmpp_tests GTest::gtest_main
|
target_link_libraries(larra_xmpp_tests GTest::gtest_main
|
||||||
larra_xmpp)
|
larra_xmpp)
|
||||||
target_compile_definitions(larra_xmpp_tests PRIVATE SPDLOG_ACTIVE_LEVEL=0) # SPDLOG_LEVEL_TRACE=0. Check LOG_LEVEL variable and spdlog documentation for more details
|
target_compile_definitions(larra_xmpp_tests PRIVATE SPDLOG_ACTIVE_LEVEL=${TEST_MAX_LOG_LEVEL})
|
||||||
set_property(TARGET larra_xmpp_tests PROPERTY CXX_STANDARD 23)
|
set_property(TARGET larra_xmpp_tests PROPERTY CXX_STANDARD 23)
|
||||||
include(GoogleTest)
|
include(GoogleTest)
|
||||||
gtest_discover_tests(larra_xmpp_tests)
|
gtest_discover_tests(larra_xmpp_tests)
|
||||||
|
@ -272,7 +273,7 @@ if(ENABLE_EXAMPLES)
|
||||||
get_filename_component(EXAMPLE_NAME ${EXAMPLE_SRC} NAME_WE)
|
get_filename_component(EXAMPLE_NAME ${EXAMPLE_SRC} NAME_WE)
|
||||||
add_executable(${EXAMPLE_NAME} ${EXAMPLE_SRC})
|
add_executable(${EXAMPLE_NAME} ${EXAMPLE_SRC})
|
||||||
target_link_libraries(${EXAMPLE_NAME} larra_xmpp)
|
target_link_libraries(${EXAMPLE_NAME} larra_xmpp)
|
||||||
target_compile_definitions(${EXAMPLE_NAME} PRIVATE SPDLOG_ACTIVE_LEVEL=${LOG_LEVEL})
|
target_compile_definitions(${EXAMPLE_NAME} PRIVATE SPDLOG_ACTIVE_LEVEL=${TEST_MAX_LOG_LEVEL})
|
||||||
set_property(TARGET ${EXAMPLE_NAME} PROPERTY CXX_STANDARD 23)
|
set_property(TARGET ${EXAMPLE_NAME} PROPERTY CXX_STANDARD 23)
|
||||||
set_target_properties(${EXAMPLE_NAME} PROPERTIES
|
set_target_properties(${EXAMPLE_NAME} PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/examples/output")
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/examples/output")
|
||||||
|
|
112
tests/iq.cpp
112
tests/iq.cpp
|
@ -1,10 +1,23 @@
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include <larra/iq.hpp>
|
#include <larra/iq.hpp>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static constexpr auto kExpectedData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<iq id=\"id\" type=\"get\"><some>37</some></iq>\n";
|
static constexpr auto kForbiddenErrorData = R"(<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<iq id="42" to="name@server/res" type="error"><error type="auth"><forbidden xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>
|
||||||
|
</iq>)";
|
||||||
|
|
||||||
|
static constexpr auto kExpectedSetData = R"(<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<iq id="id" type="set"><some>37</some></iq>
|
||||||
|
)";
|
||||||
|
|
||||||
|
static constexpr auto kExpectedData = R"(<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<iq id="id" type="get"><some>37</some></iq>
|
||||||
|
)";
|
||||||
|
|
||||||
struct SomeStruct {
|
struct SomeStruct {
|
||||||
int value;
|
int value;
|
||||||
constexpr auto operator==(const SomeStruct&) const -> bool = default;
|
constexpr auto operator==(const SomeStruct&) const -> bool = default;
|
||||||
|
@ -43,4 +56,101 @@ TEST(IQ, Parse) {
|
||||||
EXPECT_EQ(S::Parse(node), iq);
|
EXPECT_EQ(S::Parse(node), iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(IQ, ParseForbiddenError) {
|
||||||
|
std::istringstream xml_stream(kForbiddenErrorData);
|
||||||
|
|
||||||
|
xmlpp::DomParser parser;
|
||||||
|
parser.parse_stream(xml_stream);
|
||||||
|
|
||||||
|
using S = Serialization<Iq<SomeStruct>>;
|
||||||
|
xmlpp::Document* doc = parser.get_document();
|
||||||
|
auto iqRes = S::Parse(doc->get_root_node());
|
||||||
|
|
||||||
|
ASSERT_TRUE(std::holds_alternative<IqError>(iqRes));
|
||||||
|
|
||||||
|
auto errorRes = std::get<IqError>(iqRes);
|
||||||
|
ASSERT_TRUE(std::holds_alternative<stanza::error::Forbidden>(errorRes.payload));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(IQ, IqErrThrowVisitorThrow) {
|
||||||
|
std::istringstream xml_stream(kForbiddenErrorData);
|
||||||
|
|
||||||
|
xmlpp::DomParser parser;
|
||||||
|
parser.parse_stream(xml_stream);
|
||||||
|
|
||||||
|
using S = Serialization<Iq<SomeStruct>>;
|
||||||
|
xmlpp::Document* doc = parser.get_document();
|
||||||
|
auto iqRes = S::Parse(doc->get_root_node());
|
||||||
|
ASSERT_TRUE(std::holds_alternative<IqError>(iqRes));
|
||||||
|
|
||||||
|
static constexpr auto visitorErrMsg = "Test Error";
|
||||||
|
static constexpr auto throwErrMsg = "Stanza IQ Error: Forbidden";
|
||||||
|
try {
|
||||||
|
std::visit(utempl::Overloaded([](iq::Result<SomeStruct> r) {}, IqErrThrowVisitor{visitorErrMsg}), std::move(iqRes));
|
||||||
|
} catch(const stanza::error::StanzaBaseError& err) {
|
||||||
|
ASSERT_STREQ(throwErrMsg, err.what());
|
||||||
|
return;
|
||||||
|
} catch(const std::runtime_error& err) {
|
||||||
|
ASSERT_TRUE(false) << "Invalid throw type throw";
|
||||||
|
} catch(...) {
|
||||||
|
ASSERT_TRUE(false) << "Unexpected throw";
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(false) << "Expected throwing an exception due to an error in output";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(IQ, IqErrThrowVisitorThrowGet) {
|
||||||
|
std::istringstream xml_stream(kExpectedData);
|
||||||
|
|
||||||
|
xmlpp::DomParser parser;
|
||||||
|
parser.parse_stream(xml_stream);
|
||||||
|
|
||||||
|
using S = Serialization<Iq<SomeStruct>>;
|
||||||
|
xmlpp::Document* doc = parser.get_document();
|
||||||
|
auto iqRes = S::Parse(doc->get_root_node());
|
||||||
|
ASSERT_TRUE(std::holds_alternative<iq::Get<SomeStruct>>(iqRes)) << "\tERROR: Unexpected parse result";
|
||||||
|
|
||||||
|
static constexpr auto visitorErrMsg = "Test Error";
|
||||||
|
static constexpr auto throwErrMsg = "Test Error: 'Get' is an invalid type for IQ result. Expected 'Result' or 'Error'";
|
||||||
|
try {
|
||||||
|
std::visit(utempl::Overloaded([](iq::Result<SomeStruct> r) {}, IqErrThrowVisitor{"Test Error"}), std::move(iqRes));
|
||||||
|
} catch(const stanza::error::StanzaBaseError& err) {
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Invalid throw type throw";
|
||||||
|
} catch(const std::runtime_error& err) {
|
||||||
|
ASSERT_STREQ(throwErrMsg, err.what());
|
||||||
|
return;
|
||||||
|
} catch(...) {
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Unexpected throw";
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Expected throwing an exception due to an error in output";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(IQ, IqErrThrowVisitorThrowSet) {
|
||||||
|
std::istringstream xml_stream(kExpectedSetData);
|
||||||
|
|
||||||
|
xmlpp::DomParser parser;
|
||||||
|
parser.parse_stream(xml_stream);
|
||||||
|
|
||||||
|
using S = Serialization<Iq<SomeStruct>>;
|
||||||
|
xmlpp::Document* doc = parser.get_document();
|
||||||
|
auto iqRes = S::Parse(doc->get_root_node());
|
||||||
|
ASSERT_TRUE(std::holds_alternative<iq::Set<SomeStruct>>(iqRes)) << "\tERROR: Unexpected parse result";
|
||||||
|
|
||||||
|
static constexpr auto visitorErrMsg = "Test Error";
|
||||||
|
static constexpr auto throwErrMsg = "Test Error: 'Set' is an invalid type for IQ result. Expected 'Result' or 'Error'";
|
||||||
|
try {
|
||||||
|
std::visit(utempl::Overloaded([](iq::Result<SomeStruct> r) {}, IqErrThrowVisitor{"Test Error"}), std::move(iqRes));
|
||||||
|
} catch(const stanza::error::StanzaBaseError& err) {
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Invalid throw type throw";
|
||||||
|
} catch(const std::runtime_error& err) {
|
||||||
|
ASSERT_STREQ(throwErrMsg, err.what());
|
||||||
|
return;
|
||||||
|
} catch(...) {
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Unexpected throw";
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(false) << "\tERROR: Expected throwing an exception due to an error in output";
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace larra::xmpp
|
} // namespace larra::xmpp
|
||||||
|
|
Loading…
Reference in a new issue