| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import BaseHTTPServer | 6 import BaseHTTPServer |
| 7 import logging | 7 import logging |
| 8 import os | 8 import os |
| 9 import re | 9 import re |
| 10 import SocketServer | 10 import SocketServer |
| 11 import sys | 11 import sys |
| 12 import threading | 12 import threading |
| 13 import time | 13 import time |
| 14 import unittest | 14 import unittest |
| 15 | 15 |
| 16 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 16 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 17 sys.path.insert(0, ROOT_DIR) | 17 sys.path.insert(0, ROOT_DIR) |
| 18 | 18 |
| 19 import run_isolated | 19 from utils import net |
| 20 | 20 |
| 21 | 21 |
| 22 class SleepingServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): | 22 class SleepingServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): |
| 23 """Multithreaded server that serves requests that block at various stages.""" | 23 """Multithreaded server that serves requests that block at various stages.""" |
| 24 | 24 |
| 25 def __init__(self): | 25 def __init__(self): |
| 26 BaseHTTPServer.HTTPServer.__init__(self, ('127.0.0.1', 0), SleepingHandler) | 26 BaseHTTPServer.HTTPServer.__init__(self, ('127.0.0.1', 0), SleepingHandler) |
| 27 self.dying = False | 27 self.dying = False |
| 28 self.dying_cv = threading.Condition() | 28 self.dying_cv = threading.Condition() |
| 29 self.serving_thread = None | 29 self.serving_thread = None |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 self.server.start() | 115 self.server.start() |
| 116 | 116 |
| 117 def tearDown(self): | 117 def tearDown(self): |
| 118 self.server.stop() | 118 self.server.stop() |
| 119 self.server = None | 119 self.server = None |
| 120 super(UrlOpenTimeoutTest, self).tearDown() | 120 super(UrlOpenTimeoutTest, self).tearDown() |
| 121 | 121 |
| 122 def call(self, mode, sleep_duration, **kwargs): | 122 def call(self, mode, sleep_duration, **kwargs): |
| 123 url = self.server.url + '/%s/%f' % (mode, sleep_duration) | 123 url = self.server.url + '/%s/%f' % (mode, sleep_duration) |
| 124 kwargs['max_attempts'] = 2 | 124 kwargs['max_attempts'] = 2 |
| 125 return run_isolated.url_open(url, **kwargs) | 125 return net.url_open(url, **kwargs) |
| 126 | 126 |
| 127 def test_urlopen_success(self): | 127 def test_urlopen_success(self): |
| 128 # Server doesn't block. | 128 # Server doesn't block. |
| 129 for mode in SleepingHandler.modes: | 129 for mode in SleepingHandler.modes: |
| 130 self.assertEqual(self.call(mode, 0, read_timeout=0.1).read(), | 130 self.assertEqual(self.call(mode, 0, read_timeout=0.1).read(), |
| 131 SleepingHandler.full_response) | 131 SleepingHandler.full_response) |
| 132 # Server does block, but url_open called without read timeout. | 132 # Server does block, but url_open called without read timeout. |
| 133 for mode in SleepingHandler.modes: | 133 for mode in SleepingHandler.modes: |
| 134 self.assertEqual(self.call(mode, 0.25, read_timeout=None).read(), | 134 self.assertEqual(self.call(mode, 0.25, read_timeout=None).read(), |
| 135 SleepingHandler.full_response) | 135 SleepingHandler.full_response) |
| 136 | 136 |
| 137 def test_urlopen_retry(self): | 137 def test_urlopen_retry(self): |
| 138 # This should trigger retry logic and eventually return None. | 138 # This should trigger retry logic and eventually return None. |
| 139 prev_sleep_before_retry = run_isolated.HttpService.sleep_before_retry | 139 prev_sleep_before_retry = net.HttpService.sleep_before_retry |
| 140 try: | 140 try: |
| 141 run_isolated.HttpService.sleep_before_retry = lambda *_args: None | 141 net.HttpService.sleep_before_retry = lambda *_args: None |
| 142 stream = self.call('sleep_before_response', 0.25, read_timeout=0.1) | 142 stream = self.call('sleep_before_response', 0.25, read_timeout=0.1) |
| 143 finally: | 143 finally: |
| 144 run_isolated.HttpService.sleep_before_retry = prev_sleep_before_retry | 144 net.HttpService.sleep_before_retry = prev_sleep_before_retry |
| 145 self.assertIsNone(stream) | 145 self.assertIsNone(stream) |
| 146 | 146 |
| 147 def test_urlopen_keeping_connection(self): | 147 def test_urlopen_keeping_connection(self): |
| 148 # Sleeping after request is sent -> it's just connection keep alive. | 148 # Sleeping after request is sent -> it's just connection keep alive. |
| 149 stream = self.call('sleep_after_response', 0.25, read_timeout=0.1) | 149 stream = self.call('sleep_after_response', 0.25, read_timeout=0.1) |
| 150 self.assertEqual(stream.read(), SleepingHandler.full_response) | 150 self.assertEqual(stream.read(), SleepingHandler.full_response) |
| 151 | 151 |
| 152 def test_urlopen_timeouts(self): | 152 def test_urlopen_timeouts(self): |
| 153 # Timeouts while reading from the stream. | 153 # Timeouts while reading from the stream. |
| 154 for mode in ('sleep_after_headers', 'sleep_during_response'): | 154 for mode in ('sleep_after_headers', 'sleep_during_response'): |
| 155 stream = self.call(mode, 0.25, read_timeout=0.1) | 155 stream = self.call(mode, 0.25, read_timeout=0.1) |
| 156 self.assertTrue(stream) | 156 self.assertTrue(stream) |
| 157 with self.assertRaises(run_isolated.TimeoutError): | 157 with self.assertRaises(net.TimeoutError): |
| 158 stream.read() | 158 stream.read() |
| 159 | 159 |
| 160 | 160 |
| 161 if __name__ == '__main__': | 161 if __name__ == '__main__': |
| 162 VERBOSE = '-v' in sys.argv | 162 VERBOSE = '-v' in sys.argv |
| 163 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR) | 163 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR) |
| 164 unittest.main() | 164 unittest.main() |
| OLD | NEW |