Skip to content
Snippets Groups Projects
connection_line_buffer_test.cpp 3.89 KiB
Newer Older
#define BOOST_AUTO_TEST_MAIN
#define BOOST_TEST_MODULE RMRF_TESTS
#include <boost/test/included/unit_test.hpp>

#include <algorithm>
#include <array>
#include <iostream>
#include <memory>
#include <string>

#include "loopback_connection_client.hpp"

#include "net/connection_line_buffer.hpp"
#include "net/iorecord.hpp"


using namespace rmrf::net;
using namespace rmrf::test;

//BOOST_AUTO_TEST_SUITE( LINE_BUFFER )

int mut_send_stage = 0;
bool extra_failed = false;
const bool display_dbg_msg = false;

iorecord string_to_iorecord(const std::string& s) {
    return iorecord(s.c_str(), s.length());
}

void mut_send_data_cb(const iorecord& data) {
    std::cout << "This method should never have been called yet we've got:" << std::endl;
    std::cout << data.str() << std::endl;
    BOOST_CHECK(false);
}

void next_line_cb(const std::string& data, bool complete) {
    if constexpr (display_dbg_msg) std::cout << mut_send_stage << ": " << data << std::endl;

    switch (mut_send_stage++) {
    case 0:
        BOOST_CHECK_EQUAL(data, "The first line");
        BOOST_CHECK(complete);
        break;
    case 1:
        BOOST_CHECK_EQUAL(data, "The second line");
        BOOST_CHECK(complete);
        break;
    case 2:
        BOOST_CHECK_EQUAL(data, "The third line");
        BOOST_CHECK(complete);
        break;
    case 3:
        BOOST_CHECK_EQUAL(data.length(), 151);
        BOOST_CHECK(!complete);
        BOOST_CHECK(std::find_if(data.cbegin(), data.cend(), [](char c) {
            return c != 'a';
        }) == data.cend());
        break;
    default:
        extra_failed = true;
    }
}

BOOST_AUTO_TEST_CASE(Default_EoL_Search_Test) {
    BOOST_CHECK_EQUAL(default_eol_search("This line contains no line break", 0), std::string::npos);
    std::string data = "This\r line contains line\r\n breaks";
    BOOST_CHECK_EQUAL(default_eol_search(data, 0), 4);
    BOOST_CHECK_EQUAL(data.substr(0, 4), "This");
    BOOST_CHECK_EQUAL(default_eol_search(data, 5), 25);
    BOOST_CHECK_EQUAL(data.substr(5, 25 - 5), " line contains line\r");
}

BOOST_AUTO_TEST_CASE(Connection_Line_Buffer_Test) {
    mut_send_stage = 0;
    auto ll_client = std::make_shared<loopback_connection_client>(mut_send_data_cb, false);
    connection_line_buffer clb(ll_client, next_line_cb, 150);

    if constexpr (display_dbg_msg) std::cout << "Testing legit lines" << std::endl;

    ll_client->send_data_to_incomming_data_cb(string_to_iorecord("The first"));
    ll_client->send_data_to_incomming_data_cb(string_to_iorecord(" line\r"));
    ll_client->send_data_to_incomming_data_cb(string_to_iorecord("The second line\r"));
    ll_client->send_data_to_incomming_data_cb(string_to_iorecord("\nThe third line\n"));

    if constexpr (display_dbg_msg) std::cout << "Testing line overflow" << std::endl;

    for (int i = 0; i < 151; i++) {
        ll_client->send_data_to_incomming_data_cb(string_to_iorecord("a"));
    }

    BOOST_CHECK_EQUAL(mut_send_stage, 4);
    BOOST_CHECK(!extra_failed);
}

BOOST_AUTO_TEST_CASE(Iorecord_String_Collection_Test) {
    std::array<uint8_t, 16> arr = {(uint8_t) 'a', (uint8_t) 'b', (uint8_t) 'c', 0,
                                                              (uint8_t) 'a', 0, (uint8_t) 'b', 0,
                                                              (uint8_t) 'a', (uint8_t) 'b', (uint8_t) 'c', (uint8_t) 'd',
                                                              (uint8_t) 'e', (uint8_t) 'f', (uint8_t) 'g', (uint8_t) 'h'};
    iorecord r(arr.data(), arr.size());
    auto v = r.get_strings_in_record();
    BOOST_CHECK_EQUAL(v.size(), 4);
    BOOST_CHECK_EQUAL(r.potential_strings_in_record(), 4);
    BOOST_CHECK_EQUAL(v[0], "abc");
    BOOST_CHECK_EQUAL(v[1], "a");
    BOOST_CHECK_EQUAL(v[2], "b");
    BOOST_CHECK_EQUAL(v[3], "abcdefgh");
    if constexpr (display_dbg_msg) {
        for(size_t i = 0; i < v.size(); i++) {
            std::cout << i << ':' << v[i] << std::endl;
        }
    }
}

//BOOST_AUTO_TEST_SUITE_END()