Statistics
| Revision:

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)