Commit eafd1f35 authored by Grégory Wisniewski's avatar Grégory Wisniewski

Partial work on election handler tests rewrite.

git-svn-id: https://svn.erp5.org/repos/neo/trunk@1514 71dcc9de-d417-0410-9af5-da40c76e7ee4
parent 6645329f
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
import unittest import unittest
from mock import Mock from mock import Mock
from neo import protocol
from neo.tests import NeoTestBase from neo.tests import NeoTestBase
from neo.protocol import Packet, Packets, NodeTypes, NodeStates, INVALID_UUID from neo.protocol import Packet, Packets, NodeTypes, NodeStates, INVALID_UUID
from neo.master.handlers.election import ClientElectionHandler, ServerElectionHandler from neo.master.handlers.election import ClientElectionHandler, ServerElectionHandler
...@@ -39,7 +40,7 @@ class MasterClientElectionTests(NeoTestBase): ...@@ -39,7 +40,7 @@ class MasterClientElectionTests(NeoTestBase):
def setUp(self): def setUp(self):
# create an application object # create an application object
config = self.getMasterConfiguration() config = self.getMasterConfiguration(master_number=2)
self.app = Application(config) self.app = Application(config)
self.app.pt.clear() self.app.pt.clear()
self.app.em = Mock({"getConnectionList" : []}) self.app.em = Mock({"getConnectionList" : []})
...@@ -64,12 +65,15 @@ class MasterClientElectionTests(NeoTestBase): ...@@ -64,12 +65,15 @@ class MasterClientElectionTests(NeoTestBase):
ClientConnection.expectMessage = self.expectMessage ClientConnection.expectMessage = self.expectMessage
NeoTestBase.tearDown(self) NeoTestBase.tearDown(self)
def identifyToMasterNode(self, port=10000, ip='127.0.0.1'): def identifyToMasterNode(self, index=0):
uuid = self.getNewUUID() self.assertTrue(index < len(self.app.nm.getMasterList()))
address = (ip, port) node = self.app.nm.getMasterList()[index]
self.app.nm.createMaster(address=address, uuid=uuid, node.setUUID(self.getNewUUID())
state=NodeStates.RUNNING) conn = Mock({
return uuid "getUUID" : node.getUUID(),
"getAddress" : node.getAddress(),
})
return (node, conn)
def test_01_connectionStarted(self): def test_01_connectionStarted(self):
uuid = self.identifyToMasterNode(port=self.master_port) uuid = self.identifyToMasterNode(port=self.master_port)
...@@ -239,7 +243,7 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -239,7 +243,7 @@ class MasterServerElectionTests(NeoTestBase):
def setUp(self): def setUp(self):
# create an application object # create an application object
config = self.getMasterConfiguration() config = self.getMasterConfiguration(master_number=1)
self.app = Application(config) self.app = Application(config)
self.app.pt.clear() self.app.pt.clear()
self.app.em = Mock({"getConnectionList" : []}) self.app.em = Mock({"getConnectionList" : []})
...@@ -250,8 +254,9 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -250,8 +254,9 @@ class MasterServerElectionTests(NeoTestBase):
self.app.unconnected_master_node_set.add(node.getAddress()) self.app.unconnected_master_node_set.add(node.getAddress())
node.setState(NodeStates.RUNNING) node.setState(NodeStates.RUNNING)
# define some variable to simulate client and storage node # define some variable to simulate client and storage node
self.storage_port = 10021 self.client_address = ('127.0.0.1', 1000)
self.master_port = 10011 self.storage_address = ('127.0.0.1', 2000)
self.master_address = ('127.0.0.1', 3000)
# apply monkey patches # apply monkey patches
self._addPacket = ClientConnection._addPacket self._addPacket = ClientConnection._addPacket
self.expectMessage = ClientConnection.expectMessage self.expectMessage = ClientConnection.expectMessage
...@@ -264,12 +269,18 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -264,12 +269,18 @@ class MasterServerElectionTests(NeoTestBase):
ClientConnection._addPacket = self._addPacket ClientConnection._addPacket = self._addPacket
ClientConnection.expectMessage = self.expectMessage ClientConnection.expectMessage = self.expectMessage
def identifyToMasterNode(self, node_type=NodeTypes.STORAGE, ip="127.0.0.1", def identifyToMasterNode(self, uuid=True):
port=10021): node = self.app.nm.getMasterList()[0]
"""Do first step of identification to MN # self.app.unconnected_master_node_set.remove(node)
""" # self.app.negotiating_master_node_set.add(node)
uuid = self.getNewUUID() if uuid not in (True, None):
return uuid uuid = self.getNewUUID()
node.setUUID(uuid)
conn = Mock({
"getUUID": uuid,
"getAddress": node.getAddress(),
})
return (node, conn)
def checkCalledAskPrimary(self, conn, packet_number=0): def checkCalledAskPrimary(self, conn, packet_number=0):
...@@ -412,8 +423,8 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -412,8 +423,8 @@ class MasterServerElectionTests(NeoTestBase):
args = (NodeTypes.MASTER, uuid, ('127.0.0.1', self.master_port), args = (NodeTypes.MASTER, uuid, ('127.0.0.1', self.master_port),
self.app.pt.getPartitions(), self.app.pt.getReplicas(), self.app.uuid) self.app.pt.getPartitions(), self.app.pt.getReplicas(), self.app.uuid)
p = Packets.AcceptIdentification(*args) p = Packets.AcceptIdentification(*args)
self.assertEqual(len(self.app.unconnected_master_node_set), 0) self.assertEqual(len(self.app.unconnected_master_node_set), 1)
self.assertEqual(len(self.app.negotiating_master_node_set), 1) self.assertEqual(len(self.app.negotiating_master_node_set), 0)
self.assertEqual(self.app.nm.getByAddress(conn.getAddress()).getUUID(), None) self.assertEqual(self.app.nm.getByAddress(conn.getAddress()).getUUID(), None)
self.assertEqual(conn.getUUID(), None) self.assertEqual(conn.getUUID(), None)
self.assertEqual(len(conn.getConnector().mockGetNamedCalls("_addPacket")),1) self.assertEqual(len(conn.getConnector().mockGetNamedCalls("_addPacket")),1)
...@@ -512,37 +523,6 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -512,37 +523,6 @@ class MasterServerElectionTests(NeoTestBase):
name=self.app.name,) name=self.app.name,)
def test_12_announcePrimary(self):
election = self.election
uuid = self.identifyToMasterNode(port=self.master_port)
packet = Packets.AnnouncePrimary()
# No uuid
conn = Mock({"_addPacket" : None,
"getUUID" : None,
"isServer" : True,
"getAddress" : ("127.0.0.1", self.master_port)})
self.assertEqual(len(self.app.nm.getMasterList()), 1)
self.checkIdenficationRequired(election.announcePrimary, conn, packet)
# announce
conn = Mock({"_addPacket" : None,
"getUUID" : uuid,
"isServer" : True,
"getAddress" : ("127.0.0.1", self.master_port)})
self.assertEqual(self.app.primary, None)
self.assertEqual(self.app.primary_master_node, None)
election.announcePrimary(conn, packet)
self.assertEqual(self.app.primary, False)
self.assertNotEqual(self.app.primary_master_node, None)
# set current as primary, and announce another, must raise
conn = Mock({"_addPacket" : None,
"getUUID" : uuid,
"isServer" : True,
"getAddress" : ("127.0.0.1", self.master_port)})
self.app.primary = True
self.assertEqual(self.app.primary, True)
self.assertRaises(ElectionFailure, election.announcePrimary, conn, packet)
def test_13_reelectPrimary(self): def test_13_reelectPrimary(self):
election = self.election election = self.election
uuid = self.identifyToMasterNode(port=self.master_port) uuid = self.identifyToMasterNode(port=self.master_port)
...@@ -556,11 +536,11 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -556,11 +536,11 @@ class MasterServerElectionTests(NeoTestBase):
def test_14_notifyNodeInformation(self): def test_14_notifyNodeInformation(self):
election = self.election election = self.election
uuid = self.identifyToMasterNode(port=self.master_port) uuid = self.identifyToMasterNode()
packet = Packets.NotifyNodeInformation() packet = Packets.NotifyNodeInformation()
# do not answer if no uuid # do not answer if no uuid
conn = Mock({"getUUID" : None, conn = Mock({"getUUID" : None,
"getAddress" : ("127.0.0.1", self.master_port)}) "getAddress" : self.master_address})
node_list = [] node_list = []
self.checkIdenficationRequired(election.notifyNodeInformation, conn, packet, node_list) self.checkIdenficationRequired(election.notifyNodeInformation, conn, packet, node_list)
# tell the master node about itself, must do nothing # tell the master node about itself, must do nothing
...@@ -611,6 +591,95 @@ class MasterServerElectionTests(NeoTestBase): ...@@ -611,6 +591,95 @@ class MasterServerElectionTests(NeoTestBase):
self.assertEqual(node.getState(), NodeStates.DOWN) self.assertEqual(node.getState(), NodeStates.DOWN)
def __getClient(self):
uuid = self.getNewUUID()
conn = Mock({
'getUUID': uuid,
'getAddress': self.client_address,
'getConnector': Mock(),
})
self.app.nm.createClient(uuid=uuid, address=self.client_address)
return conn
def __getMaster(self, port=1000, register=True):
uuid = self.getNewUUID()
address = ('127.0.0.1', port)
conn = Mock({
'getUUID': uuid,
'getAddress': address,
'getConnector': Mock(),
})
if register:
self.app.nm.createMaster(uuid=uuid, address=address)
return conn
def testRequestIdentification1(self):
""" Check with a non-master node, must be refused """
conn = self.__getClient()
packet = protocol.RequestIdentification(
NodeTypes.CLIENT,
conn.getUUID(),
conn.getAddress(),
name=self.app.name,
)
self.checkNotReadyErrorRaised(
self.election.requestIdentification,
conn=conn,
packet=packet,
node_type=NodeTypes.CLIENT,
uuid=conn.getUUID(),
address=conn.getAddress(),
name=self.app.name
)
def testRequestIdentification2(self):
""" Check with an unknown master node """
conn = self.__getMaster(register=False)
packet = protocol.RequestIdentification(
NodeTypes.MASTER,
conn.getUUID(),
conn.getAddress(),
name=self.app.name,
)
self.checkProtocolErrorRaised(
self.election.requestIdentification,
conn=conn,
packet=packet,
node_type=NodeTypes.MASTER,
uuid=conn.getUUID(),
address=conn.getAddress(),
name=self.app.name,
)
def testAnnouncePrimary1(self):
""" check the wrong cases """
announce = self.election.announcePrimary
packet = Packets.AnnouncePrimary()
# No uuid
node, conn = self.identifyToMasterNode(uuid=None)
self.checkUnexpectedPacketRaised(announce, conn, packet)
# Announce to a primary, raise
self.app.primary = True
node, conn = self.identifyToMasterNode()
self.assertTrue(self.app.primary)
self.assertEqual(self.app.primary_master_node, None)
self.assertRaises(ElectionFailure, announce, conn, packet)
def testAnnouncePrimary2(self):
""" Check the good case """
announce = self.election.announcePrimary
packet = Packets.AnnouncePrimary()
# Announce, must set the primary
self.app.primary = False
node, conn = self.identifyToMasterNode()
self.assertFalse(self.app.primary)
self.assertFalse(self.app.primary_master_node)
announce(conn, packet)
self.assertFalse(self.app.primary)
self.assertEqual(self.app.primary_master_node, node)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
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