test automation
[youtube-dl] / test / test_download.py
1 #!/usr/bin/env python2
2 import hashlib
3 import os
4 import json
5 import unittest
6 import sys
7
8 from youtube_dl.FileDownloader import FileDownloader
9 #import all the info extractor
10 import youtube_dl
11
12 DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json')
13 PARAM_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'parameters.json'
14 )
15
16
17 class TestDownload(unittest.TestCase):
18     pass
19
20
21 def md5_for_file(filename, block_size=2**20):
22     with open(filename) as f:
23         md5 = hashlib.md5()
24         while True:
25             data = f.read(block_size)
26             if not data:
27                 break
28             md5.update(data)
29         return md5.hexdigest()
30
31
32 def generator(name, url, md5, file, ie_param, optional_ie):
33     def test_template(self):
34         fd = FileDownloader(ie_param)
35         fd.add_info_extractor(getattr(youtube_dl, name + "IE")())
36         fd.download([url])
37         self.assertTrue(os.path.exists(file))
38         self.assertEqual(md5_for_file(file), md5)
39     return test_template
40     #only python 2.7
41
42 def clean_generator(files):
43     def clean_template(self):
44         for file_name in files:
45             if os.path.exists(file_name):
46                 os.remove(file_name)
47     return clean_template
48
49 with open(DEF_FILE, "r") as f:
50     with open(PARAM_FILE) as fp:
51         p = json.load(fp)
52         test_param = json.load(f)
53         files = set()
54         for test_case in test_param:
55             if test_case.get("broken", False):
56                 continue
57             try:
58                 files.add(test_case["file"])
59                 test_method = generator(test_case['name'], test_case['url'], test_case['md5'], test_case['file'], p, test_case.get('add_ie', []))
60                 test_method.__name__ = "test_{0}".format(test_case["name"])
61                 setattr(TestDownload, test_method.__name__, test_method)
62                 del test_method
63             except KeyError as e:
64                 sys.stderr.write("Issue with the parameters of test {0}.\n".format(test_case.get("name", "unknown test")))
65         #clean the files
66         ff = clean_generator(files)
67         ff.__name__ = "tearDown"
68         setattr(TestDownload, ff.__name__, ff)
69         del ff
70
71
72 if __name__ == '__main__':
73     unittest.main()