Index: infra_libs/test/httplib2_utils_test.py |
diff --git a/infra_libs/test/httplib2_utils_test.py b/infra_libs/test/httplib2_utils_test.py |
deleted file mode 100644 |
index 21d57354cdffbf5374a612a83877d6bbecc01689..0000000000000000000000000000000000000000 |
--- a/infra_libs/test/httplib2_utils_test.py |
+++ /dev/null |
@@ -1,364 +0,0 @@ |
-# Copyright 2015 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 os |
-import socket |
-import time |
-import unittest |
- |
-import infra_libs |
-from infra_libs.ts_mon.common import http_metrics |
-from infra_libs import httplib2_utils |
-from infra_libs import ts_mon |
- |
-import httplib2 |
-import mock |
-import oauth2client.client |
- |
- |
-DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data') |
- |
- |
-class LoadJsonCredentialsTest(unittest.TestCase): |
- # Everything's good, should not raise any exceptions. |
- def test_valid_credentials(self): |
- creds = httplib2_utils.load_service_account_credentials( |
- 'valid_creds.json', |
- service_accounts_creds_root=DATA_DIR) |
- self.assertIsInstance(creds, dict) |
- self.assertIn('type', creds) |
- self.assertIn('client_email', creds) |
- self.assertIn('private_key', creds) |
- |
- # File exists but issue with the content: raises AuthError. |
- def test_missing_type(self): |
- with self.assertRaises(infra_libs.AuthError): |
- httplib2_utils.load_service_account_credentials( |
- 'creds_missing_type.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- def test_wrong_type(self): |
- with self.assertRaises(infra_libs.AuthError): |
- httplib2_utils.load_service_account_credentials( |
- 'creds_wrong_type.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- def test_missing_client_email(self): |
- with self.assertRaises(infra_libs.AuthError): |
- httplib2_utils.load_service_account_credentials( |
- 'creds_missing_client_email.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- def test_missing_private_key(self): |
- with self.assertRaises(infra_libs.AuthError): |
- httplib2_utils.load_service_account_credentials( |
- 'creds_missing_private_key.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- def test_malformed(self): |
- with self.assertRaises(infra_libs.AuthError): |
- httplib2_utils.load_service_account_credentials( |
- 'creds_malformed.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- # Problem with the file itself |
- def test_file_not_found(self): |
- with self.assertRaises(IOError): |
- httplib2_utils.load_service_account_credentials( |
- 'this_file_should_not_exist.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- |
-class GetSignedJwtAssertionCredentialsTest(unittest.TestCase): |
- def test_valid_credentials(self): |
- creds = infra_libs.get_signed_jwt_assertion_credentials( |
- 'valid_creds.json', |
- service_accounts_creds_root=DATA_DIR) |
- self.assertIsInstance(creds, |
- oauth2client.client.SignedJwtAssertionCredentials) |
- # A default scope must be provided, we don't care which one |
- self.assertTrue(creds.scope) |
- |
- def test_valid_credentials_with_scope_as_string(self): |
- creds = infra_libs.get_signed_jwt_assertion_credentials( |
- 'valid_creds.json', |
- scope='repo', |
- service_accounts_creds_root=DATA_DIR) |
- self.assertIsInstance(creds, |
- oauth2client.client.SignedJwtAssertionCredentials) |
- self.assertIn('repo', creds.scope) |
- |
- def test_valid_credentials_with_scope_as_list(self): |
- creds = infra_libs.get_signed_jwt_assertion_credentials( |
- 'valid_creds.json', |
- scope=['gist'], |
- service_accounts_creds_root=DATA_DIR) |
- self.assertIsInstance(creds, |
- oauth2client.client.SignedJwtAssertionCredentials) |
- self.assertIn('gist', creds.scope) |
- |
- # Only test one malformed case and rely on LoadJsonCredentialsTest |
- # for the other cases. |
- def test_malformed_credentials(self): |
- with self.assertRaises(infra_libs.AuthError): |
- infra_libs.get_signed_jwt_assertion_credentials( |
- 'creds_malformed.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
- |
-class GetAuthenticatedHttp(unittest.TestCase): |
- def test_valid_credentials(self): |
- http = infra_libs.get_authenticated_http( |
- 'valid_creds.json', |
- service_accounts_creds_root=DATA_DIR) |
- self.assertIsInstance(http, httplib2.Http) |
- |
- def test_valid_credentials_authenticated(self): |
- http = infra_libs.get_authenticated_http( |
- 'valid_creds.json', |
- service_accounts_creds_root=DATA_DIR, |
- http_identifier='test_case') |
- self.assertIsInstance(http, infra_libs.InstrumentedHttp) |
- |
- # Only test one malformed case and rely on LoadJsonCredentialsTest |
- # for the other cases. |
- def test_malformed_credentials(self): |
- with self.assertRaises(infra_libs.AuthError): |
- infra_libs.get_authenticated_http( |
- 'creds_malformed.json', |
- service_accounts_creds_root=DATA_DIR) |
- |
-class RetriableHttplib2Test(unittest.TestCase): |
- def setUp(self): |
- super(RetriableHttplib2Test, self).setUp() |
- self.http = infra_libs.RetriableHttp(httplib2.Http()) |
- self.http._http.request = mock.create_autospec(self.http._http.request, |
- spec_set=True) |
- |
- _MOCK_REQUEST = mock.call('http://foo/', 'GET', None) |
- |
- def test_authorize(self): |
- http = infra_libs.RetriableHttp(httplib2.Http()) |
- creds = infra_libs.get_signed_jwt_assertion_credentials( |
- 'valid_creds.json', |
- service_accounts_creds_root=DATA_DIR) |
- creds.authorize(http) |
- |
- def test_delegate_get_attr(self): |
- """RetriableHttp should delegate getting attribute except request() to |
- Http""" |
- self.http._http.clear_credentials = mock.create_autospec( |
- self.http._http.clear_credentials, spec_set=True) |
- self.http.clear_credentials() |
- self.http._http.clear_credentials.assert_called_once_with() |
- |
- def test_delegate_set_attr(self): |
- """RetriableHttp should delegate setting attributes to Http""" |
- self.http.ignore_etag = False |
- self.assertFalse(self.http.ignore_etag) |
- self.assertFalse(self.http._http.ignore_etag) |
- self.http.ignore_etag = True |
- self.assertTrue(self.http.ignore_etag) |
- self.assertTrue(self.http._http.ignore_etag) |
- |
- @mock.patch('time.sleep', autospec=True) |
- def test_succeed(self, _sleep): |
- self.http._http.request.return_value = ( |
- httplib2.Response({'status': 400}), 'content') |
- response, _ = self.http.request('http://foo/') |
- self.assertEqual(400, response.status) |
- self.http._http.request.assert_has_calls([ self._MOCK_REQUEST ]) |
- |
- @mock.patch('time.sleep', autospec=True) |
- def test_retry_succeed(self, _sleep): |
- self.http._http.request.side_effect = iter([ |
- (httplib2.Response({'status': 500}), 'content'), |
- httplib2.HttpLib2Error, |
- (httplib2.Response({'status': 200}), 'content') |
- ]) |
- response, _ = self.http.request('http://foo/') |
- self.assertEqual(200, response.status) |
- self.http._http.request.assert_has_calls([ self._MOCK_REQUEST ] * 3) |
- |
- @mock.patch('time.sleep', autospec=True) |
- def test_fail_exception(self, _sleep): |
- self.http._http.request.side_effect = httplib2.HttpLib2Error() |
- self.assertRaises(httplib2.HttpLib2Error, self.http.request, 'http://foo/') |
- self.http._http.request.assert_has_calls([ self._MOCK_REQUEST ] * 5) |
- |
- @mock.patch('time.sleep', autospec=True) |
- def test_fail_status_code(self, _sleep): |
- self.http._http.request.return_value = ( |
- httplib2.Response({'status': 500}), 'content') |
- response, _ = self.http.request('http://foo/') |
- self.assertEqual(500, response.status) |
- self.http._http.request.assert_has_calls([ self._MOCK_REQUEST ] * 5) |
- |
- |
-class InstrumentedHttplib2Test(unittest.TestCase): |
- def setUp(self): |
- super(InstrumentedHttplib2Test, self).setUp() |
- self.mock_time = mock.create_autospec(time.time, spec_set=True) |
- self.mock_time.return_value = 42 |
- self.http = infra_libs.InstrumentedHttp('test', time_fn=self.mock_time) |
- self.http._request = mock.Mock() |
- ts_mon.reset_for_unittest() |
- |
- def test_success_status(self): |
- self.http._request.return_value = ( |
- httplib2.Response({'status': 200}), |
- 'content') |
- |
- response, _ = self.http.request('http://foo/') |
- self.assertEqual(200, response.status) |
- self.assertEqual(1, http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 200})) |
- self.assertIsNone(http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 404})) |
- |
- def test_error_status(self): |
- self.http._request.return_value = ( |
- httplib2.Response({'status': 404}), |
- 'content') |
- |
- response, _ = self.http.request('http://foo/') |
- self.assertEqual(404, response.status) |
- self.assertIsNone(http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 200})) |
- self.assertEqual(1, http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 404})) |
- |
- def test_timeout(self): |
- self.http._request.side_effect = socket.timeout |
- |
- with self.assertRaises(socket.timeout): |
- self.http.request('http://foo/') |
- self.assertIsNone(http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 200})) |
- self.assertEqual(1, http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', |
- 'status': http_metrics.STATUS_TIMEOUT})) |
- |
- def test_connection_error(self): |
- self.http._request.side_effect = socket.error |
- |
- with self.assertRaises(socket.error): |
- self.http.request('http://foo/') |
- self.assertIsNone(http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 200})) |
- self.assertEqual(1, http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', |
- 'status': http_metrics.STATUS_ERROR})) |
- |
- def test_exception(self): |
- self.http._request.side_effect = httplib2.HttpLib2Error |
- |
- with self.assertRaises(httplib2.HttpLib2Error): |
- self.http.request('http://foo/') |
- self.assertIsNone(http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', 'status': 200})) |
- self.assertEqual(1, http_metrics.response_status.get( |
- {'name': 'test', 'client': 'httplib2', |
- 'status': http_metrics.STATUS_EXCEPTION})) |
- |
- def test_response_bytes(self): |
- self.http._request.return_value = ( |
- httplib2.Response({'status': 200}), |
- 'content') |
- |
- _, content = self.http.request('http://foo/') |
- self.assertEqual('content', content) |
- self.assertEqual(1, http_metrics.response_bytes.get( |
- {'name': 'test', 'client': 'httplib2'}).count) |
- self.assertEqual(7, http_metrics.response_bytes.get( |
- {'name': 'test', 'client': 'httplib2'}).sum) |
- |
- def test_request_bytes(self): |
- self.http._request.return_value = ( |
- httplib2.Response({'status': 200}), |
- 'content') |
- |
- _, content = self.http.request('http://foo/', body='wibblewibble') |
- self.assertEqual('content', content) |
- self.assertEqual(1, http_metrics.request_bytes.get( |
- {'name': 'test', 'client': 'httplib2'}).count) |
- self.assertEqual(12, http_metrics.request_bytes.get( |
- {'name': 'test', 'client': 'httplib2'}).sum) |
- |
- def test_duration(self): |
- current_time = [4.2] |
- |
- def time_side_effect(): |
- ret = current_time[0] |
- current_time[0] += 0.3 |
- return ret |
- self.mock_time.side_effect = time_side_effect |
- |
- self.http._request.return_value = ( |
- httplib2.Response({'status': 200}), |
- 'content') |
- |
- _, _ = self.http.request('http://foo/') |
- self.assertEqual(1, http_metrics.durations.get( |
- {'name': 'test', 'client': 'httplib2'}).count) |
- self.assertAlmostEqual(300, http_metrics.durations.get( |
- {'name': 'test', 'client': 'httplib2'}).sum) |
- |
- |
-class HttpMockTest(unittest.TestCase): |
- def test_empty(self): |
- http = infra_libs.HttpMock([]) |
- with self.assertRaises(AssertionError): |
- http.request('https://www.google.com', 'GET') |
- |
- def test_invalid_parameter(self): |
- with self.assertRaises(TypeError): |
- infra_libs.HttpMock(None) |
- |
- def test_uris_wrong_length(self): |
- with self.assertRaises(ValueError): |
- infra_libs.HttpMock([(1, 2)]) |
- |
- def test_uris_wrong_type(self): |
- with self.assertRaises(ValueError): |
- infra_libs.HttpMock([(None,)]) |
- |
- def test_invalid_uri(self): |
- with self.assertRaises(TypeError): |
- infra_libs.HttpMock([(1, {'status': '100'}, None)]) |
- |
- def test_invalid_headers(self): |
- with self.assertRaises(TypeError): |
- infra_libs.HttpMock([('https://www.google.com', None, None)]) |
- |
- def test_headers_without_status(self): |
- with self.assertRaises(ValueError): |
- infra_libs.HttpMock([('https://www.google.com', {'foo': 'bar'}, None)]) |
- |
- def test_invalid_body(self): |
- with self.assertRaises(TypeError): |
- infra_libs.HttpMock([('https://www.google.com', {'status': '200'}, 42)]) |
- |
- def test_one_uri(self): |
- http = infra_libs.HttpMock([('https://www.google.com', |
- {'status': '403'}, |
- 'bar')]) |
- response, body = http.request('https://www.google.com', 'GET') |
- self.assertIsInstance(response, httplib2.Response) |
- self.assertEqual(response.status, 403) |
- self.assertEqual(body, 'bar') |
- |
- def test_two_uris(self): |
- http = infra_libs.HttpMock([('https://www.google.com', |
- {'status': 200}, 'foo'), |
- ('.*', {'status': 404}, '')]) |
- response, body = http.request('https://mywebserver.woo.hoo', 'GET') |
- self.assertIsInstance(response, httplib2.Response) |
- self.assertEqual(response.status, 404) |
- self.assertEqual(body, '') |
- |
- self.assertEqual(http.requests_made[0].uri, 'https://mywebserver.woo.hoo') |
- self.assertEqual(http.requests_made[0].method, 'GET') |
- self.assertEqual(http.requests_made[0].body, None) |
- self.assertEqual(http.requests_made[0].headers, None) |