def setUp(self):
     super(TestTransportDispatch, self).setUp()
     memory_server = MemoryServer()
     memory_server.start_server()
     base_transport = get_transport(memory_server.get_url())
     base_transport.mkdir('hosted')
     self.hosted_transport = base_transport.clone('hosted')
     self.factory = TransportDispatch(self.hosted_transport)
 def setUp(self):
     super(TestTransportDispatch, self).setUp()
     memory_server = MemoryServer()
     memory_server.start_server()
     base_transport = get_transport(memory_server.get_url())
     base_transport.mkdir('hosted')
     self.hosted_transport = base_transport.clone('hosted')
     self.factory = TransportDispatch(self.hosted_transport)
class TestTransportDispatch(TestCase):
    """Tests for the transport factory."""
    def setUp(self):
        super(TestTransportDispatch, self).setUp()
        memory_server = MemoryServer()
        memory_server.start_server()
        base_transport = get_transport(memory_server.get_url())
        base_transport.mkdir('hosted')
        self.hosted_transport = base_transport.clone('hosted')
        self.factory = TransportDispatch(self.hosted_transport)

    def test_control_conf_read_only(self):
        transport = self.factory._makeControlTransport(
            default_stack_on='/~foo/bar/baz')
        self.assertRaises(errors.TransportNotPossible, transport.put_bytes,
                          '.bzr/control.conf', 'data')

    def test_control_conf_with_stacking(self):
        transport = self.factory._makeControlTransport(
            default_stack_on='/~foo/bar/baz')
        control_conf = transport.get_bytes('.bzr/control.conf')
        self.assertEqual('default_stack_on = /~foo/bar/baz\n', control_conf)

    def test_control_conf_with_no_stacking(self):
        transport = self.factory._makeControlTransport(default_stack_on='')
        self.assertEqual([], transport.list_dir('.'))

    def test_writable_false_implies_readonly(self):
        transport = self.factory._makeBranchTransport(id=5, writable=False)
        self.assertRaises(errors.TransportNotPossible, transport.put_bytes,
                          '.bzr/README', 'data')

    def test_writable_implies_writable(self):
        transport = self.factory._makeBranchTransport(id=5, writable=True)
        transport.mkdir('.bzr')
        self.assertEqual(['.bzr'], transport.list_dir('.'))

    def test_gets_id_directory(self):
        transport = self.factory._makeBranchTransport(id=5, writable=True)
        transport.mkdir('.bzr')
        self.assertEqual(['.bzr'],
                         self.hosted_transport.list_dir('00/00/00/05'))

    def test_makeTransport_control(self):
        # makeTransport returns a control transport for the tuple.
        log = []
        self.factory._transport_factories[CONTROL_TRANSPORT] = (
            lambda default_stack_on, trailing_path: log.append(default_stack_on
                                                               ))
        transport, path = self.factory.makeTransport((CONTROL_TRANSPORT, {
            'default_stack_on': 'foo'
        }, 'bar/baz'))
        self.assertEqual('bar/baz', path)
        self.assertEqual(['foo'], log)

    def test_makeTransport_branch(self):
        # makeTransport returns a control transport for the tuple.
        log = []
        self.factory._transport_factories[BRANCH_TRANSPORT] = (
            lambda id, writable, trailing_path: log.append((id, writable)))
        transport, path = self.factory.makeTransport((BRANCH_TRANSPORT, {
            'id': 1,
            'writable': True
        }, 'bar/baz'))
        self.assertEqual('bar/baz', path)
        self.assertEqual([(1, True)], log)
class TestTransportDispatch(TestCase):
    """Tests for the transport factory."""

    def setUp(self):
        super(TestTransportDispatch, self).setUp()
        memory_server = MemoryServer()
        memory_server.start_server()
        base_transport = get_transport(memory_server.get_url())
        base_transport.mkdir('hosted')
        self.hosted_transport = base_transport.clone('hosted')
        self.factory = TransportDispatch(self.hosted_transport)

    def test_control_conf_read_only(self):
        transport = self.factory._makeControlTransport(
            default_stack_on='/~foo/bar/baz')
        self.assertRaises(
            errors.TransportNotPossible,
            transport.put_bytes, '.bzr/control.conf', 'data')

    def test_control_conf_with_stacking(self):
        transport = self.factory._makeControlTransport(
            default_stack_on='/~foo/bar/baz')
        control_conf = transport.get_bytes('.bzr/control.conf')
        self.assertEqual('default_stack_on = /~foo/bar/baz\n', control_conf)

    def test_control_conf_with_no_stacking(self):
        transport = self.factory._makeControlTransport(
            default_stack_on='')
        self.assertEqual([], transport.list_dir('.'))

    def test_writable_false_implies_readonly(self):
        transport = self.factory._makeBranchTransport(id=5, writable=False)
        self.assertRaises(
            errors.TransportNotPossible, transport.put_bytes,
            '.bzr/README', 'data')

    def test_writable_implies_writable(self):
        transport = self.factory._makeBranchTransport(id=5, writable=True)
        transport.mkdir('.bzr')
        self.assertEqual(['.bzr'], transport.list_dir('.'))

    def test_gets_id_directory(self):
        transport = self.factory._makeBranchTransport(id=5, writable=True)
        transport.mkdir('.bzr')
        self.assertEqual(
            ['.bzr'], self.hosted_transport.list_dir('00/00/00/05'))

    def test_makeTransport_control(self):
        # makeTransport returns a control transport for the tuple.
        log = []
        self.factory._transport_factories[CONTROL_TRANSPORT] = (
            lambda default_stack_on, trailing_path:
                log.append(default_stack_on))
        transport, path = self.factory.makeTransport(
            (CONTROL_TRANSPORT, {'default_stack_on': 'foo'}, 'bar/baz'))
        self.assertEqual('bar/baz', path)
        self.assertEqual(['foo'], log)

    def test_makeTransport_branch(self):
        # makeTransport returns a control transport for the tuple.
        log = []
        self.factory._transport_factories[BRANCH_TRANSPORT] = (
            lambda id, writable, trailing_path: log.append((id, writable)))
        transport, path = self.factory.makeTransport(
            (BRANCH_TRANSPORT, {'id': 1, 'writable': True}, 'bar/baz'))
        self.assertEqual('bar/baz', path)
        self.assertEqual([(1, True)], log)