浏览代码

[tests] don't fail on network errors

This is suboptimal, but at least this way we will need to look at the logs
only to check for network errors that happen too often, instead of
parsing a ton of lines each time to see if there is some true test failing
Filippo Valsorda 12 年之前
父节点
当前提交
dd508b7c4f
共有 2 个文件被更改,包括 34 次插入5 次删除
  1. 17 0
      test/helper.py
  2. 17 5
      test/test_download.py

+ 17 - 0
test/helper.py

@@ -5,9 +5,11 @@ import json
 import os.path
 import os.path
 import re
 import re
 import types
 import types
+import sys
 
 
 import youtube_dl.extractor
 import youtube_dl.extractor
 from youtube_dl import YoutubeDL
 from youtube_dl import YoutubeDL
+from youtube_dl.utils import preferredencoding
 
 
 
 
 def global_setup():
 def global_setup():
@@ -33,6 +35,21 @@ def try_rm(filename):
             raise
             raise
 
 
 
 
+def report_warning(message):
+    '''
+    Print the message to stderr, it will be prefixed with 'WARNING:'
+    If stderr is a tty file the 'WARNING:' will be colored
+    '''
+    if sys.stderr.isatty() and os.name != 'nt':
+        _msg_header = u'\033[0;33mWARNING:\033[0m'
+    else:
+        _msg_header = u'WARNING:'
+    output = u'%s %s\n' % (_msg_header, message)
+    if 'b' in getattr(sys.stderr, 'mode', '') or sys.version_info[0] < 3:
+        output = output.encode(preferredencoding())
+    sys.stderr.write(output)
+
+
 class FakeYDL(YoutubeDL):
 class FakeYDL(YoutubeDL):
     def __init__(self, override=None):
     def __init__(self, override=None):
         # Different instances of the downloader can't share the same dictionary
         # Different instances of the downloader can't share the same dictionary

+ 17 - 5
test/test_download.py

@@ -6,7 +6,14 @@ import sys
 import unittest
 import unittest
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
 
-from test.helper import get_params, get_testcases, global_setup, try_rm, md5
+from test.helper import (
+    get_params,
+    get_testcases,
+    global_setup,
+    try_rm,
+    md5,
+    report_warning
+)
 global_setup()
 global_setup()
 
 
 
 
@@ -92,17 +99,22 @@ def generator(test_case):
                 try_rm(tc_filename + '.info.json')
                 try_rm(tc_filename + '.info.json')
         try_rm_tcs_files()
         try_rm_tcs_files()
         try:
         try:
-            for retry in range(1, RETRIES + 1):
+            try_num = 1
+            while True:
                 try:
                 try:
                     ydl.download([test_case['url']])
                     ydl.download([test_case['url']])
                 except (DownloadError, ExtractorError) as err:
                 except (DownloadError, ExtractorError) as err:
-                    if retry == RETRIES: raise
-
                     # Check if the exception is not a network related one
                     # Check if the exception is not a network related one
                     if not err.exc_info[0] in (compat_urllib_error.URLError, socket.timeout, UnavailableVideoError):
                     if not err.exc_info[0] in (compat_urllib_error.URLError, socket.timeout, UnavailableVideoError):
                         raise
                         raise
 
 
-                    print('Retrying: {0} failed tries\n\n##########\n\n'.format(retry))
+                    if try_num == RETRIES:
+                        report_warning(u'Failed due to network errors, skipping...')
+                        return
+
+                    print('Retrying: {0} failed tries\n\n##########\n\n'.format(try_num))
+
+                    try_num += 1
                 else:
                 else:
                     break
                     break