7119dedcaa4b95d4eeaee71e93669e47c6bb6131
[jelmer/dulwich.git] / dulwich / tests / test_greenthreads.py
1 # test_greenthreads.py -- Unittests for eventlet.
2 # Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
3 #
4 # Author: Fabien Boucher <fabien.boucher@enovance.com>
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; version 2
9 # of the License or (at your option) any later version of
10 # the License.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20 # MA  02110-1301, USA.
21
22 import time
23
24 from dulwich.tests import (
25     skipIf,
26     TestCase,
27     )
28 from dulwich.object_store import (
29     MemoryObjectStore,
30     MissingObjectFinder,
31     )
32 from dulwich.objects import (
33     Commit,
34     Blob,
35     Tree,
36     parse_timezone,
37     )
38
39 try:
40     import gevent
41     gevent_support = True
42 except ImportError:
43     gevent_support = False
44
45 if gevent_support:
46     from dulwich.greenthreads import (
47         GreenThreadsObjectStoreIterator,
48         GreenThreadsMissingObjectFinder,
49     )
50
51 skipmsg = "Gevent library is not installed"
52
53 def create_commit(marker=None):
54     blob = Blob.from_string('The blob content %s' % marker)
55     tree = Tree()
56     tree.add("thefile %s" % marker, 0o100644, blob.id)
57     cmt = Commit()
58     cmt.tree = tree.id
59     cmt.author = cmt.committer = "John Doe <john@doe.net>"
60     cmt.message = "%s" % marker
61     tz = parse_timezone('-0200')[0]
62     cmt.commit_time = cmt.author_time = int(time.time())
63     cmt.commit_timezone = cmt.author_timezone = tz
64     return cmt, tree, blob
65
66
67 def init_store(store, count=1):
68     ret = []
69     for i in range(0, count):
70         objs = create_commit(marker=i)
71         for obj in objs:
72             ret.append(obj)
73             store.add_object(obj)
74     return ret
75
76
77 @skipIf(not gevent_support, skipmsg)
78 class TestGreenThreadsObjectStoreIterator(TestCase):
79
80     def setUp(self):
81         super(TestGreenThreadsObjectStoreIterator, self).setUp()
82         self.store = MemoryObjectStore()
83         self.cmt_amount = 10
84         self.objs = init_store(self.store, self.cmt_amount)
85
86     def test_len(self):
87         wants = [sha.id for sha in self.objs if isinstance(sha, Commit)]
88         finder = MissingObjectFinder(self.store, (), wants)
89         iterator = GreenThreadsObjectStoreIterator(self.store,
90                                                iter(finder.next, None),
91                                                finder)
92         # One commit refers one tree and one blob
93         self.assertEqual(len(iterator), self.cmt_amount * 3)
94         haves = wants[0:self.cmt_amount-1]
95         finder = MissingObjectFinder(self.store, haves, wants)
96         iterator = GreenThreadsObjectStoreIterator(self.store,
97                                                iter(finder.next, None),
98                                                finder)
99         self.assertEqual(len(iterator), 3)
100
101     def test_iter(self):
102         wants = [sha.id for sha in self.objs if isinstance(sha, Commit)]
103         finder = MissingObjectFinder(self.store, (), wants)
104         iterator = GreenThreadsObjectStoreIterator(self.store,
105                                                iter(finder.next, None),
106                                                finder)
107         objs = []
108         for sha, path in iterator:
109             self.assertIn(sha, self.objs)
110             objs.append(sha)
111         self.assertEqual(len(objs), len(self.objs))
112
113
114 @skipIf(not gevent_support, skipmsg)
115 class TestGreenThreadsMissingObjectFinder(TestCase):
116
117     def setUp(self):
118         super(TestGreenThreadsMissingObjectFinder, self).setUp()
119         self.store = MemoryObjectStore()
120         self.cmt_amount = 10
121         self.objs = init_store(self.store, self.cmt_amount)
122
123     def test_finder(self):
124         wants = [sha.id for sha in self.objs if isinstance(sha, Commit)]
125         finder = GreenThreadsMissingObjectFinder(self.store, (), wants)
126         self.assertEqual(len(finder.sha_done), 0)
127         self.assertEqual(len(finder.objects_to_send), self.cmt_amount)
128
129         finder = GreenThreadsMissingObjectFinder(self.store,
130                                              wants[0:self.cmt_amount/2],
131                                              wants)
132         # sha_done will contains commit id and sha of blob refered in tree
133         self.assertEqual(len(finder.sha_done), (self.cmt_amount/2)*2)
134         self.assertEqual(len(finder.objects_to_send), self.cmt_amount/2)