1 # Written by Arno Bakker
2 # see LICENSE.txt for license information
12 from BaseLib.Core.API import TorrentDef
13 from BaseLib.Core.BitTornado.bencode import bdecode
14 from BaseLib.Core.Utilities.utilities import isValidTorrentFile
15 from BaseLib.Core.Overlay.permid import verify_torrent_signature
19 TRACKER = 'http://www.tribler.org/announce'
20 PLAYTIME = "1:02" # 1 min 2 secs. Coordinate with size of file.wmv to get > 1 bitrate
21 PLAYTIME_SECS = 62 # PLAYTIME in seconds
23 class TestTorrentDef(unittest.TestCase):
25 Testing TorrentDef version 0
34 def test_add_content_file(self):
35 self.subtest_add_content_file(merkle=False)
36 self.subtest_add_content_file(merkle=True)
38 def test_add_content_dir(self):
39 self.subtest_add_content_dir(merkle=False)
40 self.subtest_add_content_dir(merkle=True)
42 def test_add_content_dir_and_file(self):
43 self.subtest_add_content_dir_and_file(merkle=False)
44 self.subtest_add_content_dir_and_file(merkle=True)
46 def test_add_content_file_playtime(self):
47 self.subtest_add_content_file_playtime(merkle=False)
48 self.subtest_add_content_file_playtime(merkle=True)
50 def test_add_content_dir_playtime(self):
51 self.subtest_add_content_dir_playtime(merkle=False)
52 self.subtest_add_content_dir_playtime(merkle=True)
54 def test_add_content_file_thumbnail(self):
55 self.subtest_add_content_file_thumbnail(merkle=False)
56 self.subtest_add_content_file_thumbnail(merkle=True)
58 def test_add_content_announce_list(self):
59 self.subtest_add_content_announce_list(merkle=False)
60 self.subtest_add_content_announce_list(merkle=True)
62 def test_add_content_httpseeds(self):
63 self.subtest_add_content_httpseeds(merkle=False)
64 self.subtest_add_content_httpseeds(merkle=True)
66 def test_add_content_torrentsig(self):
67 self.subtest_add_content_torrentsig(merkle=False)
68 self.subtest_add_content_torrentsig(merkle=True)
70 def test_add_content_piece_length(self):
71 self.subtest_add_content_piece_length(merkle=False)
72 self.subtest_add_content_piece_length(merkle=True)
74 def test_add_content_file_save(self):
75 self.subtest_add_content_file_save(merkle=False)
76 self.subtest_add_content_file_save(merkle=True)
78 def test_ns_metadata(self):
79 dummydata = "HalloWereld"
81 t.set_metadata(dummydata)
82 fn = os.path.join(os.getcwd(),"file.wmv")
84 t.set_tracker(TRACKER)
87 [handle,filename] = tempfile.mkstemp()
91 t2 = TorrentDef.load(filename)
92 self.assert_(t2.get_metadata() == dummydata)
95 def subtest_add_content_file(self,merkle=True):
96 """ Add a single file to a TorrentDef """
98 t.set_create_merkle_torrent(merkle)
99 fn = os.path.join(os.getcwd(),"file.wmv")
101 t.set_tracker(TRACKER)
104 s = os.path.getsize("file.wmv")
106 metainfo = t.get_metainfo()
107 self.general_check(metainfo)
109 self.assert_(metainfo['info']['name'] == "file.wmv")
110 self.assert_(metainfo['info']['length'] == s)
113 bdata = bencode(t.get_metainfo())
114 f = open("gen.torrent","wb")
119 def subtest_add_content_dir(self,merkle=True):
120 """ Add a single dir to a TorrentDef """
122 t.set_create_merkle_torrent(merkle)
123 dn = os.path.join(os.getcwd(),"contentdir")
124 t.add_content(dn,"dirintorrent")
125 t.set_tracker(TRACKER)
129 for f in os.listdir("contentdir"):
130 if f.startswith('.'):
132 p = os.path.join("contentdir",f)
133 s = os.path.getsize(p)
135 print "test: expected size",f,s
137 print "test: expected total size of files in torrent",exps
139 metainfo = t.get_metainfo()
140 self.general_check(metainfo)
142 self.assert_(metainfo['info']['name'] == 'dirintorrent')
144 for file in metainfo['info']['files']:
146 print "test: real size",file['path'],s
149 print "test: real size of files in torrent",reals
151 self.assert_(exps == reals)
154 def subtest_add_content_dir_and_file(self,merkle=True):
155 """ Add a single dir and single file to a TorrentDef """
157 t.set_create_merkle_torrent(merkle)
159 dn = os.path.join(os.getcwd(),"contentdir")
160 t.add_content(dn,"dirintorrent")
162 fn = os.path.join(os.getcwd(),"file.wmv")
163 t.add_content(fn,os.path.join("dirintorrent","file.wmv"))
165 t.set_tracker(TRACKER)
169 exps = os.path.getsize(fn)
170 for f in os.listdir("contentdir"):
171 if f.startswith('.'):
173 p = os.path.join("contentdir",f)
174 exps += os.path.getsize(p)
176 metainfo = t.get_metainfo()
177 self.general_check(metainfo)
178 self.assert_(metainfo['info']['name'] == 'dirintorrent')
181 for file in metainfo['info']['files']:
182 reals += file['length']
183 self.assert_(exps == reals)
186 def subtest_add_content_file_playtime(self,merkle=True):
187 """ Add a single file with playtime to a TorrentDef """
189 t.set_create_merkle_torrent(merkle)
190 fn = os.path.join(os.getcwd(),"file.wmv")
191 t.add_content(fn,playtime=PLAYTIME)
192 t.set_tracker(TRACKER)
195 s = os.path.getsize("file.wmv")
197 metainfo = t.get_metainfo()
198 self.general_check(metainfo)
199 self.assert_(metainfo['info']['playtime']==PLAYTIME)
200 azprop = metainfo['azureus_properties']
201 content = azprop['Content']
202 realspeedbps = content['Speed Bps']
203 expspeedbps = s/PLAYTIME_SECS
204 self.assert_(realspeedbps == expspeedbps)
207 def subtest_add_content_dir_playtime(self,merkle=True):
208 """ Add a single dir to a TorrentDef """
210 t.set_create_merkle_torrent(merkle)
211 fn1 = os.path.join(os.getcwd(),"contentdir","file.avi")
212 fn2 = os.path.join(os.getcwd(),"contentdir","file.txt")
213 t.add_content(fn1,os.path.join("dirintorrent","file.avi"),playtime=PLAYTIME)
214 t.add_content(fn2,os.path.join("dirintorrent","file.txt"))
215 t.set_tracker(TRACKER)
218 metainfo = t.get_metainfo()
219 self.general_check(metainfo)
220 self.assert_(metainfo['info']['name'] == 'dirintorrent')
222 s = os.path.getsize(fn1)
224 files = metainfo['info']['files']
226 if file['path'][0] == "file.avi":
227 self.assert_(file['playtime']==PLAYTIME)
229 azprop = metainfo['azureus_properties']
230 content = azprop['Content']
231 realspeedbps = content['Speed Bps']
232 expspeedbps = s/PLAYTIME_SECS
233 self.assert_(realspeedbps == expspeedbps)
236 def subtest_add_content_file_thumbnail(self,merkle=True):
237 """ Add a single file with thumbnail to a TorrentDef """
239 t.set_create_merkle_torrent(merkle)
240 fn = os.path.join(os.getcwd(),"file.wmv")
241 thumbfn = os.path.join(os.getcwd(),"thumb.jpg")
243 t.set_thumbnail(thumbfn)
244 t.set_tracker(TRACKER)
247 f = open(thumbfn,"rb")
251 metainfo = t.get_metainfo()
252 self.general_check(metainfo)
253 azprop = metainfo['azureus_properties']
254 content = azprop['Content']
255 realthumb = content['Thumbnail']
256 self.assert_(realthumb == expthumb)
259 def subtest_add_content_announce_list(self,merkle=True):
260 """ Add a single file with announce-list to a TorrentDef """
262 t.set_create_merkle_torrent(merkle)
263 fn = os.path.join(os.getcwd(),"file.wmv")
265 t.set_tracker(TRACKER)
266 exphier = [[TRACKER],['http://tracker1.tribler.org:6969/announce','http://tracker2.tribler.org:7070/ann'],['http://www.cs.vu.nl','http://www.st.ewi.tudelft.nl','http://www.vuze.com']]
267 t.set_tracker_hierarchy(exphier)
270 metainfo = t.get_metainfo()
271 self.general_check(metainfo)
272 realhier = metainfo['announce-list']
273 self.assert_(realhier == exphier)
276 def subtest_add_content_httpseeds(self,merkle=True):
277 """ Add a single file with BitTornado httpseeds to a TorrentDef """
279 t.set_create_merkle_torrent(merkle)
280 fn = os.path.join(os.getcwd(),"file.wmv")
282 t.set_tracker(TRACKER)
283 expseeds = ['http://www.cs.vu.nl/index.html','http://www.st.ewi.tudelft.nl/index.html']
284 t.set_httpseeds(expseeds)
287 metainfo = t.get_metainfo()
288 self.general_check(metainfo)
289 realseeds = metainfo['httpseeds']
290 self.assert_(realseeds == expseeds)
292 def subtest_add_content_torrentsig(self,merkle=True):
293 """ Add a single file to a TorrentDef and sign it """
295 t.set_create_merkle_torrent(merkle)
296 fn = os.path.join(os.getcwd(),"file.wmv")
297 kpfn = os.path.join(os.getcwd(),"ec.pem")
299 t.set_signature_keypair_filename(kpfn)
300 t.set_tracker(TRACKER)
303 metainfo = t.get_metainfo()
304 self.general_check(metainfo)
305 ret = verify_torrent_signature(metainfo)
306 self.assert_(ret == True)
309 def subtest_add_content_piece_length(self,merkle=True):
310 """ Add a single file with piece length to a TorrentDef """
312 t.set_create_merkle_torrent(merkle)
313 fn = os.path.join(os.getcwd(),"file.wmv")
315 t.set_piece_length(2 ** 16)
316 t.set_tracker(TRACKER)
319 metainfo = t.get_metainfo()
320 self.general_check(metainfo)
321 self.assert_(metainfo['info']['piece length'] == 2 ** 16)
324 def subtest_add_content_file_save(self,merkle=True):
325 """ Add a single file to a TorrentDef and save the latter"""
327 t.set_create_merkle_torrent(merkle)
328 fn = os.path.join(os.getcwd(),"file.wmv")
330 t.set_tracker(TRACKER)
333 tfn = os.path.join(os.getcwd(),"gen.torrent")
341 data = bdecode(bdata)
342 metainfo = t.get_metainfo()
343 self.general_check(metainfo)
344 self.assert_(metainfo == data)
347 def general_check(self,metainfo):
348 self.assert_(isValidTorrentFile(metainfo))
349 self.assert_(metainfo['announce'] == TRACKER)
355 suite = unittest.TestSuite()
356 suite.addTest(unittest.makeSuite(TestTorrentDef))
360 if __name__ == "__main__":