Index: tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/testing/mock.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/testing/mock.py b/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/testing/mock.py |
deleted file mode 100644 |
index 75a8b0791381d5bbea14c7d5295cee9416a1d33a..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/testing/mock.py |
+++ /dev/null |
@@ -1,329 +0,0 @@ |
-"""The mock module allows easy mocking of apitools clients. |
- |
-This module allows you to mock out the constructor of a particular apitools |
-client, for a specific API and version. Then, when the client is created, it |
-will be run against an expected session that you define. This way code that is |
-not aware of the testing framework can construct new clients as normal, as long |
-as it's all done within the context of a mock. |
-""" |
- |
-import difflib |
- |
-from protorpc import messages |
-import six |
- |
-import apitools.base.py as apitools_base |
- |
- |
-class Error(Exception): |
- |
- """Exceptions for this module.""" |
- |
- |
-def _MessagesEqual(msg1, msg2): |
- """Compare two protorpc messages for equality. |
- |
- Using python's == operator does not work in all cases, specifically when |
- there is a list involved. |
- |
- Args: |
- msg1: protorpc.messages.Message or [protorpc.messages.Message] or number |
- or string, One of the messages to compare. |
- msg2: protorpc.messages.Message or [protorpc.messages.Message] or number |
- or string, One of the messages to compare. |
- |
- Returns: |
- If the messages are isomorphic. |
- """ |
- if isinstance(msg1, list) and isinstance(msg2, list): |
- if len(msg1) != len(msg2): |
- return False |
- return all(_MessagesEqual(x, y) for x, y in zip(msg1, msg2)) |
- |
- if (not isinstance(msg1, messages.Message) or |
- not isinstance(msg2, messages.Message)): |
- return msg1 == msg2 |
- for field in msg1.all_fields(): |
- field1 = getattr(msg1, field.name) |
- field2 = getattr(msg2, field.name) |
- if not _MessagesEqual(field1, field2): |
- return False |
- return True |
- |
- |
-class UnexpectedRequestException(Error): |
- |
- def __init__(self, received_call, expected_call): |
- expected_key, expected_request = expected_call |
- received_key, received_request = received_call |
- |
- expected_repr = apitools_base.MessageToRepr( |
- expected_request, multiline=True) |
- received_repr = apitools_base.MessageToRepr( |
- received_request, multiline=True) |
- |
- expected_lines = expected_repr.splitlines() |
- received_lines = received_repr.splitlines() |
- |
- diff_lines = difflib.unified_diff(expected_lines, received_lines) |
- diff = '\n'.join(diff_lines) |
- |
- if expected_key != received_key: |
- msg = '\n'.join(( |
- 'expected: {expected_key}({expected_request})', |
- 'received: {received_key}({received_request})', |
- '', |
- )).format( |
- expected_key=expected_key, |
- expected_request=expected_repr, |
- received_key=received_key, |
- received_request=received_repr) |
- super(UnexpectedRequestException, self).__init__(msg) |
- else: |
- msg = '\n'.join(( |
- 'for request to {key},', |
- 'expected: {expected_request}', |
- 'received: {received_request}', |
- 'diff: {diff}', |
- '', |
- )).format( |
- key=expected_key, |
- expected_request=expected_repr, |
- received_request=received_repr, |
- diff=diff) |
- super(UnexpectedRequestException, self).__init__(msg) |
- |
- |
-class ExpectedRequestsException(Error): |
- |
- def __init__(self, expected_calls): |
- msg = 'expected:\n' |
- for (key, request) in expected_calls: |
- msg += '{key}({request})\n'.format( |
- key=key, |
- request=apitools_base.MessageToRepr(request, multiline=True)) |
- super(ExpectedRequestsException, self).__init__(msg) |
- |
- |
-class _ExpectedRequestResponse(object): |
- |
- """Encapsulation of an expected request and corresponding response.""" |
- |
- def __init__(self, key, request, response=None, exception=None): |
- self.__key = key |
- self.__request = request |
- |
- if response and exception: |
- raise apitools_base.ConfigurationValueError( |
- 'Should specify at most one of response and exception') |
- if response and isinstance(response, apitools_base.Error): |
- raise apitools_base.ConfigurationValueError( |
- 'Responses should not be an instance of Error') |
- if exception and not isinstance(exception, apitools_base.Error): |
- raise apitools_base.ConfigurationValueError( |
- 'Exceptions must be instances of Error') |
- |
- self.__response = response |
- self.__exception = exception |
- |
- @property |
- def key(self): |
- return self.__key |
- |
- @property |
- def request(self): |
- return self.__request |
- |
- def ValidateAndRespond(self, key, request): |
- """Validate that key and request match expectations, and respond if so. |
- |
- Args: |
- key: str, Actual key to compare against expectations. |
- request: protorpc.messages.Message or [protorpc.messages.Message] |
- or number or string, Actual request to compare againt expectations |
- |
- Raises: |
- UnexpectedRequestException: If key or request dont match |
- expectations. |
- apitools_base.Error: If a non-None exception is specified to |
- be thrown. |
- |
- Returns: |
- The response that was specified to be returned. |
- |
- """ |
- if key != self.__key or not _MessagesEqual(request, self.__request): |
- raise UnexpectedRequestException((key, request), |
- (self.__key, self.__request)) |
- |
- if self.__exception: |
- # Can only throw apitools_base.Error. |
- raise self.__exception # pylint: disable=raising-bad-type |
- |
- return self.__response |
- |
- |
-class _MockedService(apitools_base.BaseApiService): |
- |
- def __init__(self, key, mocked_client, methods, real_service): |
- super(_MockedService, self).__init__(mocked_client) |
- self.__dict__.update(real_service.__dict__) |
- for method in methods: |
- real_method = None |
- if real_service: |
- real_method = getattr(real_service, method) |
- setattr(self, method, |
- _MockedMethod(key + '.' + method, |
- mocked_client, |
- real_method)) |
- |
- |
-class _MockedMethod(object): |
- |
- """A mocked API service method.""" |
- |
- def __init__(self, key, mocked_client, real_method): |
- self.__key = key |
- self.__mocked_client = mocked_client |
- self.__real_method = real_method |
- |
- def Expect(self, request, response=None, exception=None, **unused_kwargs): |
- """Add an expectation on the mocked method. |
- |
- Exactly one of response and exception should be specified. |
- |
- Args: |
- request: The request that should be expected |
- response: The response that should be returned or None if |
- exception is provided. |
- exception: An exception that should be thrown, or None. |
- |
- """ |
- # TODO(jasmuth): the unused_kwargs provides a placeholder for |
- # future things that can be passed to Expect(), like special |
- # params to the method call. |
- |
- # pylint: disable=protected-access |
- # Class in same module. |
- self.__mocked_client._request_responses.append( |
- _ExpectedRequestResponse(self.__key, |
- request, |
- response=response, |
- exception=exception)) |
- # pylint: enable=protected-access |
- |
- def __call__(self, request, **unused_kwargs): |
- # TODO(jasmuth): allow the testing code to expect certain |
- # values in these currently unused_kwargs, especially the |
- # upload parameter used by media-heavy services like bigquery |
- # or bigstore. |
- |
- # pylint: disable=protected-access |
- # Class in same module. |
- if self.__mocked_client._request_responses: |
- request_response = self.__mocked_client._request_responses.pop(0) |
- else: |
- raise UnexpectedRequestException( |
- (self.__key, request), (None, None)) |
- # pylint: enable=protected-access |
- |
- response = request_response.ValidateAndRespond(self.__key, request) |
- |
- if response is None and self.__real_method: |
- response = self.__real_method(request) |
- print(apitools_base.MessageToRepr( |
- response, multiline=True, shortstrings=True)) |
- return response |
- |
- return response |
- |
- |
-def _MakeMockedServiceConstructor(mocked_service): |
- def Constructor(unused_self, unused_client): |
- return mocked_service |
- return Constructor |
- |
- |
-class Client(object): |
- |
- """Mock an apitools client.""" |
- |
- def __init__(self, client_class, real_client=None): |
- """Mock an apitools API, given its class. |
- |
- Args: |
- client_class: The class for the API. eg, if you |
- from apis.sqladmin import v1beta3 |
- then you can pass v1beta3.SqladminV1beta3 to this class |
- and anything within its context will use your mocked |
- version. |
- real_client: apitools Client, The client to make requests |
- against when the expected response is None. |
- |
- """ |
- |
- if not real_client: |
- real_client = client_class(get_credentials=False) |
- |
- self.__client_class = client_class |
- self.__real_service_classes = {} |
- self.__real_client = real_client |
- |
- self._request_responses = [] |
- |
- def __enter__(self): |
- return self.Mock() |
- |
- def Mock(self): |
- """Stub out the client class with mocked services.""" |
- client = self.__real_client or self.__client_class( |
- get_credentials=False) |
- for name in dir(self.__client_class): |
- service_class = getattr(self.__client_class, name) |
- if not isinstance(service_class, type): |
- continue |
- if not issubclass(service_class, apitools_base.BaseApiService): |
- continue |
- self.__real_service_classes[name] = service_class |
- service = service_class(client) |
- # pylint: disable=protected-access |
- # Some liberty is allowed with mocking. |
- collection_name = service_class._NAME |
- # pylint: enable=protected-access |
- api_name = '%s_%s' % (self.__client_class._PACKAGE, |
- self.__client_class._URL_VERSION) |
- mocked_service = _MockedService( |
- api_name + '.' + collection_name, self, |
- service._method_configs.keys(), |
- service if self.__real_client else None) |
- mocked_constructor = _MakeMockedServiceConstructor(mocked_service) |
- setattr(self.__client_class, name, mocked_constructor) |
- |
- setattr(self, collection_name, mocked_service) |
- |
- self.__real_include_fields = self.__client_class.IncludeFields |
- self.__client_class.IncludeFields = self.IncludeFields |
- |
- return self |
- |
- def __exit__(self, exc_type, value, traceback): |
- self.Unmock() |
- if value: |
- six.reraise(exc_type, value, traceback) |
- return True |
- |
- def Unmock(self): |
- for name, service_class in self.__real_service_classes.items(): |
- setattr(self.__client_class, name, service_class) |
- |
- if self._request_responses: |
- raise ExpectedRequestsException( |
- [(rq_rs.key, rq_rs.request) for rq_rs |
- in self._request_responses]) |
- |
- self.__client_class.IncludeFields = self.__real_include_fields |
- |
- def IncludeFields(self, include_fields): |
- if self.__real_client: |
- return self.__real_include_fields(self.__real_client, |
- include_fields) |