Ignore the pyc and eclipse project files.
[quix0rs-apt-p2p.git] / test_khashmir.py
1 from unittest import *
2 from khashmir import *
3 import khash
4 from copy import copy
5
6 from whrandom import randrange
7
8 import os
9
10 if __name__ =="__main__":
11     tests = defaultTestLoader.loadTestsFromNames([sys.argv[0][:-3]])
12     result = TextTestRunner().run(tests)
13
14 class SimpleTests(TestCase):
15     def setUp(self):
16         self.a = Khashmir('127.0.0.1', 4044, '/tmp/a.test')
17         self.b = Khashmir('127.0.0.1', 4045, '/tmp/b.test')
18         
19     def tearDown(self):
20         self.a.listenport.stopListening()
21         self.b.listenport.stopListening()
22         os.unlink('/tmp/a.test')
23         os.unlink('/tmp/b.test')                
24         reactor.iterate()
25         reactor.iterate()
26
27     def addContacts(self):
28         self.a.addContact('127.0.0.1', 4045)
29         reactor.iterate()
30         reactor.iterate()
31         reactor.iterate()
32         reactor.iterate()
33
34     def testAddContact(self):
35         self.assertEqual(len(self.a.table.buckets), 1) 
36         self.assertEqual(len(self.a.table.buckets[0].l), 0)
37
38         self.assertEqual(len(self.b.table.buckets), 1) 
39         self.assertEqual(len(self.b.table.buckets[0].l), 0)
40
41         self.addContacts()
42
43         self.assertEqual(len(self.a.table.buckets), 1) 
44         self.assertEqual(len(self.a.table.buckets[0].l), 1)
45         self.assertEqual(len(self.b.table.buckets), 1) 
46         self.assertEqual(len(self.b.table.buckets[0].l), 1)
47
48     def testStoreRetrieve(self):
49         self.addContacts()
50         self.got = 0
51         self.a.storeValueForKey(sha('foo').digest(), 'foobar')
52         reactor.iterate()
53         reactor.iterate()
54         reactor.iterate()
55         reactor.iterate()
56         reactor.iterate()
57         reactor.iterate()
58         self.a.valueForKey(sha('foo').digest(), self._cb)
59         reactor.iterate()
60         reactor.iterate()
61         reactor.iterate()
62         reactor.iterate()
63         reactor.iterate()
64         reactor.iterate()
65         reactor.iterate()
66
67     def _cb(self, val):
68         if not val:
69             self.assertEqual(self.got, 1)
70         elif 'foobar' in val:
71             self.got = 1
72
73
74 class MultiTest(TestCase):
75     num = 20
76     def _done(self, val):
77         self.done = 1
78         
79     def setUp(self):
80         self.l = []
81         self.startport = 4088
82         for i in range(self.num):
83             self.l.append(Khashmir('127.0.0.1', self.startport + i, '/tmp/%s.test' % (self.startport + i)))
84         reactor.iterate()
85         reactor.iterate()
86         
87         for i in self.l:
88             i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port)
89             i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port)
90             i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port)
91             reactor.iterate()
92             reactor.iterate()
93             reactor.iterate() 
94             
95         for i in self.l:
96             self.done = 0
97             i.findCloseNodes(self._done)
98             while not self.done:
99                 reactor.iterate()
100         for i in self.l:
101             self.done = 0
102             i.findCloseNodes(self._done)
103             while not self.done:
104                 reactor.iterate()
105
106     def tearDown(self):
107         for i in self.l:
108             i.listenport.stopListening()
109         for i in range(self.startport, self.startport+self.num):
110             os.unlink('/tmp/%s.test' % i)
111             
112         reactor.iterate()
113         
114     def testStoreRetrieve(self):
115         for i in range(10):
116             K = khash.newID()
117             V = khash.newID()
118             
119             for a in range(3):
120                 self.done = 0
121                 def _scb(val):
122                     self.done = 1
123                 self.l[randrange(0, self.num)].storeValueForKey(K, V, _scb)
124                 while not self.done:
125                     reactor.iterate()
126
127
128                 def _rcb(val):
129                     if not val:
130                         self.done = 1
131                         self.assertEqual(self.got, 1)
132                     elif V in val:
133                         self.got = 1
134                 for x in range(3):
135                     self.got = 0
136                     self.done = 0
137                     self.l[randrange(0, self.num)].valueForKey(K, _rcb)
138                     while not self.done:
139                         reactor.iterate()
140
141
142             
143             
144