| Index: tests/net_test.py
|
| diff --git a/tests/run_isolated_test.py b/tests/net_test.py
|
| similarity index 61%
|
| copy from tests/run_isolated_test.py
|
| copy to tests/net_test.py
|
| index 04a699bdaa026204e6d10310a3fda52d01bc9f97..505f7d21599c01a388f3bddb29ba1c2d9890c5e6 100755
|
| --- a/tests/run_isolated_test.py
|
| +++ b/tests/net_test.py
|
| @@ -3,15 +3,11 @@
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| -import json
|
| import logging
|
| import math
|
| import os
|
| -import shutil
|
| import StringIO
|
| import sys
|
| -import tempfile
|
| -import time
|
| import unittest
|
| import urllib2
|
|
|
| @@ -19,146 +15,16 @@ ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
| sys.path.insert(0, ROOT_DIR)
|
|
|
| import auto_stub
|
| -import run_isolated
|
| +from utils import net
|
|
|
| # Number of times self._now() is called per loop in HttpService._retry_loop().
|
| NOW_CALLS_PER_OPEN = 2
|
|
|
|
|
| -class RemoteTest(run_isolated.Remote):
|
| - def get_file_handler(self, _): # pylint: disable=R0201
|
| - def upload_file(item, _dest):
|
| - if type(item) == type(Exception) and issubclass(item, Exception):
|
| - raise item()
|
| - elif isinstance(item, int):
|
| - time.sleep(int(item) / 100)
|
| - return upload_file
|
| -
|
| -
|
| -def fake_http_response(content, url):
|
| - """Returns run_isolated.HttpResponse with predefined content."""
|
| - stream = StringIO.StringIO(content)
|
| - stream.headers = {'content-length': len(content)}
|
| - return run_isolated.HttpResponse(stream, url)
|
| -
|
| -
|
| -class RunIsolatedTest(auto_stub.TestCase):
|
| - def setUp(self):
|
| - super(RunIsolatedTest, self).setUp()
|
| - self.tempdir = tempfile.mkdtemp(prefix='run_isolated')
|
| - os.chdir(self.tempdir)
|
| -
|
| - def tearDown(self):
|
| - os.chdir(ROOT_DIR)
|
| - shutil.rmtree(self.tempdir)
|
| - super(RunIsolatedTest, self).tearDown()
|
| -
|
| - def test_load_isolated_empty(self):
|
| - m = run_isolated.load_isolated('{}')
|
| - self.assertEqual({}, m)
|
| -
|
| - def test_load_isolated_good(self):
|
| - data = {
|
| - u'command': [u'foo', u'bar'],
|
| - u'files': {
|
| - u'a': {
|
| - u'l': u'somewhere',
|
| - u'm': 123,
|
| - },
|
| - u'b': {
|
| - u'm': 123,
|
| - u'h': u'0123456789abcdef0123456789abcdef01234567'
|
| - }
|
| - },
|
| - u'includes': [u'0123456789abcdef0123456789abcdef01234567'],
|
| - u'os': run_isolated.get_flavor(),
|
| - u'read_only': False,
|
| - u'relative_cwd': u'somewhere_else'
|
| - }
|
| - m = run_isolated.load_isolated(json.dumps(data))
|
| - self.assertEqual(data, m)
|
| -
|
| - def test_load_isolated_bad(self):
|
| - data = {
|
| - u'files': {
|
| - u'a': {
|
| - u'l': u'somewhere',
|
| - u'h': u'0123456789abcdef0123456789abcdef01234567'
|
| - }
|
| - },
|
| - }
|
| - try:
|
| - run_isolated.load_isolated(json.dumps(data))
|
| - self.fail()
|
| - except run_isolated.ConfigError:
|
| - pass
|
| -
|
| - def test_load_isolated_os_only(self):
|
| - data = {
|
| - u'os': run_isolated.get_flavor(),
|
| - }
|
| - m = run_isolated.load_isolated(json.dumps(data))
|
| - self.assertEqual(data, m)
|
| -
|
| - def test_load_isolated_os_bad(self):
|
| - data = {
|
| - u'os': 'foo',
|
| - }
|
| - try:
|
| - run_isolated.load_isolated(json.dumps(data))
|
| - self.fail()
|
| - except run_isolated.ConfigError:
|
| - pass
|
| -
|
| - def test_remote_no_errors(self):
|
| - files_to_handle = 50
|
| - remote = RemoteTest('')
|
| -
|
| - for i in range(files_to_handle):
|
| - remote.add_item(
|
| - run_isolated.Remote.MED,
|
| - 'obj%d' % i,
|
| - 'dest%d' % i,
|
| - run_isolated.UNKNOWN_FILE_SIZE)
|
| -
|
| - items = sorted(remote.join())
|
| - expected = sorted('obj%d' % i for i in range(files_to_handle))
|
| - self.assertEqual(expected, items)
|
| -
|
| - def test_remote_with_errors(self):
|
| - remote = RemoteTest('')
|
| -
|
| - def RaiseIOError(*_):
|
| - raise IOError()
|
| - remote._do_item = RaiseIOError
|
| - remote.add_item(run_isolated.Remote.MED, 'ignored', '',
|
| - run_isolated.UNKNOWN_FILE_SIZE)
|
| - self.assertRaises(IOError, remote.join)
|
| - self.assertEqual([], remote.join())
|
| -
|
| - def test_zip_header_error(self):
|
| - self.mock(run_isolated, 'url_open',
|
| - lambda url, **_kwargs: fake_http_response('111', url))
|
| - self.mock(run_isolated.time, 'sleep', lambda _x: None)
|
| -
|
| - remote = run_isolated.Remote('https://fake-CAD.com/')
|
| -
|
| - # Both files will fail to be unzipped due to incorrect headers,
|
| - # ensure that we don't accept the files (even if the size is unknown)}.
|
| - remote.add_item(run_isolated.Remote.MED, 'zipped_A', 'A',
|
| - run_isolated.UNKNOWN_FILE_SIZE)
|
| - remote.add_item(run_isolated.Remote.MED, 'zipped_B', 'B', 5)
|
| - self.assertRaises(IOError, remote.get_one_result)
|
| - self.assertRaises(IOError, remote.get_one_result)
|
| - # Need to use join here, since get_one_result will hang.
|
| - self.assertEqual([], remote.join())
|
| -
|
| -
|
| -
|
| class HttpServiceTest(auto_stub.TestCase):
|
|
|
| # HttpService that doesn't sleep in retries and doesn't write cookie files.
|
| - class HttpServiceNoSideEffects(run_isolated.HttpService):
|
| + class HttpServiceNoSideEffects(net.HttpService):
|
| def __init__(self, *args, **kwargs):
|
| super(HttpServiceTest.HttpServiceNoSideEffects, self).__init__(
|
| *args, **kwargs)
|
| @@ -219,14 +85,14 @@ class HttpServiceTest(auto_stub.TestCase):
|
| response = 'True'
|
|
|
| def mock_url_open(request, **_kwargs):
|
| - if run_isolated.COUNT_KEY + '=1' not in request.get_data():
|
| + if net.COUNT_KEY + '=1' not in request.get_data():
|
| raise urllib2.URLError('url')
|
| return StringIO.StringIO(response)
|
|
|
| service = self.mocked_http_service(_url_open=mock_url_open)
|
| self.assertEqual(service.request('/', data={}).read(), response)
|
| self.assertEqual(
|
| - [(0, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| + [(0, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| service.sleeps)
|
|
|
| def test_request_failure_max_attempts_default(self):
|
| @@ -235,8 +101,8 @@ class HttpServiceTest(auto_stub.TestCase):
|
| service = self.mocked_http_service(_url_open=mock_url_open)
|
| self.assertEqual(service.request('/'), None)
|
| retries = [
|
| - (i, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| - for i in xrange(run_isolated.URL_OPEN_MAX_ATTEMPTS)
|
| + (i, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| + for i in xrange(net.URL_OPEN_MAX_ATTEMPTS)
|
| ]
|
| self.assertEqual(retries, service.sleeps)
|
|
|
| @@ -246,7 +112,7 @@ class HttpServiceTest(auto_stub.TestCase):
|
| service = self.mocked_http_service(_url_open=mock_url_open)
|
| self.assertEqual(service.request('/', max_attempts=23), None)
|
| retries = [
|
| - (i, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| + (i, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| for i in xrange(23)
|
| ]
|
| self.assertEqual(retries, service.sleeps)
|
| @@ -257,10 +123,10 @@ class HttpServiceTest(auto_stub.TestCase):
|
| service = self.mocked_http_service(_url_open=mock_url_open)
|
| self.assertEqual(service.request('/', max_attempts=10000), None)
|
| retries = [
|
| - (i, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| + (i, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN * (i + 1))
|
| # Currently 179 for timeout == 360.
|
| for i in xrange(
|
| - int(run_isolated.URL_OPEN_TIMEOUT) / NOW_CALLS_PER_OPEN - 1)
|
| + int(net.URL_OPEN_TIMEOUT) / NOW_CALLS_PER_OPEN - 1)
|
| ]
|
| self.assertEqual(retries, service.sleeps)
|
|
|
| @@ -287,7 +153,7 @@ class HttpServiceTest(auto_stub.TestCase):
|
| def test_request_HTTP_error_retry_404(self):
|
| response = 'data'
|
| def mock_url_open(request, **_kwargs):
|
| - if run_isolated.COUNT_KEY + '=1' in request.get_data():
|
| + if net.COUNT_KEY + '=1' in request.get_data():
|
| return StringIO.StringIO(response)
|
| raise urllib2.HTTPError(
|
| 'url', 404, 'error message', None, StringIO.StringIO())
|
| @@ -296,14 +162,14 @@ class HttpServiceTest(auto_stub.TestCase):
|
| result = service.request('/', data={}, retry_404=True)
|
| self.assertEqual(result.read(), response)
|
| self.assertEqual(
|
| - [(0, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| + [(0, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| service.sleeps)
|
|
|
| def test_request_HTTP_error_with_retry(self):
|
| response = 'response'
|
|
|
| def mock_url_open(request, **_kwargs):
|
| - if run_isolated.COUNT_KEY + '=1' not in request.get_data():
|
| + if net.COUNT_KEY + '=1' not in request.get_data():
|
| raise urllib2.HTTPError(
|
| 'url', 500, 'error message', None, StringIO.StringIO())
|
| return StringIO.StringIO(response)
|
| @@ -311,11 +177,11 @@ class HttpServiceTest(auto_stub.TestCase):
|
| service = self.mocked_http_service(_url_open=mock_url_open)
|
| self.assertTrue(service.request('/', data={}).read(), response)
|
| self.assertEqual(
|
| - [(0, run_isolated.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| + [(0, net.URL_OPEN_TIMEOUT - NOW_CALLS_PER_OPEN)],
|
| service.sleeps)
|
|
|
| def test_count_key_in_data_failure(self):
|
| - data = {run_isolated.COUNT_KEY: 1}
|
| + data = {net.COUNT_KEY: 1}
|
| service = self.mocked_http_service()
|
| self.assertEqual(service.request('/', data=data), None)
|
| self.assertEqual([], service.sleeps)
|
| @@ -371,8 +237,8 @@ class HttpServiceTest(auto_stub.TestCase):
|
| # Verifies bounds. Because it's using a pseudo-random number generator and
|
| # not a read random source, it's basically guaranteed to never return the
|
| # same value twice consecutively.
|
| - a = run_isolated.HttpService.calculate_sleep_before_retry(0, 0)
|
| - b = run_isolated.HttpService.calculate_sleep_before_retry(0, 0)
|
| + a = net.HttpService.calculate_sleep_before_retry(0, 0)
|
| + b = net.HttpService.calculate_sleep_before_retry(0, 0)
|
| self.assertTrue(a >= math.pow(1.5, -1), a)
|
| self.assertTrue(b >= math.pow(1.5, -1), b)
|
| self.assertTrue(a < 1.5 + math.pow(1.5, -1), a)
|
| @@ -381,27 +247,26 @@ class HttpServiceTest(auto_stub.TestCase):
|
|
|
| def test_url_read(self):
|
| # Successfully reads the data.
|
| - self.mock(run_isolated, 'url_open',
|
| - lambda url, **_kwargs: fake_http_response('111', url))
|
| - self.assertEqual(run_isolated.url_read('https://fake_url.com/test'), '111')
|
| + self.mock(net, 'url_open',
|
| + lambda url, **_kwargs: net.HttpResponse.get_fake_response('111', url))
|
| + self.assertEqual(net.url_read('https://fake_url.com/test'), '111')
|
|
|
| # Respects url_open connection errors.
|
| - self.mock(run_isolated, 'url_open', lambda _url, **_kwargs: None)
|
| - self.assertIsNone(run_isolated.url_read('https://fake_url.com/test'))
|
| + self.mock(net, 'url_open', lambda _url, **_kwargs: None)
|
| + self.assertIsNone(net.url_read('https://fake_url.com/test'))
|
|
|
| # Respects read timeout errors.
|
| def timeouting_http_response(url):
|
| def read_mock(_size=None):
|
| - raise run_isolated.TimeoutError()
|
| - stream = StringIO.StringIO('')
|
| - stream.headers = {'content-length': 0}
|
| - response = run_isolated.HttpResponse(stream, url)
|
| - response.read = read_mock
|
| + raise net.TimeoutError()
|
| + response = net.HttpResponse(StringIO.StringIO(''),
|
| + url, {'content-length': 0})
|
| + self.mock(response, 'read', read_mock)
|
| return response
|
|
|
| - self.mock(run_isolated, 'url_open',
|
| - lambda url, **_kwargs: timeouting_http_response(url))
|
| - self.assertIsNone(run_isolated.url_read('https://fake_url.com/test'))
|
| + self.mock(net, 'url_open',
|
| + lambda url, **_kwargs: timeouting_http_response(url))
|
| + self.assertIsNone(net.url_read('https://fake_url.com/test'))
|
|
|
|
|
| if __name__ == '__main__':
|
|
|