class ProtocolGraphWalkerTestCase(TestCase): def setUp(self): # Create the following commit tree: # 3---5 # / # 1---2---4 self._objects = { ONE: TestCommit(ONE, [], 111), TWO: TestCommit(TWO, [ONE], 222), THREE: TestCommit(THREE, [ONE], 333), FOUR: TestCommit(FOUR, [TWO], 444), FIVE: TestCommit(FIVE, [THREE], 555), } self._walker = ProtocolGraphWalker( TestUploadPackHandler(self._objects, TestProto()), self._objects, None) def test_is_satisfied_no_haves(self): self.assertFalse(self._walker._is_satisfied([], ONE, 0)) self.assertFalse(self._walker._is_satisfied([], TWO, 0)) self.assertFalse(self._walker._is_satisfied([], THREE, 0)) def test_is_satisfied_have_root(self): self.assertTrue(self._walker._is_satisfied([ONE], ONE, 0)) self.assertTrue(self._walker._is_satisfied([ONE], TWO, 0)) self.assertTrue(self._walker._is_satisfied([ONE], THREE, 0)) def test_is_satisfied_have_branch(self): self.assertTrue(self._walker._is_satisfied([TWO], TWO, 0)) # wrong branch self.assertFalse(self._walker._is_satisfied([TWO], THREE, 0)) def test_all_wants_satisfied(self): self._walker.set_wants([FOUR, FIVE]) # trivial case: wants == haves self.assertTrue(self._walker.all_wants_satisfied([FOUR, FIVE])) # cases that require walking the commit tree self.assertTrue(self._walker.all_wants_satisfied([ONE])) self.assertFalse(self._walker.all_wants_satisfied([TWO])) self.assertFalse(self._walker.all_wants_satisfied([THREE])) self.assertTrue(self._walker.all_wants_satisfied([TWO, THREE])) def test_read_proto_line(self): self._walker.proto.set_output([ 'want %s' % ONE, 'want %s' % TWO, 'have %s' % THREE, 'foo %s' % FOUR, 'bar', 'done', ]) self.assertEquals(('want', ONE), self._walker.read_proto_line()) self.assertEquals(('want', TWO), self._walker.read_proto_line()) self.assertEquals(('have', THREE), self._walker.read_proto_line()) self.assertRaises(GitProtocolError, self._walker.read_proto_line) self.assertRaises(GitProtocolError, self._walker.read_proto_line) self.assertEquals(('done', None), self._walker.read_proto_line()) self.assertEquals((None, None), self._walker.read_proto_line()) def test_determine_wants(self): self.assertRaises(GitProtocolError, self._walker.determine_wants, {}) self._walker.proto.set_output([ 'want %s multi_ack' % ONE, 'want %s' % TWO, ]) heads = {'ref1': ONE, 'ref2': TWO, 'ref3': THREE} self._walker.get_peeled = heads.get self.assertEquals([ONE, TWO], self._walker.determine_wants(heads)) self._walker.proto.set_output(['want %s multi_ack' % FOUR]) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads) self._walker.proto.set_output([]) self.assertEquals([], self._walker.determine_wants(heads)) self._walker.proto.set_output(['want %s multi_ack' % ONE, 'foo']) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads) self._walker.proto.set_output(['want %s multi_ack' % FOUR]) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads) def test_determine_wants_advertisement(self): self._walker.proto.set_output([]) # advertise branch tips plus tag heads = {'ref4': FOUR, 'ref5': FIVE, 'tag6': SIX} peeled = {'ref4': FOUR, 'ref5': FIVE, 'tag6': FIVE} self._walker.get_peeled = peeled.get self._walker.determine_wants(heads) lines = [] while True: line = self._walker.proto.get_received_line() if line == 'None': break # strip capabilities list if present if '\x00' in line: line = line[:line.index('\x00')] lines.append(line.rstrip()) self.assertEquals([ '%s ref4' % FOUR, '%s ref5' % FIVE, '%s tag6^{}' % FIVE, '%s tag6' % SIX, ], sorted(lines)) # ensure peeled tag was advertised immediately following tag for i, line in enumerate(lines): if line.endswith(' tag6'): self.assertEquals('%s tag6^{}' % FIVE, lines[i+1])
class ProtocolGraphWalkerTestCase(TestCase): def setUp(self): # Create the following commit tree: # 3---5 # / # 1---2---4 self._objects = { ONE: TestCommit(ONE, [], 111), TWO: TestCommit(TWO, [ONE], 222), THREE: TestCommit(THREE, [ONE], 333), FOUR: TestCommit(FOUR, [TWO], 444), FIVE: TestCommit(FIVE, [THREE], 555), } self._walker = ProtocolGraphWalker( TestHandler(self._objects, TestProto())) def test_is_satisfied_no_haves(self): self.assertFalse(self._walker._is_satisfied([], ONE, 0)) self.assertFalse(self._walker._is_satisfied([], TWO, 0)) self.assertFalse(self._walker._is_satisfied([], THREE, 0)) def test_is_satisfied_have_root(self): self.assertTrue(self._walker._is_satisfied([ONE], ONE, 0)) self.assertTrue(self._walker._is_satisfied([ONE], TWO, 0)) self.assertTrue(self._walker._is_satisfied([ONE], THREE, 0)) def test_is_satisfied_have_branch(self): self.assertTrue(self._walker._is_satisfied([TWO], TWO, 0)) # wrong branch self.assertFalse(self._walker._is_satisfied([TWO], THREE, 0)) def test_all_wants_satisfied(self): self._walker.set_wants([FOUR, FIVE]) # trivial case: wants == haves self.assertTrue(self._walker.all_wants_satisfied([FOUR, FIVE])) # cases that require walking the commit tree self.assertTrue(self._walker.all_wants_satisfied([ONE])) self.assertFalse(self._walker.all_wants_satisfied([TWO])) self.assertFalse(self._walker.all_wants_satisfied([THREE])) self.assertTrue(self._walker.all_wants_satisfied([TWO, THREE])) def test_read_proto_line(self): self._walker.proto.set_output([ 'want %s' % ONE, 'want %s' % TWO, 'have %s' % THREE, 'foo %s' % FOUR, 'bar', 'done', ]) self.assertEquals(('want', ONE), self._walker.read_proto_line()) self.assertEquals(('want', TWO), self._walker.read_proto_line()) self.assertEquals(('have', THREE), self._walker.read_proto_line()) self.assertRaises(GitProtocolError, self._walker.read_proto_line) self.assertRaises(GitProtocolError, self._walker.read_proto_line) self.assertEquals(('done', None), self._walker.read_proto_line()) self.assertEquals((None, None), self._walker.read_proto_line()) def test_determine_wants(self): self.assertRaises(GitProtocolError, self._walker.determine_wants, {}) self._walker.proto.set_output([ 'want %s multi_ack' % ONE, 'want %s' % TWO, ]) heads = {'ref1': ONE, 'ref2': TWO, 'ref3': THREE} self.assertEquals([ONE, TWO], self._walker.determine_wants(heads)) self._walker.proto.set_output(['want %s multi_ack' % FOUR]) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads) self._walker.proto.set_output([]) self.assertEquals([], self._walker.determine_wants(heads)) self._walker.proto.set_output(['want %s multi_ack' % ONE, 'foo']) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads) self._walker.proto.set_output(['want %s multi_ack' % FOUR]) self.assertRaises(GitProtocolError, self._walker.determine_wants, heads)