gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / dulwich / tests / test_greenthreads.py @ 959
History | View | Annotate | Download (4.8 KB)
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 |
# Dulwich is dual-licensed under the Apache License, Version 2.0 and the GNU
|
7 |
# General Public License as public by the Free Software Foundation; version 2.0
|
8 |
# or (at your option) any later version. You can redistribute it and/or
|
9 |
# modify it under the terms of either of these two licenses.
|
10 |
#
|
11 |
# Unless required by applicable law or agreed to in writing, software
|
12 |
# distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
# See the License for the specific language governing permissions and
|
15 |
# limitations under the License.
|
16 |
#
|
17 |
# You should have received a copy of the licenses; if not, see
|
18 |
# <http://www.gnu.org/licenses/> for a copy of the GNU General Public License
|
19 |
# and <http://www.apache.org/licenses/LICENSE-2.0> for a copy of the Apache
|
20 |
# License, Version 2.0.
|
21 |
#
|
22 |
|
23 |
import time |
24 |
|
25 |
from dulwich.tests import ( |
26 |
skipIf, |
27 |
TestCase, |
28 |
) |
29 |
from dulwich.object_store import ( |
30 |
MemoryObjectStore, |
31 |
MissingObjectFinder, |
32 |
) |
33 |
from dulwich.objects import ( |
34 |
Commit, |
35 |
Blob, |
36 |
Tree, |
37 |
parse_timezone, |
38 |
) |
39 |
|
40 |
try:
|
41 |
import gevent |
42 |
gevent_support = True
|
43 |
except ImportError: |
44 |
gevent_support = False
|
45 |
|
46 |
if gevent_support:
|
47 |
from dulwich.greenthreads import ( |
48 |
GreenThreadsObjectStoreIterator, |
49 |
GreenThreadsMissingObjectFinder, |
50 |
) |
51 |
|
52 |
skipmsg = "Gevent library is not installed"
|
53 |
|
54 |
def create_commit(marker=None): |
55 |
blob = Blob.from_string(b'The blob content ' + marker)
|
56 |
tree = Tree() |
57 |
tree.add(b"thefile " + marker, 0o100644, blob.id) |
58 |
cmt = Commit() |
59 |
cmt.tree = tree.id |
60 |
cmt.author = cmt.committer = b"John Doe <john@doe.net>"
|
61 |
cmt.message = marker |
62 |
tz = parse_timezone(b'-0200')[0] |
63 |
cmt.commit_time = cmt.author_time = int(time.time())
|
64 |
cmt.commit_timezone = cmt.author_timezone = tz |
65 |
return cmt, tree, blob
|
66 |
|
67 |
|
68 |
def init_store(store, count=1): |
69 |
ret = [] |
70 |
for i in range(0, count): |
71 |
objs = create_commit(marker=("%d" % i).encode('ascii')) |
72 |
for obj in objs: |
73 |
ret.append(obj) |
74 |
store.add_object(obj) |
75 |
return ret
|
76 |
|
77 |
|
78 |
@skipIf(not gevent_support, skipmsg) |
79 |
class TestGreenThreadsObjectStoreIterator(TestCase): |
80 |
|
81 |
def setUp(self): |
82 |
super(TestGreenThreadsObjectStoreIterator, self).setUp() |
83 |
self.store = MemoryObjectStore()
|
84 |
self.cmt_amount = 10 |
85 |
self.objs = init_store(self.store, self.cmt_amount) |
86 |
|
87 |
def test_len(self): |
88 |
wants = [sha.id for sha in self.objs if isinstance(sha, Commit)] |
89 |
finder = MissingObjectFinder(self.store, (), wants)
|
90 |
iterator = GreenThreadsObjectStoreIterator(self.store,
|
91 |
iter(finder.next, None), |
92 |
finder) |
93 |
# One commit refers one tree and one blob
|
94 |
self.assertEqual(len(iterator), self.cmt_amount * 3) |
95 |
haves = wants[0:self.cmt_amount-1] |
96 |
finder = MissingObjectFinder(self.store, haves, wants)
|
97 |
iterator = GreenThreadsObjectStoreIterator(self.store,
|
98 |
iter(finder.next, None), |
99 |
finder) |
100 |
self.assertEqual(len(iterator), 3) |
101 |
|
102 |
def test_iter(self): |
103 |
wants = [sha.id for sha in self.objs if isinstance(sha, Commit)] |
104 |
finder = MissingObjectFinder(self.store, (), wants)
|
105 |
iterator = GreenThreadsObjectStoreIterator(self.store,
|
106 |
iter(finder.next, None), |
107 |
finder) |
108 |
objs = [] |
109 |
for sha, path in iterator: |
110 |
self.assertIn(sha, self.objs) |
111 |
objs.append(sha) |
112 |
self.assertEqual(len(objs), len(self.objs)) |
113 |
|
114 |
|
115 |
@skipIf(not gevent_support, skipmsg) |
116 |
class TestGreenThreadsMissingObjectFinder(TestCase): |
117 |
|
118 |
def setUp(self): |
119 |
super(TestGreenThreadsMissingObjectFinder, self).setUp() |
120 |
self.store = MemoryObjectStore()
|
121 |
self.cmt_amount = 10 |
122 |
self.objs = init_store(self.store, self.cmt_amount) |
123 |
|
124 |
def test_finder(self): |
125 |
wants = [sha.id for sha in self.objs if isinstance(sha, Commit)] |
126 |
finder = GreenThreadsMissingObjectFinder(self.store, (), wants)
|
127 |
self.assertEqual(len(finder.sha_done), 0) |
128 |
self.assertEqual(len(finder.objects_to_send), self.cmt_amount) |
129 |
|
130 |
finder = GreenThreadsMissingObjectFinder(self.store,
|
131 |
wants[0:int(self.cmt_amount/2)], |
132 |
wants) |
133 |
# sha_done will contains commit id and sha of blob refered in tree
|
134 |
self.assertEqual(len(finder.sha_done), (self.cmt_amount/2)*2) |
135 |
self.assertEqual(len(finder.objects_to_send), self.cmt_amount/2) |