2 Test suite for parsing.py. Uses unittest module.
4 2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro
16 class LibtorrentLogParserTest(unittest.TestCase):
17 """Test suite for LibtorrentLogParser class in parsing.py."""
21 status_file = "status.log"
22 verbose_file1 = "141.85.224.201_12345.log"
23 verbose_file2 = "141.85.224.202_12345.log"
24 verbose_file3 = "141.85.224.203_12345.log"
25 bogus_file1 = "dht.log"
26 bogus_file2 = "141.85.224.203.log"
27 bogus_file3 = "12345.log"
30 # Create folder and log files.
32 self.ok_status_file_path = os.path.join(self.ok_dir,
34 self.ok_verbose_file_path1 = os.path.join(self.ok_dir,
36 self.ok_verbose_file_path2 = os.path.join(self.ok_dir,
38 self.ok_verbose_file_path3 = os.path.join(self.ok_dir,
40 self.ok_bogus_file_path1 = os.path.join(self.ok_dir,
42 self.ok_bogus_file_path2 = os.path.join(self.ok_dir,
44 self.ok_bogus_file_path3 = os.path.join(self.ok_dir,
46 f = open(self.ok_status_file_path, "w")
48 f = open(self.ok_verbose_file_path1, "w")
50 f = open(self.ok_verbose_file_path2, "w")
52 f = open(self.ok_verbose_file_path3, "w")
54 f = open(self.ok_bogus_file_path1, "w")
56 f = open(self.ok_bogus_file_path2, "w")
58 f = open(self.ok_bogus_file_path3, "w")
61 # Initialize message type counters.
62 self.statmsg_count = 0
63 self.pstatmsg_count = 0
64 self.verbmsg_count = 0
66 # Initialize internal call counts.
67 self.bogus_line_num_calls = 0
68 self.status_line_num_calls = 0
69 self.peer_status_line_num_calls = 0
70 self.verbose_line_num_calls = 0
72 # Remove no_dir in case it exists.
74 shutil.rmtree(self.no_dir)
79 shutil.rmtree(self.ok_dir)
80 # Remove no_dir in case it exists.
82 shutil.rmtree(self.no_dir)
86 def append_line(self, filename, line):
87 """Add (append) a line to to a file."""
88 f = open(filename, "at")
92 def add_bogus_line(self, filename):
93 """Add bogus (non-relevant) line to file."""
94 if self.bogus_line_num_calls == 0:
95 self.append_line(filename, "Nebuchadnezzar")
97 self.append_line(filename, "Assurbanipal")
98 self.bogus_line_num_calls = self.bogus_line_num_calls + 1
100 def add_status_line(self, filename):
101 """Add status line to file."""
102 if self.status_line_num_calls == 0:
103 self.append_line(filename, "ps: 5, dht: 21 <> dl: 462.1kb/s, ul: 255.2kb/s <> dld: 45mb, uld: 3mb, size: 698mb <> eta: 24m 7s")
105 self.append_line(filename, "ps: 5, dht: 21 <> dl: 469kb/s, ul: 255.66kb/s <> dld: 46mb, uld: 4mb, size: 698mb <> eta: 23m 45s")
106 self.status_line_num_calls = self.status_line_num_calls + 1
108 def add_peer_status_line(self, filename):
109 """Add peer status line to file."""
110 if self.peer_status_line_num_calls == 0:
111 self.append_line(filename, "--Peers: (Aug 14 17:22:35) [ ip: 10.1.7.5:33289, dl: 86.63kb/s, ul: 175.07kb/s ][ ip: 10.1.9.5:55611, dl: 14.63kb/s, ul: 110.79kb/s ][ ip: 10.1.8.5:6881, dl: 2.96kb/s, ul: 92.85kb/s ][ ip: 10.1.6.5:47254, dl: 80.1kb/s, ul: 176.44kb/s ][ ip: 10.1.4.5:6881, dl: 115.16kb/s, ul: 167.83kb/s ][ ip: 10.1.5.5:45222, dl: 108.39kb/s, ul: 158.11kb/s ][ ip: 10.1.10.5:48923, dl: 66.16kb/s, ul: 121.92kb/s ][ ip: 10.1.1.5:51146, dl: 198.66kb/s, ul: 6.11kb/s ]")
113 self.append_line(filename, "--Peers: (Aug 14 17:22:40) [ ip: 10.1.7.5:33289, dl: 23.6kb/s, ul: 94.91kb/s ][ ip: 10.1.6.5:47254, dl: 55.61kb/s, ul: 100.72kb/s ][ ip: 10.1.4.5:6881, dl: 93.99kb/s, ul: 100.11kb/s ][ ip: 10.1.10.5:48923, dl: 57.42kb/s, ul: 205.74kb/s ]")
114 self.peer_status_line_num_calls = self.peer_status_line_num_calls + 1
116 def add_verbose_line(self, filename):
117 """Add verbose line to file."""
118 if self.verbose_line_num_calls == 0:
119 self.append_line(filename, "Jan 08 22:20:50 <== REQUEST [ piece: 8a | s: 38000 | l: 4000 ]")
121 self.append_line(filename, "Jan 08 22:20:50 ==> PIECE [ piece: 8a | s: 34000 | l: 4000 ]")
122 self.verbose_line_num_calls = self.verbose_line_num_calls + 1
124 def add_message_to_count(self, msg):
125 """Update message type counters according to msg."""
126 if msg.__class__ == storage.StatusMessage:
127 self.statmsg_count = self.statmsg_count + 1
128 elif msg.__class__ == storage.PeerStatusMessage:
129 self.pstatmsg_count = self.pstatmsg_count + 1
130 elif msg.__class__ == storage.VerboseMessage:
131 self.verbmsg_count = self.verbmsg_count + 1
133 def test_non_existent_folder(self):
134 """libtorrent log folder doesn't exist.
135 Exception should be raised.
137 exception_raised = False
139 p = parsing.LibtorrentLogParser(self.no_dir)
141 exception_raised = True
143 self.assertEqual(exception_raised, True)
145 def test_no_log_files(self):
146 """No log files are present in the log folder.
147 Exception should be raised.
150 os.remove(self.ok_status_file_path)
151 os.remove(self.ok_verbose_file_path1)
152 os.remove(self.ok_verbose_file_path2)
153 os.remove(self.ok_verbose_file_path3)
155 exception_raised = False
157 p = parsing.LibtorrentLogParser(self.ok_dir)
158 except (IOError, OSError, IndexError), e:
159 exception_raised = True
161 self.assertEqual(exception_raised, True)
163 def test_get_parsing_file_no_status_log_file(self):
164 """No status log file is present.
165 Use get_current_parsing_filename() to get current log file.
167 # Remove status log file.
168 os.remove(self.ok_status_file_path)
170 p = parsing.LibtorrentLogParser(self.ok_dir)
171 current = p.get_current_parsing_filename()
173 value = (current == self.ok_verbose_file_path1 or
174 current == self.ok_verbose_file_path2 or
175 current == self.ok_verbose_file_path3)
176 self.assertEqual(value, True)
178 def test_get_to_parse_files_no_status_log_files(self):
179 """No status log file is present.
180 Use get_to_parse_list() to get files to be parsed.
182 # Remove status log file.
183 os.remove(self.ok_status_file_path)
185 # to_parse list should consists of 2 entries: the verbose log
186 # files minus the one that is currently being parsed.
187 p = parsing.LibtorrentLogParser(self.ok_dir)
188 count = len(p.get_to_parse_list())
190 self.assertEqual(count, 2)
192 def test_get_parsing_file_no_verbose_log_files(self):
193 """No verbose log file is present.
194 Use get_current_parsing_filename() to get current log file.
196 # Remove status log file.
197 os.remove(self.ok_verbose_file_path1)
198 os.remove(self.ok_verbose_file_path2)
199 os.remove(self.ok_verbose_file_path3)
201 p = parsing.LibtorrentLogParser(self.ok_dir)
202 current = p.get_current_parsing_filename()
204 value = (current == self.ok_status_file_path)
205 self.assertEqual(value, True)
207 def test_get_to_parse_files_no_verbose_log_files(self):
208 """No verbose log file is present.
209 Use get_to_parse_list() to get files to be parsed.
211 # Remove verbose log files.
212 os.remove(self.ok_verbose_file_path1)
213 os.remove(self.ok_verbose_file_path2)
214 os.remove(self.ok_verbose_file_path3)
216 # to_parse list should be empty: no verbose files and the
217 # status file is currently being parsed.
218 p = parsing.LibtorrentLogParser(self.ok_dir)
219 count = len(p.get_to_parse_list())
221 self.assertEqual(count, 0)
223 def test_get_parsing_status_priority(self):
224 """Set priority as "status".
225 get_current_parsing_filename() should return status log file.
227 p = parsing.LibtorrentLogParser(self.ok_dir, priority="status")
228 current = p.get_current_parsing_filename()
230 value = (current == self.ok_status_file_path)
231 self.assertEqual(value, True)
233 def test_get_parsing_verbose_priority(self):
234 """Set priority as "status".
235 get_current_parsing_filename() should return a verbose log file.
237 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
238 current = p.get_current_parsing_filename()
240 value = (current == self.ok_verbose_file_path1 or
241 current == self.ok_verbose_file_path2 or
242 current == self.ok_verbose_file_path3)
243 self.assertEqual(value, True)
245 def test_get_message_no_status_log_file_empty_verbose_log_files(self):
246 """Status log file does not exist, verbose log files are empty.
247 Returned message should be None.
249 # Remove status log file.
250 os.remove(self.ok_status_file_path)
252 p = parsing.LibtorrentLogParser(self.ok_dir)
253 msg = p.get_next_message()
255 self.assertEqual(msg, None)
257 def test_get_message_no_verbose_log_files_empty_status_log_file(self):
258 """Verbose log files do not exist, status log file is empty.
259 Returned message should be None.
261 # Remove verbose log files.
262 os.remove(self.ok_verbose_file_path1)
263 os.remove(self.ok_verbose_file_path2)
264 os.remove(self.ok_verbose_file_path3)
266 p = parsing.LibtorrentLogParser(self.ok_dir)
267 msg = p.get_next_message()
269 self.assertEqual(msg, None)
271 def test_get_message_empty_log_files(self):
272 """Log files are empty.
273 Returned message should be None.
275 p = parsing.LibtorrentLogParser(self.ok_dir)
276 msg = p.get_next_message()
278 self.assertEqual(msg, None)
280 def test_get_none_message_in_status_log_file(self):
281 """Status log file consists of bogus information (no messages).
282 Set priority as "status".
283 Message is returned from verbose log file.
285 self.add_bogus_line(self.ok_status_file_path)
286 self.add_verbose_line(self.ok_verbose_file_path1)
288 p = parsing.LibtorrentLogParser(self.ok_dir, priority="status")
289 msg = p.get_next_message()
291 self.add_message_to_count(msg)
293 self.assertEqual(self.verbmsg_count, 1)
295 def test_get_none_message_in_verbose_log_files(self):
296 """Verbose log files consist of bogus information (no messages).
297 Set priority as "verbose".
298 Message is returned from status log file.
300 self.add_bogus_line(self.ok_verbose_file_path1)
301 self.add_bogus_line(self.ok_verbose_file_path2)
302 self.add_bogus_line(self.ok_verbose_file_path3)
303 self.add_status_line(self.ok_status_file_path)
305 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
306 msg = p.get_next_message()
308 self.add_message_to_count(msg)
310 self.assertEqual(self.statmsg_count, 1)
312 def test_get_status_message(self):
313 """Return a status message from status log file."""
314 self.add_status_line(self.ok_status_file_path)
316 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
317 msg = p.get_next_message()
319 self.add_message_to_count(msg)
321 self.assertEqual(self.statmsg_count, 1)
323 def test_get_status_messages(self):
324 """Return multiple status messages from status log file."""
325 self.add_status_line(self.ok_status_file_path)
326 self.add_status_line(self.ok_status_file_path)
328 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
329 msg1 = p.get_next_message()
330 msg2 = p.get_next_message()
332 self.add_message_to_count(msg1)
333 self.add_message_to_count(msg2)
335 self.assertEqual(self.statmsg_count, 2)
337 def test_get_status_messages_different_files(self):
338 """Return multiple status messages from different log files."""
339 self.add_status_line(self.ok_status_file_path)
340 self.add_status_line(self.ok_verbose_file_path1)
342 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
343 msg1 = p.get_next_message()
344 msg2 = p.get_next_message()
346 self.add_message_to_count(msg1)
347 self.add_message_to_count(msg2)
349 self.assertEqual(self.statmsg_count, 2)
351 def test_get_peer_status_message(self):
352 """Return a peer status message from status log file."""
353 self.add_peer_status_line(self.ok_status_file_path)
355 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
356 msg = p.get_next_message()
358 self.add_message_to_count(msg)
360 self.assertEqual(self.pstatmsg_count, 1)
362 def test_get_peer_status_messages(self):
363 """Return multiple peer status messages from status log file."""
364 self.add_peer_status_line(self.ok_status_file_path)
365 self.add_peer_status_line(self.ok_status_file_path)
367 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
368 msg1 = p.get_next_message()
369 msg2 = p.get_next_message()
371 self.add_message_to_count(msg1)
372 self.add_message_to_count(msg2)
374 self.assertEqual(self.pstatmsg_count, 2)
376 def test_get_peer_status_messages_different_files(self):
377 """Return multiple peer status messages from different log files."""
378 self.add_peer_status_line(self.ok_status_file_path)
379 self.add_peer_status_line(self.ok_verbose_file_path1)
381 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
382 msg1 = p.get_next_message()
383 msg2 = p.get_next_message()
385 self.add_message_to_count(msg1)
386 self.add_message_to_count(msg2)
388 self.assertEqual(self.pstatmsg_count, 2)
390 def test_get_verbose_message(self):
391 """Return a verbose message from verbose log file."""
392 self.add_verbose_line(self.ok_verbose_file_path1)
394 p = parsing.LibtorrentLogParser(self.ok_dir, priority="status")
395 msg = p.get_next_message()
397 self.add_message_to_count(msg)
399 self.assertEqual(self.verbmsg_count, 1)
401 def test_get_verbose_messages(self):
402 """Return multiple verbose messages from verbose log file."""
403 self.add_verbose_line(self.ok_verbose_file_path1)
404 self.add_verbose_line(self.ok_verbose_file_path1)
406 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
407 msg1 = p.get_next_message()
408 msg2 = p.get_next_message()
410 self.add_message_to_count(msg1)
411 self.add_message_to_count(msg2)
413 self.assertEqual(self.verbmsg_count, 2)
415 def test_get_verbose_messages_different_files(self):
416 """Return multiple verbose messages from different log files."""
417 self.add_verbose_line(self.ok_verbose_file_path1)
418 self.add_verbose_line(self.ok_verbose_file_path2)
420 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
421 msg1 = p.get_next_message()
422 msg2 = p.get_next_message()
424 self.add_message_to_count(msg1)
425 self.add_message_to_count(msg2)
427 self.assertEqual(self.verbmsg_count, 2)
429 def test_get_mixed_messages_same_file(self):
430 """Status file contains multiple messages of different types."""
431 self.add_status_line(self.ok_status_file_path)
432 self.add_peer_status_line(self.ok_status_file_path)
433 self.add_verbose_line(self.ok_status_file_path)
435 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
436 msg1 = p.get_next_message()
437 msg2 = p.get_next_message()
438 msg3 = p.get_next_message()
440 self.add_message_to_count(msg1)
441 self.add_message_to_count(msg2)
442 self.add_message_to_count(msg3)
444 self.assertEqual(self.statmsg_count, 1)
445 self.assertEqual(self.pstatmsg_count, 1)
446 self.assertEqual(self.verbmsg_count, 1)
448 def test_get_mixed_messages_own_file(self):
449 """Each log file contains a single type of messages."""
450 self.add_status_line(self.ok_status_file_path)
451 self.add_status_line(self.ok_status_file_path)
452 self.add_peer_status_line(self.ok_verbose_file_path1)
453 self.add_peer_status_line(self.ok_verbose_file_path1)
454 self.add_verbose_line(self.ok_verbose_file_path2)
455 self.add_verbose_line(self.ok_verbose_file_path2)
457 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
458 msg1 = p.get_next_message()
459 msg2 = p.get_next_message()
460 msg3 = p.get_next_message()
461 msg4 = p.get_next_message()
462 msg5 = p.get_next_message()
463 msg6 = p.get_next_message()
465 self.add_message_to_count(msg1)
466 self.add_message_to_count(msg2)
467 self.add_message_to_count(msg3)
468 self.add_message_to_count(msg4)
469 self.add_message_to_count(msg5)
470 self.add_message_to_count(msg6)
472 self.assertEqual(self.statmsg_count, 2)
473 self.assertEqual(self.pstatmsg_count, 2)
474 self.assertEqual(self.verbmsg_count, 2)
476 def test_get_mixed_messages_different_files(self):
477 """Log files contain different message types."""
478 self.add_status_line(self.ok_status_file_path)
479 self.add_status_line(self.ok_status_file_path)
480 self.add_peer_status_line(self.ok_verbose_file_path1)
481 self.add_peer_status_line(self.ok_verbose_file_path1)
482 self.add_verbose_line(self.ok_verbose_file_path2)
483 self.add_verbose_line(self.ok_verbose_file_path2)
485 p = parsing.LibtorrentLogParser(self.ok_dir, priority="verbose")
486 msg1 = p.get_next_message()
487 msg2 = p.get_next_message()
488 msg3 = p.get_next_message()
489 msg4 = p.get_next_message()
490 msg5 = p.get_next_message()
491 msg6 = p.get_next_message()
493 self.add_message_to_count(msg1)
494 self.add_message_to_count(msg2)
495 self.add_message_to_count(msg3)
496 self.add_message_to_count(msg4)
497 self.add_message_to_count(msg5)
498 self.add_message_to_count(msg6)
500 self.assertEqual(self.statmsg_count, 2)
501 self.assertEqual(self.pstatmsg_count, 2)
502 self.assertEqual(self.verbmsg_count, 2)
505 class TriblerLogParserTest(unittest.TestCase):
506 """Test suite for TriblerLogParser class in parsing.py."""
514 if __name__ == "__main__":
515 # suite = unittest.TestSuite()
516 # suite.addTest(LibtorrentLogParserTest('test_get_status_message'))
517 # suite.addTest(LibtorrentLogParserTest('test_get_status_messages'))
518 # suite.addTest(LibtorrentLogParserTest('test_get_status_messages_different_files'))
519 # suite.addTest(LibtorrentLogParserTest('test_get_verbose_message'))
520 # suite.addTest(LibtorrentLogParserTest('test_get_verbose_messages'))
521 # suite.addTest(LibtorrentLogParserTest('test_get_verbose_messages_different_files'))
522 # unittest.TextTestRunner().run(suite)