def setUp(self):
        state = Follower()
        self.oserver = Server(0, state, [], [])

        state = Candidate()
        self.server = Server(1, state, [], [self.oserver])

        self.oserver._neighbors.append(self.server)
示例#2
0
class TestLeaderServer(unittest.TestCase):
    ### Doing the initial setup for tests ##########

    def setUp(self):
        followers = []
        for i in range(1, 4):
            state = Follower()
            followers.append(Server(i, state, [], []))

        state = Leader()

        self.leader = Server(0, state, [], followers)

        for i in followers:
            i._neighbors.append(self.leader)

    ##### Unit test to send heart beat to all the neighbours ##############
    def test_leader_server_sends_heartbeat_to_all_neighbors(self):

        self._perform_hearbeat()
        self.assertEquals({1: 0, 2: 0, 3: 0}, self.leader._state._nextIndexes)

    ##### Unit test to ensure logs are getting committed to the neighbours ######
    def test_leader_server_sends_messages_to_append_neighbours_logs(self):

        self._perform_hearbeat()

        msg = AppendEntriesMessage(
            0, None, 1, {
                "prevLogIndex": 0,
                "prevLogTerm": 0,
                "leaderCommit": 1,
                "entries": [{
                    "term": 1,
                    "value": 800
                }]
            })

        self.leader.send_message(msg)

        for i in self.leader._neighbors:
            i.on_message(i.get_message())

        for i in self.leader._neighbors:
            self.assertEquals([{"term": 1, "value": 800}], i._log)

    ####### Function to simulate performing heartbeat for the unit test ############
    def _perform_hearbeat(self):
        self.leader._state._send_heart_beat()
        for i in self.leader._neighbors:
            i.on_message(i.get_message())

        for i in self.leader._board:
            self.leader.on_message(i)
class TestCandidateServer(unittest.TestCase):
    ### Doing the initial setup for tests ##########

    def setUp(self):
        state = Follower()
        self.oserver = Server(0, state, [], [])

        state = Candidate()
        self.server = Server(1, state, [], [self.oserver])

        self.oserver._neighbors.append(self.server)

# unit test to check if communication between candidate and follower

    def test_candidate_can_communicate_with_the_follower(self):

        self.assertEquals(1, len(self.oserver._board))

        self.oserver.on_message(self.oserver.get_message())

        self.assertEquals(1, len(self.server._board))
        self.assertEquals(True, self.server.get_message().data["response"])


### Candidate starting the election and gets vote from majority ##############

    def test_candidate_server_wins_election(self):
        state = Follower()
        server0 = Server(0, state, [], [])

        state = Follower()
        server3 = Server(3, state, [], [])

        state = Follower()
        oserver = Server(1, state, [], [])

        state = Candidate()
        server = Server(2, state, [], [oserver, server0, server3])

        server0._neighbors.append(server)
        oserver._neighbors.append(server)
        server3._neighbors.append(server)

        oserver.on_message(oserver.get_message())
        server0.on_message(server0.get_message())
        server3.on_message(server3.get_message())

        server._total_nodes = 4

        server.on_message(server.get_message())
        server.on_message(server.get_message())

        self.assertEquals(type(server._state), Leader)
示例#4
0
    def setUp(self):
        followers = []
        for i in range(1, 4):
            state = Follower()
            followers.append(Server(i, state, [], []))

        state = Leader()

        self.leader = Server(0, state, [], followers)

        for i in followers:
            i._neighbors.append(self.leader)
示例#5
0
class TestFollowerServer(unittest.TestCase):
    ### Doing the initial setup for tests ##########
    def setUp(self):
        state = Follower()
        self.oserver = Server(0, state, [], [])

        state = Follower()
        self.server = Server(1, state, [], [self.oserver])

    ## Unit test to send heartbeart message to neighbours ################
    def test_follower_server_on_message(self):
        input_message = AppendEntriesMessage(0, 1, 10, {})
        self.server.on_message(input_message)
        self.assertEquals(10, self.server._currentTerm)

    ## Unit test to reject message with lesser term ###########
    def test_follower_server_on_receive_message_with_lesser_term(self):
        input_message = AppendEntriesMessage(0, 1, -1, {})
        self.server.on_message(input_message)
        self.assertEquals(False, self.oserver.get_message().data["response"])

    #### Unit test to append log to an initial empty log##################
    def test_follower_server_on_receiving_message_to_empty_logs(self):
        msg = AppendEntriesMessage(
            0, 1, 2, {
                "prevLogIndex": 0,
                "prevLogTerm": 100,
                "leaderCommit": 1,
                "entries": [{
                    "term": 1,
                    "value": 100
                }]
            })

        self.server.on_message(msg)
        self.assertEquals({"term": 1, "value": 100}, self.server._log[0])

    ## Unit test to test if follower is receiving message from candidate ######
    def test_follower_server_on_receive_request_for_voting(self):
        msg = RequestVoteMessage(0, 1, 2, {
            "lastLogIndex": 0,
            "lastLogTerm": 0,
            "entries": []
        })
        self.server.on_message(msg)
        self.assertEquals(0, self.server._state._last_vote)
        self.assertEquals(True, self.oserver.get_message().data["response"])
                message_data = "the number now is" + str(i)
                followers[1].send_data(message_data)
                print("the message has been sent")
        time.sleep(1)


print("\n\nCreating four servers with names ranging from 0-3")

# Create Servers
followers = []
for name in range(4):

    ## Each server has a state out of (Candidate, Follower, Leader)
    ## Initially each candidate starts with follower state
    state = Follower()
    server = Server(name, state, [], [])

    ## Appending all neighbours to the current server
    for follower in followers:
        follower._neighbors.append(server)
        server._neighbors.append(follower)

    ## Attaching a thread to the server
    followers.append(server)
    thread = Thread(target=serverFunction, args=(name, ))
    thread.start()
    print("Started server with name ", name)
print("\nWait until first timer timesout")

thread = Thread(target=checkMesages, args=())
thread.start()
    def test_candidate_server_wins_election(self):
        state = Follower()
        server0 = Server(0, state, [], [])

        state = Follower()
        server3 = Server(3, state, [], [])

        state = Follower()
        oserver = Server(1, state, [], [])

        state = Candidate()
        server = Server(2, state, [], [oserver, server0, server3])

        server0._neighbors.append(server)
        oserver._neighbors.append(server)
        server3._neighbors.append(server)

        oserver.on_message(oserver.get_message())
        server0.on_message(server0.get_message())
        server3.on_message(server3.get_message())

        server._total_nodes = 4

        server.on_message(server.get_message())
        server.on_message(server.get_message())

        self.assertEquals(type(server._state), Leader)
示例#8
0
    def setUp(self):
        state = Follower()
        self.oserver = Server(0, state, [], [])

        state = Follower()
        self.server = Server(1, state, [], [self.oserver])