Index: swarm_client/tests/net_test.py |
=================================================================== |
--- swarm_client/tests/net_test.py (revision 235167) |
+++ swarm_client/tests/net_test.py (working copy) |
@@ -1,333 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-import logging |
-import math |
-import os |
-import sys |
-import unittest |
- |
-ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
-sys.path.insert(0, ROOT_DIR) |
- |
-import auto_stub |
-from utils import net |
- |
- |
-class RetryLoopMockedTest(auto_stub.TestCase): |
- """Base class for test cases that mock retry loop.""" |
- |
- def setUp(self): |
- super(RetryLoopMockedTest, self).setUp() |
- self._retry_attemps_cls = net.RetryAttempt |
- self.mock(net, 'sleep_before_retry', self.mocked_sleep_before_retry) |
- self.mock(net, 'current_time', self.mocked_current_time) |
- self.mock(net, 'RetryAttempt', self.mocked_retry_attempt) |
- self.sleeps = [] |
- self.attempts = [] |
- |
- def mocked_sleep_before_retry(self, attempt, max_wait): |
- self.sleeps.append((attempt, max_wait)) |
- |
- def mocked_current_time(self): |
- # One attempt is one virtual second. |
- return float(len(self.attempts)) |
- |
- def mocked_retry_attempt(self, *args, **kwargs): |
- attempt = self._retry_attemps_cls(*args, **kwargs) |
- self.attempts.append(attempt) |
- return attempt |
- |
- def assertAttempts(self, attempts, max_timeout): |
- """Asserts that retry loop executed given number of |attempts|.""" |
- expected = [(i, max_timeout - i) for i in xrange(attempts)] |
- actual = [(x.attempt, x.remaining) for x in self.attempts] |
- self.assertEqual(expected, actual) |
- |
- def assertSleeps(self, sleeps): |
- """Asserts that retry loop slept given number of times.""" |
- self.assertEqual(sleeps, len(self.sleeps)) |
- |
- |
-class RetryLoopTest(RetryLoopMockedTest): |
- """Test for retry_loop implementation.""" |
- |
- def test_sleep_before_retry(self): |
- # 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 = net.calculate_sleep_before_retry(0, 0) |
- b = net.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) |
- self.assertTrue(b < 1.5 + math.pow(1.5, -1), b) |
- self.assertNotEqual(a, b) |
- |
- |
-class GetHttpServiceTest(unittest.TestCase): |
- """Tests get_http_service implementation.""" |
- |
- def test_get_http_service(self): |
- def assert_is_appengine_service(service): |
- """Verifies HttpService is configured for App Engine communications.""" |
- self.assertTrue(service.use_count_key) |
- self.assertIsNotNone(service.authenticator) |
- |
- def assert_is_googlestorage_service(service): |
- """Verifies HttpService is configured for GS communications.""" |
- self.assertFalse(service.use_count_key) |
- self.assertIsNone(service.authenticator) |
- |
- # Can recognize app engine URLs. |
- assert_is_appengine_service( |
- net.get_http_service('https://appengine-app.appspot.com')) |
- assert_is_appengine_service( |
- net.get_http_service('https://version-dot-appengine-app.appspot.com')) |
- |
- # Localhost is also sort of appengine when running on dev server... |
- assert_is_appengine_service( |
- net.get_http_service('http://localhost:8080')) |
- |
- # Check GS urls. |
- assert_is_googlestorage_service( |
- net.get_http_service('https://bucket-name.storage.googleapis.com')) |
- |
- |
-class HttpServiceTest(RetryLoopMockedTest): |
- """Tests for HttpService class.""" |
- |
- @staticmethod |
- def mocked_http_service(url='http://example.com', perform_request=None, |
- authenticate=None): # pylint: disable=R0201 |
- class MockedAuthenticator(net.Authenticator): |
- def authenticate(self): |
- return authenticate() if authenticate else None |
- |
- class MockedRequestEngine(net.RequestEngine): |
- def perform_request(self, request): |
- return perform_request(request) if perform_request else None |
- |
- return net.HttpService( |
- url, |
- authenticator=MockedAuthenticator(), |
- engine=MockedRequestEngine()) |
- |
- def test_request_GET_success(self): |
- service_url = 'http://example.com' |
- request_url = '/some_request' |
- response = 'True' |
- |
- def mock_perform_request(request): |
- self.assertTrue( |
- request.get_full_url().startswith(service_url + request_url)) |
- return request.make_fake_response(response) |
- |
- service = self.mocked_http_service(url=service_url, |
- perform_request=mock_perform_request) |
- self.assertEqual(service.request(request_url).read(), response) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_POST_success(self): |
- service_url = 'http://example.com' |
- request_url = '/some_request' |
- response = 'True' |
- |
- def mock_perform_request(request): |
- self.assertTrue( |
- request.get_full_url().startswith(service_url + request_url)) |
- self.assertEqual('', request.body) |
- return request.make_fake_response(response) |
- |
- service = self.mocked_http_service(url=service_url, |
- perform_request=mock_perform_request) |
- self.assertEqual(service.request(request_url, data={}).read(), response) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_PUT_success(self): |
- service_url = 'http://example.com' |
- request_url = '/some_request' |
- request_body = 'data_body' |
- response_body = 'True' |
- content_type = 'application/octet-stream' |
- |
- def mock_perform_request(request): |
- self.assertTrue( |
- request.get_full_url().startswith(service_url + request_url)) |
- self.assertEqual(request_body, request.body) |
- self.assertEqual(request.method, 'PUT') |
- self.assertEqual(request.headers['Content-Type'], content_type) |
- return request.make_fake_response(response_body) |
- |
- service = self.mocked_http_service(url=service_url, |
- perform_request=mock_perform_request) |
- response = service.request(request_url, |
- data=request_body, content_type=content_type, method='PUT') |
- self.assertEqual(response.read(), response_body) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- |
- def test_request_success_after_failure(self): |
- response = 'True' |
- |
- def mock_perform_request(request): |
- params = dict(request.params) |
- if params.get(net.COUNT_KEY) != 1: |
- raise net.ConnectionError() |
- return request.make_fake_response(response) |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/', data={}).read(), response) |
- self.assertAttempts(2, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_failure_max_attempts_default(self): |
- def mock_perform_request(_request): |
- raise net.ConnectionError() |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/'), None) |
- self.assertAttempts(net.URL_OPEN_MAX_ATTEMPTS, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_failure_max_attempts(self): |
- def mock_perform_request(_request): |
- raise net.ConnectionError() |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/', max_attempts=23), None) |
- self.assertAttempts(23, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_failure_timeout(self): |
- def mock_perform_request(_request): |
- raise net.ConnectionError() |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/', max_attempts=10000), None) |
- self.assertAttempts(int(net.URL_OPEN_TIMEOUT) + 1, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_failure_timeout_default(self): |
- def mock_perform_request(_request): |
- raise net.ConnectionError() |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/', timeout=10.), None) |
- self.assertAttempts(11, 10.0) |
- |
- def test_request_HTTP_error_no_retry(self): |
- count = [] |
- def mock_perform_request(request): |
- count.append(request) |
- raise net.HttpError(400) |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertEqual(service.request('/', data={}), None) |
- self.assertEqual(1, len(count)) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_HTTP_error_retry_404(self): |
- response = 'data' |
- |
- def mock_perform_request(request): |
- params = dict(request.params) |
- if params.get(net.COUNT_KEY) == 1: |
- return request.make_fake_response(response) |
- raise net.HttpError(404) |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- result = service.request('/', data={}, retry_404=True) |
- self.assertEqual(result.read(), response) |
- self.assertAttempts(2, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_HTTP_error_with_retry(self): |
- response = 'response' |
- |
- def mock_perform_request(request): |
- params = dict(request.params) |
- if params.get(net.COUNT_KEY) != 1: |
- raise net.HttpError(500) |
- return request.make_fake_response(response) |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request) |
- self.assertTrue(service.request('/', data={}).read(), response) |
- self.assertAttempts(2, net.URL_OPEN_TIMEOUT) |
- |
- def test_auth_success(self): |
- count = [] |
- response = 'response' |
- |
- def mock_perform_request(request): |
- if not count: |
- raise net.HttpError(403) |
- return request.make_fake_response(response) |
- |
- def mock_authenticate(): |
- self.assertEqual(len(count), 0) |
- count.append(1) |
- return True |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request, |
- authenticate=mock_authenticate) |
- self.assertEqual(service.request('/').read(), response) |
- self.assertEqual(len(count), 1) |
- self.assertAttempts(2, net.URL_OPEN_TIMEOUT) |
- self.assertSleeps(0) |
- |
- def test_auth_failure(self): |
- count = [] |
- |
- def mock_perform_request(_request): |
- raise net.HttpError(403) |
- |
- def mock_authenticate(): |
- count.append(1) |
- return False |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request, |
- authenticate=mock_authenticate) |
- self.assertEqual(service.request('/'), None) |
- self.assertEqual(len(count), 1) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- def test_request_attempted_before_auth(self): |
- calls = [] |
- |
- def mock_perform_request(_request): |
- calls.append('perform_request') |
- raise net.HttpError(403) |
- |
- def mock_authenticate(): |
- calls.append('authenticate') |
- return False |
- |
- service = self.mocked_http_service(perform_request=mock_perform_request, |
- authenticate=mock_authenticate) |
- self.assertEqual(service.request('/'), None) |
- self.assertEqual(calls, ['perform_request', 'authenticate']) |
- self.assertAttempts(1, net.URL_OPEN_TIMEOUT) |
- |
- def test_url_read(self): |
- # Successfully reads the data. |
- 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(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 net.TimeoutError() |
- response = net.HttpResponse.get_fake_response('', url) |
- self.mock(response, 'read', read_mock) |
- return response |
- |
- 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__': |
- logging.basicConfig( |
- level=(logging.DEBUG if '-v' in sys.argv else logging.FATAL)) |
- if '-v' in sys.argv: |
- unittest.TestCase.maxDiff = None |
- unittest.main() |