|
@@ -541,13 +541,12 @@ class TestProtocolGraphWalker(object):
|
|
|
return self.acks.pop(0)
|
|
|
|
|
|
def handle_done(self):
|
|
|
- pass
|
|
|
+ if self._notify_done and self._impl:
|
|
|
+ # assuming done is needed and done is provided.
|
|
|
+ self._impl.handle_done(True, True)
|
|
|
|
|
|
def notify_done(self):
|
|
|
self._notify_done = True
|
|
|
- if self._impl:
|
|
|
- # assuming done is needed and done is provided.
|
|
|
- self._impl.handle_done()
|
|
|
|
|
|
|
|
|
class AckGraphWalkerImplTestCase(TestCase):
|
|
@@ -582,6 +581,14 @@ class AckGraphWalkerImplTestCase(TestCase):
|
|
|
def assertNextEquals(self, sha):
|
|
|
self.assertEqual(sha, next(self._impl))
|
|
|
|
|
|
+ def assertNextEmpty(self):
|
|
|
+ # This is necessary because of no-done - the assumption that it
|
|
|
+ # it safe to immediately send out the final ACK is no longer
|
|
|
+ # true but the test is still needed for it. TestProtocolWalker
|
|
|
+ # does implement the handle_done which will determine whether
|
|
|
+ # the final confirmation can be sent.
|
|
|
+ self.assertRaises(IndexError, next, self._impl)
|
|
|
+ self._walker.handle_done()
|
|
|
|
|
|
class SingleAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
|
|
@@ -632,6 +639,7 @@ class SingleAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertNak()
|
|
|
|
|
|
def test_single_ack_nak_flush(self):
|
|
@@ -648,6 +656,7 @@ class SingleAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertNak()
|
|
|
|
|
|
|
|
@@ -669,6 +678,7 @@ class MultiAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertAck(THREE, b'continue')
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertAck(THREE)
|
|
|
|
|
|
def test_multi_ack_partial(self):
|
|
@@ -684,6 +694,7 @@ class MultiAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
# done, re-send ack of last common
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertAck(ONE)
|
|
|
|
|
|
def test_multi_ack_flush(self):
|
|
@@ -709,6 +720,7 @@ class MultiAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertAck(THREE, b'continue')
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertAck(THREE)
|
|
|
|
|
|
def test_multi_ack_nak(self):
|
|
@@ -722,6 +734,7 @@ class MultiAckGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertNak()
|
|
|
|
|
|
|
|
@@ -730,9 +743,6 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
impl_cls = MultiAckDetailedGraphWalkerImpl
|
|
|
|
|
|
def test_multi_ack(self):
|
|
|
- # depend on the EOL that will give the blank command to trigger
|
|
|
- # the ready
|
|
|
- self._walker.lines.append((None, None))
|
|
|
self.assertNextEquals(TWO)
|
|
|
self.assertNoAck()
|
|
|
|
|
@@ -746,7 +756,9 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertAck(THREE, b'common')
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
- self.assertAcks([(THREE, 'ready'), (THREE, '')])
|
|
|
+ self._walker.lines.append((None, None))
|
|
|
+ self.assertNextEmpty()
|
|
|
+ self.assertAcks([(THREE, 'ready'), (None, 'nak'), (THREE, '')])
|
|
|
|
|
|
def test_multi_ack_partial(self):
|
|
|
self.assertNextEquals(TWO)
|
|
@@ -760,7 +772,7 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
- # done, re-send ack of last common
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertAck(ONE)
|
|
|
|
|
|
def test_multi_ack_flush(self):
|
|
@@ -771,8 +783,8 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
(b'have', ONE),
|
|
|
(b'have', THREE),
|
|
|
(b'done', None),
|
|
|
+ (None, None),
|
|
|
]
|
|
|
- self._walker.done = True
|
|
|
self.assertNextEquals(TWO)
|
|
|
self.assertNoAck()
|
|
|
|
|
@@ -787,10 +799,9 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self._impl.ack(THREE)
|
|
|
self.assertAck(THREE, b'common')
|
|
|
|
|
|
- self._walker.done = True
|
|
|
self.assertNextEquals(None)
|
|
|
- self.assertTrue(self._walker._notify_done)
|
|
|
- self.assertAcks([(THREE, 'ready'), (THREE, '')])
|
|
|
+ self.assertNextEmpty()
|
|
|
+ self.assertAcks([(THREE, 'ready'), (None, 'nak'), (THREE, '')])
|
|
|
|
|
|
def test_multi_ack_nak(self):
|
|
|
self.assertNextEquals(TWO)
|
|
@@ -803,6 +814,7 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertNak()
|
|
|
|
|
|
def test_multi_ack_nak_flush(self):
|
|
@@ -814,7 +826,6 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
(b'have', THREE),
|
|
|
(b'done', None),
|
|
|
]
|
|
|
- self._walker.done = True
|
|
|
self.assertNextEquals(TWO)
|
|
|
self.assertNoAck()
|
|
|
|
|
@@ -825,6 +836,7 @@ class MultiAckDetailedGraphWalkerImplTestCase(AckGraphWalkerImplTestCase):
|
|
|
self.assertNoAck()
|
|
|
|
|
|
self.assertNextEquals(None)
|
|
|
+ self.assertNextEmpty()
|
|
|
self.assertNak()
|
|
|
|
|
|
def test_multi_ack_stateless(self):
|