Skip to content

Commit

Permalink
Add send receive test
Browse files Browse the repository at this point in the history
  • Loading branch information
resetius committed Nov 23, 2023
1 parent d473323 commit 144e703
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 4 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ add_library(miniraft

add_executable(test_raft test/test_raft.cpp)

target_include_directories(test_raft PRIVATE ${CMOCKA_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/src)
target_include_directories(test_raft PRIVATE ${CMOCKA_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/coroio/src)
target_link_directories(test_raft PRIVATE ${CMOCKA_LIBRARY_DIRS})
target_link_libraries(test_raft miniraft ${CMOCKA_LIBRARIES})

Expand Down
30 changes: 27 additions & 3 deletions src/messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ enum class EMessageType : uint32_t {
REQUEST_VOTE_REQUEST = 2,
REQUEST_VOTE_RESPONSE = 3,
APPEND_ENTRIES_REQUEST = 4,
APPEND_ENTRIES_RESPONSE = 5,
COMMAND_REQUEST = 6,
COMMAND_RESPONSE = 7,
};

struct TMessage {
Expand All @@ -35,15 +38,15 @@ struct TRequestVoteRequest: public TMessage {
uint32_t CandidateId;
};

class TRequestVoteResponse: public TMessage {
struct TRequestVoteResponse: public TMessage {
static constexpr EMessageType MessageType = EMessageType::REQUEST_VOTE_RESPONSE;
uint64_t Term;
uint32_t Src;
uint32_t Dst;
uint32_t VoteGranted;
};

class TAppendEntriesRequest: public TMessage {
struct TAppendEntriesRequest: public TMessage {
static constexpr EMessageType MessageType = EMessageType::APPEND_ENTRIES_REQUEST;
uint64_t Term;
uint64_t PrevLogIndex;
Expand All @@ -55,12 +58,33 @@ class TAppendEntriesRequest: public TMessage {
TLogEntry Entries[0];
};

struct TAppendEntriesResponse: public TMessage {
static constexpr EMessageType MessageType = EMessageType::APPEND_ENTRIES_RESPONSE;
uint64_t Term;
uint64_t MatchIndex;
uint32_t Src;
uint32_t Dst;
uint32_t Success;
};

struct CommandRequest: public TMessage {
char Data[0];
};

struct CommandResponse: public TMessage {

};

template<typename T>
requires std::derived_from<T, TMessage>
struct TMessageHolder {
T* Mes;
std::shared_ptr<char[]> RawData;

TMessageHolder()
: Mes(nullptr)
{ }

template<typename U>
requires std::derived_from<U, T>
TMessageHolder(U* u, const std::shared_ptr<char[]>& rawData)
Expand Down Expand Up @@ -105,7 +129,7 @@ struct TMessageHolder {
};

U* dst = Mes->Type == static_cast<uint32_t>(U::MessageType)
? static_cast<U*>(dst)
? static_cast<U*>(Mes)
: nullptr;

return Maybe {
Expand Down
61 changes: 61 additions & 0 deletions test/test_raft.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#include <coroutine>
#include <string_view>

#include <poll.hpp>
#include <messages.h>
#include <all.hpp>

#include <stdarg.h>
#include <stddef.h>
Expand All @@ -7,6 +12,8 @@ extern "C" {
#include <cmocka.h>
}

using namespace NNet;

void test_empty(void** state) {

}
Expand All @@ -21,16 +28,70 @@ void test_message_cast(void** state) {
TMessageHolder<TMessage> mes = NewHoldedMessage<TLogEntry>(static_cast<uint32_t>(TLogEntry::MessageType), 4);
auto casted = mes.Cast<TLogEntry>();
assert_true(mes.RawData == casted.RawData);
assert_true(mes->Len == casted->Len);

auto casted2 = mes.Maybe<TRequestVoteRequest>();
assert_false(casted2);

auto maybeCasted = mes.Maybe<TLogEntry>();
assert_true(maybeCasted);
auto casted3 = maybeCasted.Cast();
assert_true(mes.RawData == casted3.RawData);
assert_true(mes->Len == casted3->Len);
}

void test_message_send_recv(void** state) {
const char* text = "MESSAGE";
auto mes = NewHoldedMessage<TLogEntry>(
static_cast<uint32_t>(TLogEntry::MessageType),
sizeof(TLogEntry) + strlen(text) + 1
);
strcpy(mes.Mes->Data, text);

TLoop<TPoll> loop;
TSocket socket(TAddress{"127.0.0.1", 8888}, loop.Poller());
socket.Bind();
socket.Listen();

TSocket client(TAddress{"127.0.0.1", 8888}, loop.Poller());

TTestTask h1 = [](TSocket& client, TMessageHolder<TLogEntry> mes) -> TTestTask
{
co_await client.Connect();
auto r = co_await client.WriteSome(mes.RawData.get(), mes->Len);
co_return;
}(client, mes);

TMessageHolder<TMessage> received;
TTestTask h2 = [](TSocket& server, TMessageHolder<TMessage>& received) -> TTestTask
{
auto client = std::move(co_await server.Accept());
uint32_t type, len;
auto r = co_await client.ReadSome((char*)&type, sizeof(type));
r = co_await client.ReadSome((char*)&len, sizeof(len));
received = NewHoldedMessage<TMessage>(type, len);
r = co_await client.ReadSome(received->Value, len - sizeof(TMessage));
co_return;
}(socket, received);

while (!(h1.done() && h2.done())) {
loop.Step();
}

auto maybeCasted = received.Maybe<TLogEntry>();
assert_true(maybeCasted);
auto casted = maybeCasted.Cast();
assert_string_equal(mes->Data, casted->Data);

h1.destroy(); h2.destroy();
};

int main() {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_empty),
cmocka_unit_test(test_message_create),
cmocka_unit_test(test_message_cast),
cmocka_unit_test(test_message_send_recv),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}

0 comments on commit 144e703

Please sign in to comment.