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