Commit 775fcbb1 authored by Grégory Wisniewski's avatar Grégory Wisniewski

Only one temporary directory is used for the test runner, each test method have

it's own directory to easily find related log files. The NeoFunctionalTest class
is added to provide the getTempDirectory() that return the path for the current
test method. Master functional test case now have the neo attribute, all test
cases inherit from NeoFunctionalTest.


git-svn-id: https://svn.erp5.org/repos/neo/branches/prototype3@1246 71dcc9de-d417-0410-9af5-da40c76e7ee4
parent 258b8410
...@@ -24,6 +24,7 @@ import ZODB ...@@ -24,6 +24,7 @@ import ZODB
import signal import signal
import random import random
import MySQLdb import MySQLdb
import unittest
import tempfile import tempfile
import traceback import traceback
...@@ -157,7 +158,7 @@ class NEOCluster(object): ...@@ -157,7 +158,7 @@ class NEOCluster(object):
partitions=1, replicas=0, port_base=10000, partitions=1, replicas=0, port_base=10000,
db_user='neo', db_password='neo', db_user='neo', db_password='neo',
db_super_user='root', db_super_password=None, db_super_user='root', db_super_password=None,
cleanup_on_delete=False): cleanup_on_delete=False, temp_dir=None):
self.cleanup_on_delete = cleanup_on_delete self.cleanup_on_delete = cleanup_on_delete
self.uuid_set = set() self.uuid_set = set()
self.db_super_user = db_super_user self.db_super_user = db_super_user
...@@ -167,10 +168,12 @@ class NEOCluster(object): ...@@ -167,10 +168,12 @@ class NEOCluster(object):
self.db_list = db_list self.db_list = db_list
self.process_dict = {} self.process_dict = {}
self.last_port = port_base self.last_port = port_base
self.temp_dir = temp_dir = tempfile.mkdtemp(prefix='neo_') if temp_dir is None:
temp_dir = tempfile.mkdtemp(prefix='neo_')
print 'Using temp directory %r.' % (temp_dir, ) print 'Using temp directory %r.' % (temp_dir, )
self.config_file_path = config_file_path = os.path.join(temp_dir, 'neo.conf') self.temp_dir = temp_dir
config_file = open(config_file_path, 'w') self.config_file_path = os.path.join(temp_dir, 'neo.conf')
config_file = open(self.config_file_path, 'w')
neo_admin_port = self.__allocatePort() neo_admin_port = self.__allocatePort()
self.cluster_name = cluster_name = 'neo_%s' % (random.randint(0, 100), ) self.cluster_name = cluster_name = 'neo_%s' % (random.randint(0, 100), )
master_node_dict = {} master_node_dict = {}
...@@ -468,3 +471,22 @@ class NEOCluster(object): ...@@ -468,3 +471,22 @@ class NEOCluster(object):
if self.cleanup_on_delete: if self.cleanup_on_delete:
os.removedirs(self.temp_dir) os.removedirs(self.temp_dir)
class NEOFunctionalTest(unittest.TestCase):
def getTempDirectory(self):
# get the current temp directory or a new one
temp_dir = os.environ.get('TEMP', None)
if temp_dir is None:
temp_dir = tempfile.mkdtemp(prefix='neo_')
# build the full path based on test case and current test method
test_case_name = self.__class__.__name__
test_method_name = self._TestCase__testMethodName
temp_dir = os.path.join(temp_dir, test_case_name)
temp_dir = os.path.join(temp_dir, test_method_name)
# build the path if needed
if not os.path.exists(temp_dir):
os.makedirs(temp_dir)
return temp_dir
...@@ -16,13 +16,14 @@ ...@@ -16,13 +16,14 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import unittest import unittest
from neo.tests.functional import NEOCluster from neo.tests.functional import NEOCluster, NEOFunctionalTest
from neo import protocol from neo import protocol
class ClusterTests(unittest.TestCase): class ClusterTests(NEOFunctionalTest):
def testClusterBreaks(self): def testClusterBreaks(self):
neo = NEOCluster(['test_neo1'], port_base=20000, master_node_count=1) neo = NEOCluster(['test_neo1'], port_base=20000, master_node_count=1,
temp_dir=self.getTempDirectory())
neoctl = neo.getNEOCTL() neoctl = neo.getNEOCTL()
neo.setupDB() neo.setupDB()
neo.start() neo.start()
...@@ -35,7 +36,8 @@ class ClusterTests(unittest.TestCase): ...@@ -35,7 +36,8 @@ class ClusterTests(unittest.TestCase):
def testClusterBreaksWithTwoNodes(self): def testClusterBreaksWithTwoNodes(self):
neo = NEOCluster(['test_neo1', 'test_neo2'], port_base=20000, neo = NEOCluster(['test_neo1', 'test_neo2'], port_base=20000,
partitions=2, master_node_count=1) partitions=2, master_node_count=1,
temp_dir=self.getTempDirectory())
neoctl = neo.getNEOCTL() neoctl = neo.getNEOCTL()
neo.setupDB() neo.setupDB()
neo.start() neo.start()
...@@ -48,7 +50,8 @@ class ClusterTests(unittest.TestCase): ...@@ -48,7 +50,8 @@ class ClusterTests(unittest.TestCase):
def testClusterDoesntBreakWithTwoNodesOneReplica(self): def testClusterDoesntBreakWithTwoNodesOneReplica(self):
neo = NEOCluster(['test_neo1', 'test_neo2'], port_base=20000, neo = NEOCluster(['test_neo1', 'test_neo2'], port_base=20000,
partitions=2, replicas=1, master_node_count=1) partitions=2, replicas=1, master_node_count=1,
temp_dir=self.getTempDirectory())
neoctl = neo.getNEOCTL() neoctl = neo.getNEOCTL()
neo.setupDB() neo.setupDB()
neo.start() neo.start()
......
...@@ -24,7 +24,7 @@ import ZODB ...@@ -24,7 +24,7 @@ import ZODB
from ZODB.FileStorage import FileStorage from ZODB.FileStorage import FileStorage
from Persistence import Persistent from Persistence import Persistent
from neo.tests.functional import NEOCluster from neo.tests.functional import NEOCluster, NEOFunctionalTest
from neo.client.Storage import Storage as NEOStorage from neo.client.Storage import Storage as NEOStorage
...@@ -42,14 +42,13 @@ class Tree(Persistent): ...@@ -42,14 +42,13 @@ class Tree(Persistent):
self.left = Tree(depth) self.left = Tree(depth)
class ImportExportTests(unittest.TestCase): class ImportExportTests(NEOFunctionalTest):
def setUp(self): def setUp(self):
self.temp_dir = tempfile.mkdtemp(prefix='neo_import_export_')
print "using the temp directory %s" % self.temp_dir
# create a neo cluster # create a neo cluster
databases = ['test_neo1', 'test_neo2'] databases = ['test_neo1', 'test_neo2']
self.neo = NEOCluster(databases, port_base=20000, master_node_count=2) self.neo = NEOCluster(databases, port_base=20000, master_node_count=2,
temp_dir=self.getTempDirectory())
self.neo.setupDB() self.neo.setupDB()
def tearDown(self): def tearDown(self):
......
...@@ -17,115 +17,123 @@ ...@@ -17,115 +17,123 @@
from time import sleep, time from time import sleep, time
import unittest import unittest
from neo.tests.functional import NEOCluster from neo.tests.functional import NEOCluster, NEOFunctionalTest
from neo.neoctl.neoctl import NotReadyException from neo.neoctl.neoctl import NotReadyException
from neo import protocol from neo import protocol
from neo.util import dump from neo.util import dump
MASTER_NODE_COUNT = 3 MASTER_NODE_COUNT = 3
neo = NEOCluster([], port_base=20000, master_node_count=MASTER_NODE_COUNT)
class MasterTests(unittest.TestCase): class MasterTests(NEOFunctionalTest):
def setUp(self): def setUp(self):
neo.stop() self.neo = NEOCluster([], port_base=20000,
neo.start() master_node_count=MASTER_NODE_COUNT,
self.storage = neo.getZODBStorage() temp_dir=self.getTempDirectory())
self.neoctl = neo.getNEOCTL() self.neo.stop()
self.neo.start()
self.storage = self.neo.getZODBStorage()
self.neoctl = self.neo.getNEOCTL()
def tearDown(self): def tearDown(self):
neo.stop() self.neo.stop()
def testStoppingSecondaryMaster(self): def testStoppingSecondaryMaster(self):
# Wait for masters to stabilize # Wait for masters to stabilize
neo.expectAllMasters(MASTER_NODE_COUNT) self.neo.expectAllMasters(MASTER_NODE_COUNT)
# Kill # Kill
killed_uuid_list = neo.killSecondaryMaster() killed_uuid_list = self.neo.killSecondaryMaster()
# Test sanity check. # Test sanity check.
self.assertEqual(len(killed_uuid_list), 1) self.assertEqual(len(killed_uuid_list), 1)
uuid = killed_uuid_list[0] uuid = killed_uuid_list[0]
# Check node state has changed. # Check node state has changed.
neo.expectMasterState(uuid, None) self.neo.expectMasterState(uuid, None)
def testStoppingPrimaryMasterWithTwoSecondaries(self): def testStoppingPrimaryMasterWithTwoSecondaries(self):
# Wait for masters to stabilize # Wait for masters to stabilize
neo.expectAllMasters(MASTER_NODE_COUNT) self.neo.expectAllMasters(MASTER_NODE_COUNT)
# Kill # Kill
killed_uuid_list = neo.killPrimaryMaster() killed_uuid_list = self.neo.killPrimaryMaster()
# Test sanity check. # Test sanity check.
self.assertEqual(len(killed_uuid_list), 1) self.assertEqual(len(killed_uuid_list), 1)
uuid = killed_uuid_list[0] uuid = killed_uuid_list[0]
# Check the state of the primary we just killed # Check the state of the primary we just killed
neo.expectMasterState(uuid, (None, protocol.UNKNOWN_STATE)) self.neo.expectMasterState(uuid, (None, protocol.UNKNOWN_STATE))
self.assertEqual(neo.getPrimaryMaster(), None) self.assertEqual(self.neo.getPrimaryMaster(), None)
# Check that a primary master arised. # Check that a primary master arised.
neo.expectPrimaryMaster(timeout=10) self.neo.expectPrimaryMaster(timeout=10)
# Check that the uuid really changed. # Check that the uuid really changed.
new_uuid = neo.getPrimaryMaster() new_uuid = self.neo.getPrimaryMaster()
self.assertNotEqual(new_uuid, uuid) self.assertNotEqual(new_uuid, uuid)
def testStoppingPrimaryMasterWithOneSecondary(self): def testStoppingPrimaryMasterWithOneSecondary(self):
neo.expectAllMasters(MASTER_NODE_COUNT, state=protocol.RUNNING_STATE) self.neo.expectAllMasters(MASTER_NODE_COUNT,
state=protocol.RUNNING_STATE)
# Kill one secondary master. # Kill one secondary master.
killed_uuid_list = neo.killSecondaryMaster() killed_uuid_list = self.neo.killSecondaryMaster()
# Test sanity checks. # Test sanity checks.
self.assertEqual(len(killed_uuid_list), 1) self.assertEqual(len(killed_uuid_list), 1)
neo.expectMasterState(killed_uuid_list[0], None) self.neo.expectMasterState(killed_uuid_list[0], None)
self.assertEqual(len(neo.getMasterNodeList()), 2) self.assertEqual(len(self.neo.getMasterNodeList()), 2)
killed_uuid_list = neo.killPrimaryMaster() killed_uuid_list = self.neo.killPrimaryMaster()
# Test sanity check. # Test sanity check.
self.assertEqual(len(killed_uuid_list), 1) self.assertEqual(len(killed_uuid_list), 1)
uuid = killed_uuid_list[0] uuid = killed_uuid_list[0]
# Check the state of the primary we just killed # Check the state of the primary we just killed
neo.expectMasterState(uuid, (None, protocol.UNKNOWN_STATE)) self.neo.expectMasterState(uuid, (None, protocol.UNKNOWN_STATE))
self.assertEqual(neo.getPrimaryMaster(), None) self.assertEqual(self.neo.getPrimaryMaster(), None)
# Check that a primary master arised. # Check that a primary master arised.
neo.expectPrimaryMaster(timeout=10) self.neo.expectPrimaryMaster(timeout=10)
# Check that the uuid really changed. # Check that the uuid really changed.
new_uuid = neo.getPrimaryMaster() new_uuid = self.neo.getPrimaryMaster()
self.assertNotEqual(new_uuid, uuid) self.assertNotEqual(new_uuid, uuid)
def testMasterSequentialStart(self): def testMasterSequentialStart(self):
neo.expectAllMasters(MASTER_NODE_COUNT, state=protocol.RUNNING_STATE) self.neo.expectAllMasters(MASTER_NODE_COUNT,
master_list = neo.getMasterProcessList() state=protocol.RUNNING_STATE)
master_list = self.neo.getMasterProcessList()
# Stop the cluster (so we can start processes manually) # Stop the cluster (so we can start processes manually)
neo.killMasters() self.neo.killMasters()
# Start the first master. # Start the first master.
first_master = master_list[0] first_master = master_list[0]
first_master.start() first_master.start()
first_master_uuid = first_master.getUUID() first_master_uuid = first_master.getUUID()
# Check that the master node we started elected itself. # Check that the master node we started elected itself.
neo.expectPrimaryMaster(first_master_uuid, timeout=60) self.neo.expectPrimaryMaster(first_master_uuid, timeout=60)
# Check that no other node is known as running. # Check that no other node is known as running.
self.assertEqual(len(neo.getMasterNodeList( self.assertEqual(len(self.neo.getMasterNodeList(
state=protocol.RUNNING_STATE)), 1) state=protocol.RUNNING_STATE)), 1)
# Start a second master. # Start a second master.
second_master = master_list[1] second_master = master_list[1]
# Check that the second master is known as being down. # Check that the second master is known as being down.
self.assertEqual(neo.getMasterNodeState(second_master.getUUID()), None) self.assertEqual(self.neo.getMasterNodeState(second_master.getUUID()),
None)
second_master.start() second_master.start()
# Check that the second master is running under his known UUID. # Check that the second master is running under his known UUID.
neo.expectMasterState(second_master.getUUID(), protocol.RUNNING_STATE) self.neo.expectMasterState(second_master.getUUID(),
protocol.RUNNING_STATE)
# Check that the primary master didn't change. # Check that the primary master didn't change.
self.assertEqual(neo.getPrimaryMaster(), first_master_uuid) self.assertEqual(self.neo.getPrimaryMaster(), first_master_uuid)
# Start a third master. # Start a third master.
third_master = master_list[2] third_master = master_list[2]
# Check that the third master is known as being down. # Check that the third master is known as being down.
self.assertEqual(neo.getMasterNodeState(third_master.getUUID()), None) self.assertEqual(self.neo.getMasterNodeState(third_master.getUUID()),
None)
third_master.start() third_master.start()
# Check that the third master is running under his known UUID. # Check that the third master is running under his known UUID.
neo.expectMasterState(third_master.getUUID(), protocol.RUNNING_STATE) self.neo.expectMasterState(third_master.getUUID(),
protocol.RUNNING_STATE)
# Check that the primary master didn't change. # Check that the primary master didn't change.
self.assertEqual(neo.getPrimaryMaster(), first_master_uuid) self.assertEqual(self.neo.getPrimaryMaster(), first_master_uuid)
def test_suite(): def test_suite():
return unittest.makeSuite(MasterTests) return unittest.makeSuite(MasterTests)
......
...@@ -20,7 +20,7 @@ import unittest ...@@ -20,7 +20,7 @@ import unittest
import transaction import transaction
from Persistence import Persistent from Persistence import Persistent
from neo.tests.functional import NEOCluster from neo.tests.functional import NEOCluster, NEOFunctionalTest
from neo.client.Storage import Storage as NEOStorage from neo.client.Storage import Storage as NEOStorage
from neo import protocol from neo import protocol
...@@ -32,7 +32,7 @@ class PObject(Persistent): ...@@ -32,7 +32,7 @@ class PObject(Persistent):
OBJECT_NUMBER = 100 OBJECT_NUMBER = 100
class StorageTests(unittest.TestCase): class StorageTests(NEOFunctionalTest):
def setUp(self): def setUp(self):
self.neo = None self.neo = None
...@@ -52,6 +52,7 @@ class StorageTests(unittest.TestCase): ...@@ -52,6 +52,7 @@ class StorageTests(unittest.TestCase):
port_base=20000, port_base=20000,
master_node_count=2, master_node_count=2,
partitions=10, replicas=replicas, partitions=10, replicas=replicas,
temp_dir=self.getTempDirectory(),
) )
self.neo.setupDB() self.neo.setupDB()
# too many pending storage nodes requested # too many pending storage nodes requested
......
...@@ -23,7 +23,7 @@ from persistent import Persistent ...@@ -23,7 +23,7 @@ from persistent import Persistent
from persistent.mapping import PersistentMapping from persistent.mapping import PersistentMapping
import transaction import transaction
from neo.tests.functional import NEOCluster from neo.tests.functional import NEOCluster, NEOFunctionalTest
class P(Persistent): class P(Persistent):
pass pass
...@@ -42,7 +42,7 @@ neo = NEOCluster(['test_neo1'], ...@@ -42,7 +42,7 @@ neo = NEOCluster(['test_neo1'],
partitions=1, replicas=0, port_base=20000, partitions=1, replicas=0, port_base=20000,
master_node_count=1) master_node_count=1)
class ZODBTests(unittest.TestCase): class ZODBTests(NEOFunctionalTest):
def setUp(self): def setUp(self):
neo.stop() neo.stop()
......
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