1
# Copyright (C) 2010-2018 Jelmer Vernooij <jelmer@jelmer.uk>
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Tests for bzr-git's object store."""
19
from __future__ import absolute_import
21
from dulwich.objects import Blob
22
from dulwich.tests.test_object_store import PackBasedObjectStoreTests
23
from dulwich.tests.test_refs import RefsContainerTests
24
from dulwich.tests.utils import make_object
26
from ...tests import TestCaseWithTransport
28
from ..transportgit import (
30
TransportRefsContainer,
34
class TransportObjectStoreTests(PackBasedObjectStoreTests, TestCaseWithTransport):
37
TestCaseWithTransport.setUp(self)
38
self.store = TransportObjectStore.init(self.get_transport())
41
PackBasedObjectStoreTests.tearDown(self)
42
TestCaseWithTransport.tearDown(self)
44
def test_prefers_pack_listdir(self):
45
self.store.add_object(make_object(Blob, data=b"data"))
46
self.assertEqual(0, len(self.store.packs))
47
self.store.pack_loose_objects()
48
self.assertEqual(1, len(self.store.packs))
49
packname = list(self.store.packs)[0].name()
50
self.assertEqual({'pack-%s.pack' % packname.decode('ascii'), 'pack-%s.idx' % packname.decode('ascii')},
51
set(self.store._pack_names()))
52
self.store.transport.put_bytes_non_atomic('info/packs',
54
self.assertEqual({'pack-%s.pack' % packname.decode('ascii'), 'pack-%s.idx' % packname.decode('ascii')},
55
set(self.store._pack_names()))
57
def test_remembers_packs(self):
58
self.store.add_object(make_object(Blob, data=b"data"))
59
self.assertEqual(0, len(self.store.packs))
60
self.store.pack_loose_objects()
61
self.assertEqual(1, len(self.store.packs))
63
# Packing a second object creates a second pack.
64
self.store.add_object(make_object(Blob, data=b"more data"))
65
self.store.pack_loose_objects()
66
self.assertEqual(2, len(self.store.packs))
68
# If we reopen the store, it reloads both packs.
69
restore = TransportObjectStore(self.get_transport())
70
self.assertEqual(2, len(restore.packs))
73
# FIXME: Unfortunately RefsContainerTests requires on a specific set of refs existing.
75
class TransportRefContainerTests(TestCaseWithTransport):
78
TestCaseWithTransport.setUp(self)
79
self._refs = TransportRefsContainer(self.get_transport())
81
def test_packed_refs_missing(self):
82
self.assertEqual({}, self._refs.get_packed_refs())
84
def test_packed_refs(self):
85
self.get_transport().put_bytes_non_atomic('packed-refs',
86
b'# pack-refs with: peeled fully-peeled sorted \n'
87
b'2001b954f1ec392f84f7cec2f2f96a76ed6ba4ee refs/heads/master')
89
{b'refs/heads/master': b'2001b954f1ec392f84f7cec2f2f96a76ed6ba4ee'},
90
self._refs.get_packed_refs())