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 \
|
||||
-DENABLE_EXAMPLES=ON \
|
||||
-DENABLE_TESTS=ON \
|
||||
-DMAX_LOG_LEVEL=0 \
|
||||
-DTEST_MAX_LOG_LEVEL=0 \
|
||||
-DCMAKE_CXX_FLAGS="-ftemplate-backtrace-limit=0"
|
||||
cmake --build ${{ github.workspace }}/build_gcc --parallel `nproc`
|
||||
|
||||
|
@ -160,6 +162,8 @@ jobs:
|
|||
-GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DENABLE_EXAMPLES=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"
|
||||
|
||||
echo "::group::compile_commands.json content"
|
||||
|
|
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
|
@ -9,7 +9,10 @@
|
|||
"request": "launch",
|
||||
"name": "Debug: connect",
|
||||
"program": "${workspaceFolder}/build/examples/output/connect",
|
||||
"args": [],
|
||||
"args": [
|
||||
"--log_level=0"
|
||||
// --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"preLaunchTask": "GCC: Build"
|
||||
},
|
||||
|
@ -19,6 +22,7 @@
|
|||
"name": "Debug: tests",
|
||||
"program": "${workspaceFolder}/build/larra_xmpp_tests",
|
||||
"args": [
|
||||
"--log_level=0"
|
||||
// --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
|
||||
// "--gtest_filter=Roster*"
|
||||
],
|
||||
|
|
7
.vscode/tasks.json
vendored
7
.vscode/tasks.json
vendored
|
@ -79,8 +79,8 @@
|
|||
"command": [
|
||||
"cd ${workspaceFolder} &&",
|
||||
"mkdir -p build && cd build &&",
|
||||
"cmake cmake -Wno-dev ",
|
||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON .."
|
||||
"cmake -Wno-dev ",
|
||||
" -DCMAKE_BUILD_TYPE=Debug -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON -DMAX_LOG_LEVEL=0 -DTEST_MAX_LOG_LEVEL=0 .."
|
||||
],
|
||||
"options": {
|
||||
"env": {
|
||||
|
@ -138,6 +138,7 @@
|
|||
"mkdir -p build_clang && cd build_clang &&",
|
||||
"cmake -Wno-dev ",
|
||||
" -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_EXE_LINKER_FLAGS=\"-L/usr/lib/x86_64-linux-gnu -lstdc++\" .."
|
||||
],
|
||||
|
@ -160,6 +161,7 @@
|
|||
"mkdir -p build_clang && cd build_clang &&",
|
||||
"cmake -Wno-dev ",
|
||||
" -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++
|
||||
//" -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 &&",
|
||||
"cmake -Wno-dev ",
|
||||
" -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_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(UTEMPL_USE_LOCAL_PACKAGE "Use utempl local package" OFF)
|
||||
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
|
||||
"https://sha512sum.xyz/git/sha512sum/utempl"
|
||||
CACHE STRING "utempl repository URL")
|
||||
|
@ -260,7 +261,7 @@ if(ENABLE_TESTS)
|
|||
target_sources(larra_xmpp_tests PUBLIC ${SOURCES})
|
||||
target_link_libraries(larra_xmpp_tests GTest::gtest_main
|
||||
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)
|
||||
include(GoogleTest)
|
||||
gtest_discover_tests(larra_xmpp_tests)
|
||||
|
@ -272,7 +273,7 @@ if(ENABLE_EXAMPLES)
|
|||
get_filename_component(EXAMPLE_NAME ${EXAMPLE_SRC} NAME_WE)
|
||||
add_executable(${EXAMPLE_NAME} ${EXAMPLE_SRC})
|
||||
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_target_properties(${EXAMPLE_NAME} PROPERTIES
|
||||
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 <spdlog/spdlog.h>
|
||||
|
||||
#include <larra/iq.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
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 {
|
||||
int value;
|
||||
constexpr auto operator==(const SomeStruct&) const -> bool = default;
|
||||
|
@ -43,4 +56,101 @@ TEST(IQ, Parse) {
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue