Commit 4150ffb1 authored by Julien Muchembled's avatar Julien Muchembled

qa: new expectedFailure testcase method

The idea is to write:

  with self.expectedFailure(...): \

just before the statement that is expected to fail. Contrary to the existing
decorator, we want to:
- be sure that the test fails at the expected line;
- be able to remove an expectedFailure without touching the code around.
parent 7494de84
...@@ -28,6 +28,7 @@ import weakref ...@@ -28,6 +28,7 @@ import weakref
import MySQLdb import MySQLdb
import transaction import transaction
from contextlib import contextmanager
from ConfigParser import SafeConfigParser from ConfigParser import SafeConfigParser
from cStringIO import StringIO from cStringIO import StringIO
try: try:
...@@ -215,6 +216,14 @@ class NeoTestBase(unittest.TestCase): ...@@ -215,6 +216,14 @@ class NeoTestBase(unittest.TestCase):
expected if isinstance(expected, str) else '|'.join(expected), expected if isinstance(expected, str) else '|'.join(expected),
'|'.join(pt._formatRows(sorted(pt.count_dict, key=key)))) '|'.join(pt._formatRows(sorted(pt.count_dict, key=key))))
@contextmanager
def expectedFailure(self, exception=AssertionError, regex=None):
with self.assertRaisesRegexp(exception, regex) as cm:
yield
raise _UnexpectedSuccess
# XXX: passing sys.exc_info() causes deadlocks
raise _ExpectedFailure((type(cm.exception), None, None))
class NeoUnitTestBase(NeoTestBase): class NeoUnitTestBase(NeoTestBase):
""" Base class for neo tests, implements common checks """ """ Base class for neo tests, implements common checks """
......
...@@ -35,7 +35,7 @@ from neo.lib.handler import DelayEvent, EventHandler ...@@ -35,7 +35,7 @@ from neo.lib.handler import DelayEvent, EventHandler
from neo.lib import logging from neo.lib import logging
from neo.lib.protocol import (CellStates, ClusterStates, NodeStates, NodeTypes, from neo.lib.protocol import (CellStates, ClusterStates, NodeStates, NodeTypes,
Packets, Packet, uuid_str, ZERO_OID, ZERO_TID, MAX_TID) Packets, Packet, uuid_str, ZERO_OID, ZERO_TID, MAX_TID)
from .. import expectedFailure, unpickle_state, Patch, TransactionalResource from .. import unpickle_state, Patch, TransactionalResource
from . import ClientApplication, ConnectionFilter, LockLock, NEOCluster, \ from . import ClientApplication, ConnectionFilter, LockLock, NEOCluster, \
NEOThreadedTest, RandomConflictDict, ThreadId, with_cluster NEOThreadedTest, RandomConflictDict, ThreadId, with_cluster
from neo.lib.util import add64, makeChecksum, p64, u64 from neo.lib.util import add64, makeChecksum, p64, u64
...@@ -175,9 +175,9 @@ class Test(NEOThreadedTest): ...@@ -175,9 +175,9 @@ class Test(NEOThreadedTest):
with Patch(PCounterWithResolution, _p_resolveConflict=resolve): with Patch(PCounterWithResolution, _p_resolveConflict=resolve):
self.assertEqual(self._testUndoConflict(cluster, 1, 3).x, big) self.assertEqual(self._testUndoConflict(cluster, 1, 3).x, big)
@expectedFailure(POSException.ConflictError)
@with_cluster() @with_cluster()
def testUndoConflictDuringStore(self, cluster): def testUndoConflictDuringStore(self, cluster):
with self.expectedFailure(POSException.ConflictError): \
self._testUndoConflict(cluster, 1) self._testUndoConflict(cluster, 1)
def testStorageDataLock(self, dedup=False): def testStorageDataLock(self, dedup=False):
...@@ -247,7 +247,8 @@ class Test(NEOThreadedTest): ...@@ -247,7 +247,8 @@ class Test(NEOThreadedTest):
s.resetNode() s.resetNode()
storage.app.max_reconnection_to_master = 0 storage.app.max_reconnection_to_master = 0
self.assertRaises(NEOPrimaryMasterLost, storage.tpc_vote, t1) self.assertRaises(NEOPrimaryMasterLost, storage.tpc_vote, t1)
expectedFailure(self.assertFalse)(s.dm.getOrphanList()) with self.expectedFailure(): \
self.assertFalse(s.dm.getOrphanList())
@with_cluster(storage_count=1) @with_cluster(storage_count=1)
def testDelayedUnlockInformation(self, cluster): def testDelayedUnlockInformation(self, cluster):
...@@ -2636,8 +2637,8 @@ class Test(NEOThreadedTest): ...@@ -2636,8 +2637,8 @@ class Test(NEOThreadedTest):
self.assertEqual(1, len(getStorageList())) self.assertEqual(1, len(getStorageList()))
with Patch(EventHandler, protocolError=lambda *_: sys.exit()): with Patch(EventHandler, protocolError=lambda *_: sys.exit()):
self.tic() self.tic()
expectedFailure(self.assertEqual)(neoctl.getClusterState(), with self.expectedFailure(): \
ClusterStates.RUNNING) self.assertEqual(neoctl.getClusterState(), ClusterStates.RUNNING)
self.assertEqual({1: NodeStates.RUNNING, 2: NodeStates.RUNNING}, self.assertEqual({1: NodeStates.RUNNING, 2: NodeStates.RUNNING},
{x[2]: x[3] for x in neoctl.getNodeList(NodeTypes.STORAGE)}) {x[2]: x[3] for x in neoctl.getNodeList(NodeTypes.STORAGE)})
......
...@@ -32,7 +32,7 @@ from neo.lib.connection import ClientConnection ...@@ -32,7 +32,7 @@ from neo.lib.connection import ClientConnection
from neo.lib.protocol import CellStates, ClusterStates, Packets, \ from neo.lib.protocol import CellStates, ClusterStates, Packets, \
ZERO_OID, ZERO_TID, MAX_TID, uuid_str ZERO_OID, ZERO_TID, MAX_TID, uuid_str
from neo.lib.util import add64, p64, u64 from neo.lib.util import add64, p64, u64
from .. import expectedFailure, Patch, TransactionalResource from .. import Patch, TransactionalResource
from . import ConnectionFilter, NEOCluster, NEOThreadedTest, \ from . import ConnectionFilter, NEOCluster, NEOThreadedTest, \
predictable_random, with_cluster predictable_random, with_cluster
from .test import PCounter, PCounterWithResolution # XXX from .test import PCounter, PCounterWithResolution # XXX
...@@ -682,7 +682,8 @@ class ReplicationTests(NEOThreadedTest): ...@@ -682,7 +682,8 @@ class ReplicationTests(NEOThreadedTest):
s0.start() s0.start()
self.tic() self.tic()
self.assertEqual(2, s0.sqlCount('obj')) self.assertEqual(2, s0.sqlCount('obj'))
expectedFailure(self.assertEqual)(2, count) with self.expectedFailure(): \
self.assertEqual(2, count)
@with_cluster(replicas=1) @with_cluster(replicas=1)
def testResumingReplication(self, cluster): def testResumingReplication(self, cluster):
......
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