Unverified Commit a2b16dae authored by Ozan Tezcan's avatar Ozan Tezcan Committed by GitHub
Browse files

Cmake support (#26)

added initial cmake support, fixed coverage usage
parent d4d15e04
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
*~ *~
libraft.a libraft.a
libraft.so libraft.so
CLinkedListQueue/
.env/ .env/
.hypothesis/ .hypothesis/
**/__pycache__ **/__pycache__
cmake-build*
.idea
project(raft C)
cmake_minimum_required(VERSION 3.9)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
enable_testing()
macro(define_test name)
add_executable(${name}
tests/${name}.c
tests/CuTest.c
tests/linked_list_queue.c
tests/mock_send_functions.c)
target_link_libraries(${name} raft)
target_include_directories(${name} PRIVATE include/)
add_test(NAME ${name} COMMAND $<TARGET_FILE:${name}>)
endmacro()
add_library(raft STATIC
src/raft_log.c
src/raft_server.c
src/raft_node.c
src/raft_server_properties.c)
target_compile_options(raft PRIVATE -fPIC -g)
target_include_directories(raft PRIVATE include)
define_test(test_log)
define_test(test_log_impl)
define_test(test_node)
define_test(test_scenario)
define_test(test_server)
define_test(test_snapshotting)
CONTRIB_DIR = . CONTRIB_DIR = .
TEST_DIR = ./tests TEST_DIR = ./tests
LLQUEUE_DIR = $(CONTRIB_DIR)/CLinkedListQueue SRC_DIR = src
VPATH = src BUILD_DIR = src
BIN_DIR = bin
GCOV_OUTPUT = *.gcda *.gcno *.gcov LIB = -I libs
GCOV_CCFLAGS = -fprofile-arcs -ftest-coverage INC = -I include
GCOV_CFLAGS = -fprofile-arcs -ftest-coverage
SHELL = /bin/bash SHELL = /bin/bash
CFLAGS += -Iinclude -Werror -Werror=return-type -Werror=uninitialized -Wcast-align \ CFLAGS += -Iinclude -Werror -Werror=return-type -Werror=uninitialized -Wcast-align \
-Wno-pointer-sign -fno-omit-frame-pointer -fno-common -fsigned-char \ -Wno-pointer-sign -fno-omit-frame-pointer -fno-common -fsigned-char \
-Wunused-variable \ -Wunused-variable -g -O2 -fPIC
$(GCOV_CCFLAGS) -I$(LLQUEUE_DIR) -Iinclude -g -O2 -fPIC TEST_CFLAGS = $(CFLAGS) $(GCOV_CFLAGS)
UNAME := $(shell uname) UNAME := $(shell uname)
...@@ -27,24 +28,23 @@ SHAREDFLAGS = -shared ...@@ -27,24 +28,23 @@ SHAREDFLAGS = -shared
SHAREDEXT = so SHAREDEXT = so
endif endif
OBJECTS = src/raft_server.o src/raft_server_properties.o src/raft_node.o src/raft_log.o OBJECTS = \
$(BUILD_DIR)/raft_server.o \
$(BUILD_DIR)/raft_server_properties.o \
$(BUILD_DIR)/raft_node.o \
$(BUILD_DIR)/raft_log.o
all: static shared TEST_OBJECTS = $(patsubst $(BUILD_DIR)/%.o,$(BUILD_DIR)/test-%.o,$(OBJECTS))
clinkedlistqueue: TEST_HELPERS = \
mkdir -p $(LLQUEUE_DIR)/.git $(TEST_DIR)/CuTest.o \
git --git-dir=$(LLQUEUE_DIR)/.git init $(TEST_DIR)/linked_list_queue.o \
pushd $(LLQUEUE_DIR); git pull http://github.com/willemt/CLinkedListQueue; popd $(TEST_DIR)/mock_send_functions.o
download-contrib: clinkedlistqueue TESTS = $(wildcard $(TEST_DIR)/test_*.c)
TEST_TARGETS = $(patsubst $(TEST_DIR)/%.c,$(BIN_DIR)/%,$(TESTS))
.PHONY: $(TEST_DIR)/main_test.c all: static shared
$(TEST_DIR)/main_test.c:
if test -d $(LLQUEUE_DIR); \
then echo have contribs; \
else make download-contrib; \
fi
cd $(TEST_DIR) && sh make-tests.sh "test_*.c" > main_test.c && cd ..
.PHONY: shared .PHONY: shared
shared: $(OBJECTS) shared: $(OBJECTS)
...@@ -55,10 +55,25 @@ static: $(OBJECTS) ...@@ -55,10 +55,25 @@ static: $(OBJECTS)
ar -r libraft.a $(OBJECTS) ar -r libraft.a $(OBJECTS)
.PHONY: tests .PHONY: tests
tests: src/raft_server.c src/raft_server_properties.c src/raft_log.c src/raft_node.c $(TEST_DIR)/main_test.c $(TEST_DIR)/test_server.c $(TEST_DIR)/test_node.c $(TEST_DIR)/test_log.c $(TEST_DIR)/test_log_impl.c $(TEST_DIR)/test_snapshotting.c $(TEST_DIR)/test_scenario.c $(TEST_DIR)/mock_send_functions.c $(TEST_DIR)/CuTest.c $(LLQUEUE_DIR)/linked_list_queue.c tests: $(TEST_TARGETS)
$(CC) $(CFLAGS) -o tests_main $^ gcov $(TEST_OBJECTS)
./tests_main
gcov raft_server.c $(TEST_TARGETS): $(BIN_DIR)/%: $(TEST_OBJECTS) $(TEST_HELPERS)
$(CC) $(TEST_CFLAGS) $(TEST_DIR)/$*.c $(LIB) $(INC) $^ -o $@
./$@
$(BUILD_DIR)/test-%.o: $(SRC_DIR)/%.c
$(CC) $(TEST_CFLAGS) $(INC) -c -o $@ $<
$(TEST_DIR)/%.o: $(TEST_DIR)/%.c
$(CC) $(TEST_CFLAGS) $(INC) -c -o $@ $<
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
.PHONY: test_helper
test_helper: $(TEST_HELPERS)
$(CC) $(TEST_CFLAGS) -o $@
.PHONY: test_fuzzer .PHONY: test_fuzzer
test_fuzzer: test_fuzzer:
...@@ -94,7 +109,6 @@ do_infer: ...@@ -94,7 +109,6 @@ do_infer:
infer -- make infer -- make
clean: clean:
@rm -f $(TEST_DIR)/main_test.c src/*.o $(GCOV_OUTPUT); \ @rm -f src/*.o bin/* src/*.gcda src/*.gcno *.gcno *.gcda *.gcov tests/*.o tests/*.gcda tests/*.gcno; \
if [ -f "libraft.$(SHAREDEXT)" ]; then rm libraft.$(SHAREDEXT); fi;\ if [ -f "libraft.$(SHAREDEXT)" ]; then rm libraft.$(SHAREDEXT); fi;\
if [ -f libraft.a ]; then rm libraft.a; fi;\ if [ -f libraft.a ]; then rm libraft.a; fi;
if [ -f tests_main ]; then rm tests_main; fi;
# Ignore everything in this directory
*
# Except this file
!.gitignore
/*
Copyright (c) 2011, Willem-Hendrik Thiart
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* The names of its contributors may not be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL WILLEM-HENDRIK THIART BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <assert.h>
#include "linked_list_queue.h"
void *llqueue_new()
{
linked_list_queue_t *qu;
qu = calloc(1, sizeof(linked_list_queue_t));
return qu;
}
void llqueue_free(
linked_list_queue_t * qu
)
{
llqnode_t *node;
node = qu->head;
while (node)
{
llqnode_t *prev;
prev = node;
node = node->next;
free(prev);
}
free(qu);
}
void *llqueue_poll(
linked_list_queue_t * qu
)
{
llqnode_t *node;
void *item;
if (qu->head == NULL)
return NULL;
node = qu->head;
item = node->item;
if (qu->tail == qu->head)
qu->tail = NULL;
qu->head = node->next;
free(node);
qu->count--;
return item;
}
void llqueue_offer(
linked_list_queue_t * qu,
void *item
)
{
llqnode_t *node;
node = malloc(sizeof(llqnode_t));
node->item = item;
node->next = NULL;
if (qu->tail)
qu->tail->next = node;
if (!qu->head)
qu->head = node;
qu->tail = node;
qu->count++;
}
void *llqueue_remove_item(
linked_list_queue_t * qu,
const void *item
)
{
llqnode_t *node, *prev;
prev = NULL;
node = qu->head;
while (node)
{
void *ritem;
if (node->item == item)
{
if (node == qu->head)
{
return llqueue_poll(qu);
}
else
{
prev->next = node->next;
if (node == qu->tail)
{
qu->tail = prev;
}
qu->count--;
ritem = node->item;
free(node);
return ritem;
}
}
prev = node;
node = node->next;
}
return NULL;
}
void *llqueue_remove_item_via_cmpfunction(
linked_list_queue_t * qu,
const void *item,
int (*cmp)(const void*, const void*)
)
{
llqnode_t *node, *prev;
assert(cmp);
assert(item);
prev = NULL;
node = qu->head;
while (node)
{
void *ritem;
if (0 == cmp(node->item,item))
{
if (node == qu->head)
{
return llqueue_poll(qu);
}
else
{
prev->next = node->next;
if (node == qu->tail)
{
qu->tail = prev;
}
qu->count--;
ritem = node->item;
free(node);
return ritem;
}
}
prev = node;
node = node->next;
}
return NULL;
}
void *llqueue_get_item_via_cmpfunction(
linked_list_queue_t * qu,
const void *item,
long (*cmp)(const void*, const void*)
)
{
llqnode_t *node;
assert(cmp);
assert(item);
node = qu->head;
while (node)
{
if (0 == cmp(node->item,item))
{
return node->item;
}
node = node->next;
}
return NULL;
}
int llqueue_count(
const linked_list_queue_t * qu
)
{
return qu->count;
}
#ifndef LINKED_LIST_QUEUE_H
#define LINKED_LIST_QUEUE_H
typedef struct llqnode_s llqnode_t;
struct llqnode_s
{
llqnode_t *next;
void *item;
};
typedef struct
{
llqnode_t *head, *tail;
int count;
} linked_list_queue_t;
void *llqueue_new(
);
void llqueue_free(
linked_list_queue_t * qu
);
void *llqueue_poll(
linked_list_queue_t * qu
);
void llqueue_offer(
linked_list_queue_t * qu,
void *item
);
/**
* remove this item, by comparing the memory address of the item */
void *llqueue_remove_item(
linked_list_queue_t * qu,
const void *item
);
int llqueue_count(
const linked_list_queue_t * qu
);
/**
* remove this item, by using the supplied compare function */
void *llqueue_remove_item_via_cmpfunction(
linked_list_queue_t * qu,
const void *item,
int (*cmp)(const void*, const void*));
/**
* get this item, by using the supplied compare function */
void *llqueue_get_item_via_cmpfunction(
linked_list_queue_t * qu,
const void *item,
long (*cmp)(const void*, const void*));
#endif /* LINKED_LIST_QUEUE_H */
#!/bin/bash
# Auto generate single AllTests file for CuTest.
# Searches through all *.c files in the current directory.
# Prints to stdout.
# Author: Asim Jalis
# Date: 01/08/2003
FILES=*.c
#if test $# -eq 0 ; then FILES=*.c ; else FILES=$* ; fi
echo '
/* This is auto-generated code. Edit at your own peril. */
#include <stdio.h>
#include "CuTest.h"
'
cat $FILES | grep '^void Test' |
sed -e 's/(.*$//' \
-e 's/$/(CuTest*);/' \
-e 's/^/extern /'
echo \
'
int RunAllTests(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
'
cat $FILES | grep '^void Test' |
sed -e 's/^void //' \
-e 's/(.*$//' \
-e 's/^/ SUITE_ADD_TEST(suite, /' \
-e 's/$/);/'
echo \
'
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
int main()
{
return RunAllTests();
}
'
...@@ -522,3 +522,33 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc) ...@@ -522,3 +522,33 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
CuAssertIntEquals(tc, n_etys, 1); CuAssertIntEquals(tc, n_etys, 1);
CuAssertIntEquals(tc, e[0]->id, 2); CuAssertIntEquals(tc, e[0]->id, 2);
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestLog_new_is_empty);
SUITE_ADD_TEST(suite, TestLog_append_is_not_empty);
SUITE_ADD_TEST(suite, TestLog_get_at_idx);
SUITE_ADD_TEST(suite, TestLog_get_at_idx_returns_null_where_out_of_bounds);
SUITE_ADD_TEST(suite, TestLog_delete);
SUITE_ADD_TEST(suite, TestLog_delete_onwards);
SUITE_ADD_TEST(suite, TestLog_delete_handles_log_pop_failure);
SUITE_ADD_TEST(suite, TestLog_delete_fails_for_idx_zero);
SUITE_ADD_TEST(suite, TestLog_poll);
SUITE_ADD_TEST(suite, TestLog_peektail);
SUITE_ADD_TEST(suite, TestLog_load_from_snapshot);
SUITE_ADD_TEST(suite, TestLog_load_from_snapshot_clears_log);
SUITE_ADD_TEST(suite, TestLog_front_pushes_across_boundary);
SUITE_ADD_TEST(suite, TestLog_front_and_back_pushed_across_boundary_with_enlargement_required);
SUITE_ADD_TEST(suite, TestLog_delete_after_polling);
SUITE_ADD_TEST(suite, TestLog_delete_after_polling_from_double_append);
SUITE_ADD_TEST(suite, TestLog_get_from_idx_with_base_off_by_one);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
...@@ -256,7 +256,7 @@ void TestLogImpl_load_from_snapshot_clears_log(CuTest * tc) ...@@ -256,7 +256,7 @@ void TestLogImpl_load_from_snapshot_clears_log(CuTest * tc)
void *l; void *l;
l = impl->init(NULL, NULL); l = impl->init(NULL, NULL);
__LOGIMPL_APPEND_ENTRIES_SEQ_ID(l, 2, 1, 0, NULL); __LOGIMPL_APPEND_ENTRIES_SEQ_ID(l, 2, 1, 0, NULL);
CuAssertIntEquals(tc, 2, impl->count(l)); CuAssertIntEquals(tc, 2, impl->count(l));
CuAssertIntEquals(tc, 2, impl->current_idx(l)); CuAssertIntEquals(tc, 2, impl->current_idx(l));
...@@ -344,3 +344,29 @@ void TestLogImpl_get_from_idx_with_base_off_by_one(CuTest * tc) ...@@ -344,3 +344,29 @@ void TestLogImpl_get_from_idx_with_base_off_by_one(CuTest * tc)
CuAssertIntEquals(tc, impl->get_batch(l, 2, 1, e), 1); CuAssertIntEquals(tc, impl->get_batch(l, 2, 1, e), 1);
CuAssertIntEquals(tc, e[0]->id, 2); CuAssertIntEquals(tc, e[0]->id, 2);
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestLogImpl_new_is_empty);
SUITE_ADD_TEST(suite, TestLogImpl_append_is_not_empty);
SUITE_ADD_TEST(suite, TestLogImpl_get_at_idx);
SUITE_ADD_TEST(suite, TestLogImpl_get_at_idx_returns_null_where_out_of_bounds);
SUITE_ADD_TEST(suite, TestLogImpl_pop);
SUITE_ADD_TEST(suite, TestLogImpl_pop_onwards);
SUITE_ADD_TEST(suite, TestLogImpl_pop_fails_for_idx_zero);
SUITE_ADD_TEST(suite, TestLogImpl_poll);
SUITE_ADD_TEST(suite, TestLogImpl_reset_after_compaction);
SUITE_ADD_TEST(suite, TestLogImpl_load_from_snapshot_clears_log);
SUITE_ADD_TEST(suite, TestLogImpl_pop_after_polling);
SUITE_ADD_TEST(suite, TestLogImpl_pop_after_polling_from_double_append);
SUITE_ADD_TEST(suite, TestLogImpl_get_from_idx_with_base_off_by_one);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
...@@ -22,3 +22,19 @@ void TestRaft_node_set_nextIdx(CuTest * tc) ...@@ -22,3 +22,19 @@ void TestRaft_node_set_nextIdx(CuTest * tc)
raft_node_set_next_idx(p, 3); raft_node_set_next_idx(p, 3);
CuAssertTrue(tc, 3 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 3 == raft_node_get_next_idx(p));
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestRaft_is_voting_by_default);
SUITE_ADD_TEST(suite, TestRaft_node_set_nextIdx);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
...@@ -85,3 +85,18 @@ one_more_time: ...@@ -85,3 +85,18 @@ one_more_time:
CuAssertTrue(tc, 0 != leaders); CuAssertTrue(tc, 0 != leaders);
CuAssertTrue(tc, 1 == leaders); CuAssertTrue(tc, 1 == leaders);
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestRaft_scenario_leader_appears);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
...@@ -3813,3 +3813,134 @@ void TestRaft_read_action_callback( ...@@ -3813,3 +3813,134 @@ void TestRaft_read_action_callback(
CuAssertIntEquals(tc, 1, ra.calls); CuAssertIntEquals(tc, 1, ra.calls);
CuAssertIntEquals(tc, 0, ra.last_cb_safe); CuAssertIntEquals(tc, 0, ra.last_cb_safe);
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestRaft_server_voted_for_records_who_we_voted_for);
SUITE_ADD_TEST(suite, TestRaft_server_get_my_node);
SUITE_ADD_TEST(suite, TestRaft_server_idx_starts_at_1);
SUITE_ADD_TEST(suite, TestRaft_server_currentterm_defaults_to_0);
SUITE_ADD_TEST(suite, TestRaft_server_set_currentterm_sets_term);
SUITE_ADD_TEST(suite, TestRaft_server_voting_results_in_voting);
SUITE_ADD_TEST(suite, TestRaft_server_add_node_makes_non_voting_node_voting);
SUITE_ADD_TEST(suite, TestRaft_server_add_node_with_already_existing_id_is_not_allowed);
SUITE_ADD_TEST(suite, TestRaft_server_add_non_voting_node_with_already_existing_id_is_not_allowed);
SUITE_ADD_TEST(suite, TestRaft_server_add_non_voting_node_with_already_existing_voting_id_is_not_allowed);
SUITE_ADD_TEST(suite, TestRaft_server_remove_node);
SUITE_ADD_TEST(suite, TestRaft_election_start_increments_term);
SUITE_ADD_TEST(suite, TestRaft_set_state);
SUITE_ADD_TEST(suite, TestRaft_server_starts_as_follower);
SUITE_ADD_TEST(suite, TestRaft_server_starts_with_election_timeout_of_1000ms);
SUITE_ADD_TEST(suite, TestRaft_server_starts_with_request_timeout_of_200ms);
SUITE_ADD_TEST(suite, TestRaft_server_entry_append_increases_logidx);
SUITE_ADD_TEST(suite, TestRaft_server_append_entry_means_entry_gets_current_term);
SUITE_ADD_TEST(suite, TestRaft_server_append_entry_is_retrievable);
SUITE_ADD_TEST(suite, TestRaft_server_entry_is_retrieveable_using_idx);
SUITE_ADD_TEST(suite, TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply);
SUITE_ADD_TEST(suite, TestRaft_server_wont_apply_entry_if_there_isnt_a_majority);
SUITE_ADD_TEST(suite, TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx);
SUITE_ADD_TEST(suite, TestRaft_user_applylog_error_propogates_to_periodic);
SUITE_ADD_TEST(suite, TestRaft_server_apply_entry_increments_last_applied_idx);
SUITE_ADD_TEST(suite, TestRaft_server_periodic_elapses_election_timeout);
SUITE_ADD_TEST(suite, TestRaft_server_election_timeout_does_not_promote_us_to_leader_if_there_is_are_more_than_1_nodes);
SUITE_ADD_TEST(suite, TestRaft_server_election_timeout_does_not_promote_us_to_leader_if_we_are_not_voting_node);
SUITE_ADD_TEST(suite, TestRaft_server_election_timeout_does_not_start_election_if_there_are_no_voting_nodes);
SUITE_ADD_TEST(suite, TestRaft_server_election_timeout_does_promote_us_to_leader_if_there_is_only_1_node);
SUITE_ADD_TEST(suite, TestRaft_server_election_timeout_does_promote_us_to_leader_if_there_is_only_1_voting_node);
SUITE_ADD_TEST(suite, TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node);
SUITE_ADD_TEST(suite, TestRaft_server_recv_entry_fails_if_there_is_already_a_voting_change);
SUITE_ADD_TEST(suite, TestRaft_server_cfg_sets_num_nodes);
SUITE_ADD_TEST(suite, TestRaft_server_cant_get_node_we_dont_have);
SUITE_ADD_TEST(suite, TestRaft_votes_are_majority_is_true);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_not_granted);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_term_is_not_equal);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_response_increase_votes_for_me);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_requestvote_does_not_step_down);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_reply_true_if_term_greater_than_or_equal_to_current_term);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_reset_timeout);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than_current_term);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_depends_on_candidate_id);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_dont_grant_vote_if_we_didnt_vote_for_this_candidate);
SUITE_ADD_TEST(suite, TestRaft_server_recv_requestvote_ignore_if_master_is_fresh);
SUITE_ADD_TEST(suite, TestRaft_follower_becomes_follower_is_follower);
SUITE_ADD_TEST(suite, TestRaft_follower_becomes_follower_does_not_clear_voted_for);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_does_not_need_node);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specified);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_increases_log);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_idx_which_matches_prev_log_term);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries_via_prev_log_idx);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries_via_prev_log_idx_at_idx_0);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries_greater_than_prev_log_idx);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_log);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_partial_failures);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_failure_includes_current_idx);
SUITE_ADD_TEST(suite, TestRaft_follower_becomes_candidate_when_election_timeout_occurs);
SUITE_ADD_TEST(suite, TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_heartbeat_does_not_overwrite_logs);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_does_not_deleted_commited_entries);
SUITE_ADD_TEST(suite, TestRaft_candidate_becomes_candidate_is_candidate);
SUITE_ADD_TEST(suite, TestRaft_follower_becoming_candidate_increments_current_term);
SUITE_ADD_TEST(suite, TestRaft_follower_becoming_candidate_votes_for_self);
SUITE_ADD_TEST(suite, TestRaft_follower_becoming_candidate_resets_election_timeout);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_resets_election_timeout);
SUITE_ADD_TEST(suite, TestRaft_follower_becoming_candidate_requests_votes_from_other_servers);
SUITE_ADD_TEST(suite, TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election);
SUITE_ADD_TEST(suite, TestRaft_candidate_receives_majority_of_votes_becomes_leader);
SUITE_ADD_TEST(suite, TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted);
SUITE_ADD_TEST(suite, TestRaft_candidate_requestvote_includes_logidx);
SUITE_ADD_TEST(suite, TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_term_is_less_than_term);
SUITE_ADD_TEST(suite, TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower);
SUITE_ADD_TEST(suite, TestRaft_candidate_recv_appendentries_from_same_term_results_in_step_down);
SUITE_ADD_TEST(suite, TestRaft_leader_becomes_leader_is_leader);
SUITE_ADD_TEST(suite, TestRaft_leader_becomes_leader_does_not_clear_voted_for);
SUITE_ADD_TEST(suite, TestRaft_leader_when_becomes_leader_all_nodes_have_nextidx_equal_to_lastlog_idx_plus_1);
SUITE_ADD_TEST(suite, TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries);
SUITE_ADD_TEST(suite, TestRaft_leader_responds_to_entry_msg_when_entry_is_committed);
SUITE_ADD_TEST(suite, TestRaft_non_leader_recv_entry_msg_fails);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_with_leader_commit);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_with_prevLogIdx);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0);
SUITE_ADD_TEST(suite, TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency);
SUITE_ADD_TEST(suite, TestRaft_leader_append_entry_to_log_increases_idxno);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majority_have_entry_and_atleast_one_newer_entry);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_set_has_sufficient_logs_for_node);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_increase_commit_idx_using_voting_nodes_majority);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_duplicate_does_not_decrement_match_idx);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_because_of_old_terms_with_majority);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_retry_only_if_leader);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_without_node_fails);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_entry_resets_election_timeout);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_entry_fails_if_prevlogidx_less_than_commit);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nextid_to_0);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_increment_idx_of_node);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_drop_message_if_term_is_old);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_steps_down_if_term_is_newer);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_steps_down_if_newer);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_steps_down_if_newer_term);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_empty_appendentries_every_request_timeout);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_requestvote_responds_without_granting);
SUITE_ADD_TEST(suite, TestRaft_leader_recv_appendentries_response_set_has_sufficient_logs_after_voting_committed);
SUITE_ADD_TEST(suite, TestRaft_read_action_callback);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
...@@ -766,3 +766,34 @@ void TestRaft_leader_sends_snapshot_if_log_was_compacted(CuTest* tc) ...@@ -766,3 +766,34 @@ void TestRaft_leader_sends_snapshot_if_log_was_compacted(CuTest* tc)
CuAssertIntEquals(tc, 1, send_snapshot_count); CuAssertIntEquals(tc, 1, send_snapshot_count);
} }
int main(void)
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestRaft_leader_begin_snapshot_fails_if_no_logs_to_compact);
SUITE_ADD_TEST(suite, TestRaft_leader_will_not_apply_entry_if_snapshot_is_in_progress);
SUITE_ADD_TEST(suite, TestRaft_leader_snapshot_end_fails_if_snapshot_not_in_progress);
SUITE_ADD_TEST(suite, TestRaft_leader_snapshot_begin_fails_if_less_than_2_logs_to_compact);
SUITE_ADD_TEST(suite, TestRaft_leader_snapshot_end_succeeds_if_log_compacted);
SUITE_ADD_TEST(suite, TestRaft_leader_snapshot_end_succeeds_if_log_compacted2);
SUITE_ADD_TEST(suite, TestRaft_joinee_needs_to_get_snapshot);
SUITE_ADD_TEST(suite, TestRaft_follower_load_from_snapshot);
SUITE_ADD_TEST(suite, TestRaft_follower_load_from_snapshot_fails_if_term_is_0);
SUITE_ADD_TEST(suite, TestRaft_follower_load_from_snapshot_fails_if_already_loaded);
SUITE_ADD_TEST(suite, TestRaft_follower_load_from_snapshot_does_not_break_cluster_safety);
SUITE_ADD_TEST(suite, TestRaft_follower_load_from_snapshot_fails_if_log_is_newer);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_when_node_next_index_was_compacted);
SUITE_ADD_TEST(suite, TestRaft_recv_entry_fails_if_snapshot_in_progress);
SUITE_ADD_TEST(suite, TestRaft_recv_entry_succeeds_if_snapshot_nonblocking_apply_is_set);
SUITE_ADD_TEST(suite, TestRaft_follower_recv_appendentries_is_successful_when_previous_log_idx_equals_snapshot_last_idx);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_appendentries_with_correct_prev_log_idx_when_snapshotted);
SUITE_ADD_TEST(suite, TestRaft_cancel_snapshot_restores_state);
SUITE_ADD_TEST(suite, TestRaft_leader_sends_snapshot_if_log_was_compacted);
CuSuiteRun(suite);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount == 0 ? 0 : 1;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment