Index: tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/webapp_test_util.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/webapp_test_util.py b/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/webapp_test_util.py |
deleted file mode 100644 |
index 2431855e5e54565685364a0294d71a4ab11948f4..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/webapp_test_util.py |
+++ /dev/null |
@@ -1,398 +0,0 @@ |
-#!/usr/bin/env python |
-# |
-# Copyright 2010 Google Inc. |
-# |
-# Licensed under the Apache License, Version 2.0 (the "License"); |
-# you may not use this file except in compliance with the License. |
-# You may obtain a copy of the License at |
-# |
-# http://www.apache.org/licenses/LICENSE-2.0 |
-# |
-# Unless required by applicable law or agreed to in writing, software |
-# distributed under the License is distributed on an "AS IS" BASIS, |
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-# See the License for the specific language governing permissions and |
-# limitations under the License. |
-# |
- |
-"""Testing utilities for the webapp libraries. |
- |
- GetDefaultEnvironment: Method for easily setting up CGI environment. |
- RequestHandlerTestBase: Base class for setting up handler tests. |
-""" |
- |
-__author__ = 'rafek@google.com (Rafe Kaplan)' |
- |
-import cStringIO |
-import threading |
-import urllib2 |
-from wsgiref import simple_server |
-from wsgiref import validate |
- |
-from . import protojson |
-from . import remote |
-from . import test_util |
-from . import transport |
-from .webapp import service_handlers |
-from .webapp.google_imports import webapp |
- |
- |
-class TestService(remote.Service): |
- """Service used to do end to end tests with.""" |
- |
- @remote.method(test_util.OptionalMessage, |
- test_util.OptionalMessage) |
- def optional_message(self, request): |
- if request.string_value: |
- request.string_value = '+%s' % request.string_value |
- return request |
- |
- |
-def GetDefaultEnvironment(): |
- """Function for creating a default CGI environment.""" |
- return { |
- 'LC_NUMERIC': 'C', |
- 'wsgi.multiprocess': True, |
- 'SERVER_PROTOCOL': 'HTTP/1.0', |
- 'SERVER_SOFTWARE': 'Dev AppServer 0.1', |
- 'SCRIPT_NAME': '', |
- 'LOGNAME': 'nickjohnson', |
- 'USER': 'nickjohnson', |
- 'QUERY_STRING': 'foo=bar&foo=baz&foo2=123', |
- 'PATH': '/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11', |
- 'LANG': 'en_US', |
- 'LANGUAGE': 'en', |
- 'REMOTE_ADDR': '127.0.0.1', |
- 'LC_MONETARY': 'C', |
- 'CONTENT_TYPE': 'application/x-www-form-urlencoded', |
- 'wsgi.url_scheme': 'http', |
- 'SERVER_PORT': '8080', |
- 'HOME': '/home/mruser', |
- 'USERNAME': 'mruser', |
- 'CONTENT_LENGTH': '', |
- 'USER_IS_ADMIN': '1', |
- 'PYTHONPATH': '/tmp/setup', |
- 'LC_TIME': 'C', |
- 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; ' |
- 'rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6', |
- 'wsgi.multithread': False, |
- 'wsgi.version': (1, 0), |
- 'USER_EMAIL': 'test@example.com', |
- 'USER_EMAIL': '112', |
- 'wsgi.input': cStringIO.StringIO(), |
- 'PATH_TRANSLATED': '/tmp/request.py', |
- 'SERVER_NAME': 'localhost', |
- 'GATEWAY_INTERFACE': 'CGI/1.1', |
- 'wsgi.run_once': True, |
- 'LC_COLLATE': 'C', |
- 'HOSTNAME': 'myhost', |
- 'wsgi.errors': cStringIO.StringIO(), |
- 'PWD': '/tmp', |
- 'REQUEST_METHOD': 'GET', |
- 'MAIL': '/dev/null', |
- 'MAILCHECK': '0', |
- 'USER_NICKNAME': 'test', |
- 'HTTP_COOKIE': 'dev_appserver_login="test:test@example.com:True"', |
- 'PATH_INFO': '/tmp/myhandler' |
- } |
- |
- |
-class RequestHandlerTestBase(test_util.TestCase): |
- """Base class for writing RequestHandler tests. |
- |
- To test a specific request handler override CreateRequestHandler. |
- To change the environment for that handler override GetEnvironment. |
- """ |
- |
- def setUp(self): |
- """Set up test for request handler.""" |
- self.ResetHandler() |
- |
- def GetEnvironment(self): |
- """Get environment. |
- |
- Override for more specific configurations. |
- |
- Returns: |
- dict of CGI environment. |
- """ |
- return GetDefaultEnvironment() |
- |
- def CreateRequestHandler(self): |
- """Create RequestHandler instances. |
- |
- Override to create more specific kinds of RequestHandler instances. |
- |
- Returns: |
- RequestHandler instance used in test. |
- """ |
- return webapp.RequestHandler() |
- |
- def CheckResponse(self, |
- expected_status, |
- expected_headers, |
- expected_content): |
- """Check that the web response is as expected. |
- |
- Args: |
- expected_status: Expected status message. |
- expected_headers: Dictionary of expected headers. Will ignore unexpected |
- headers and only check the value of those expected. |
- expected_content: Expected body. |
- """ |
- def check_content(content): |
- self.assertEquals(expected_content, content) |
- |
- def start_response(status, headers): |
- self.assertEquals(expected_status, status) |
- |
- found_keys = set() |
- for name, value in headers: |
- name = name.lower() |
- try: |
- expected_value = expected_headers[name] |
- except KeyError: |
- pass |
- else: |
- found_keys.add(name) |
- self.assertEquals(expected_value, value) |
- |
- missing_headers = set(expected_headers.keys()) - found_keys |
- if missing_headers: |
- self.fail('Expected keys %r not found' % (list(missing_headers),)) |
- |
- return check_content |
- |
- self.handler.response.wsgi_write(start_response) |
- |
- def ResetHandler(self, change_environ=None): |
- """Reset this tests environment with environment changes. |
- |
- Resets the entire test with a new handler which includes some changes to |
- the default request environment. |
- |
- Args: |
- change_environ: Dictionary of values that are added to default |
- environment. |
- """ |
- environment = self.GetEnvironment() |
- environment.update(change_environ or {}) |
- |
- self.request = webapp.Request(environment) |
- self.response = webapp.Response() |
- self.handler = self.CreateRequestHandler() |
- self.handler.initialize(self.request, self.response) |
- |
- |
-class SyncedWSGIServer(simple_server.WSGIServer): |
- pass |
- |
- |
-class ServerThread(threading.Thread): |
- """Thread responsible for managing wsgi server. |
- |
- This server does not just attach to the socket and listen for requests. This |
- is because the server classes in Python 2.5 or less have no way to shut them |
- down. Instead, the thread must be notified of how many requests it will |
- receive so that it listens for each one individually. Tests should tell how |
- many requests to listen for using the handle_request method. |
- """ |
- |
- def __init__(self, server, *args, **kwargs): |
- """Constructor. |
- |
- Args: |
- server: The WSGI server that is served by this thread. |
- As per threading.Thread base class. |
- |
- State: |
- __serving: Server is still expected to be serving. When False server |
- knows to shut itself down. |
- """ |
- self.server = server |
- # This timeout is for the socket when a connection is made. |
- self.server.socket.settimeout(None) |
- # This timeout is for when waiting for a connection. The allows |
- # server.handle_request() to listen for a short time, then timeout, |
- # allowing the server to check for shutdown. |
- self.server.timeout = 0.05 |
- self.__serving = True |
- |
- super(ServerThread, self).__init__(*args, **kwargs) |
- |
- def shutdown(self): |
- """Notify server that it must shutdown gracefully.""" |
- self.__serving = False |
- |
- def run(self): |
- """Handle incoming requests until shutdown.""" |
- while self.__serving: |
- self.server.handle_request() |
- |
- self.server = None |
- |
- |
-class TestService(remote.Service): |
- """Service used to do end to end tests with.""" |
- |
- def __init__(self, message='uninitialized'): |
- self.__message = message |
- |
- @remote.method(test_util.OptionalMessage, test_util.OptionalMessage) |
- def optional_message(self, request): |
- if request.string_value: |
- request.string_value = '+%s' % request.string_value |
- return request |
- |
- @remote.method(response_type=test_util.OptionalMessage) |
- def init_parameter(self, request): |
- return test_util.OptionalMessage(string_value=self.__message) |
- |
- @remote.method(test_util.NestedMessage, test_util.NestedMessage) |
- def nested_message(self, request): |
- request.string_value = '+%s' % request.string_value |
- return request |
- |
- @remote.method() |
- def raise_application_error(self, request): |
- raise remote.ApplicationError('This is an application error', 'ERROR_NAME') |
- |
- @remote.method() |
- def raise_unexpected_error(self, request): |
- raise TypeError('Unexpected error') |
- |
- @remote.method() |
- def raise_rpc_error(self, request): |
- raise remote.NetworkError('Uncaught network error') |
- |
- @remote.method(response_type=test_util.NestedMessage) |
- def return_bad_message(self, request): |
- return test_util.NestedMessage() |
- |
- |
-class AlternateService(remote.Service): |
- """Service used to requesting non-existant methods.""" |
- |
- @remote.method() |
- def does_not_exist(self, request): |
- raise NotImplementedError('Not implemented') |
- |
- |
-class WebServerTestBase(test_util.TestCase): |
- |
- SERVICE_PATH = '/my/service' |
- |
- def setUp(self): |
- self.server = None |
- self.schema = 'http' |
- self.ResetServer() |
- |
- self.bad_path_connection = self.CreateTransport(self.service_url + '_x') |
- self.bad_path_stub = TestService.Stub(self.bad_path_connection) |
- super(WebServerTestBase, self).setUp() |
- |
- def tearDown(self): |
- self.server.shutdown() |
- super(WebServerTestBase, self).tearDown() |
- |
- def ResetServer(self, application=None): |
- """Reset web server. |
- |
- Shuts down existing server if necessary and starts a new one. |
- |
- Args: |
- application: Optional WSGI function. If none provided will use |
- tests CreateWsgiApplication method. |
- """ |
- if self.server: |
- self.server.shutdown() |
- |
- self.port = test_util.pick_unused_port() |
- self.server, self.application = self.StartWebServer(self.port, application) |
- |
- self.connection = self.CreateTransport(self.service_url) |
- |
- def CreateTransport(self, service_url, protocol=protojson): |
- """Create a new transportation object.""" |
- return transport.HttpTransport(service_url, protocol=protocol) |
- |
- def StartWebServer(self, port, application=None): |
- """Start web server. |
- |
- Args: |
- port: Port to start application on. |
- application: Optional WSGI function. If none provided will use |
- tests CreateWsgiApplication method. |
- |
- Returns: |
- A tuple (server, application): |
- server: An instance of ServerThread. |
- application: Application that web server responds with. |
- """ |
- if not application: |
- application = self.CreateWsgiApplication() |
- validated_application = validate.validator(application) |
- server = simple_server.make_server('localhost', port, validated_application) |
- server = ServerThread(server) |
- server.start() |
- return server, application |
- |
- def make_service_url(self, path): |
- """Make service URL using current schema and port.""" |
- return '%s://localhost:%d%s' % (self.schema, self.port, path) |
- |
- @property |
- def service_url(self): |
- return self.make_service_url(self.SERVICE_PATH) |
- |
- |
-class EndToEndTestBase(WebServerTestBase): |
- |
- # Sub-classes may override to create alternate configurations. |
- DEFAULT_MAPPING = service_handlers.service_mapping( |
- [('/my/service', TestService), |
- ('/my/other_service', TestService.new_factory('initialized')), |
- ]) |
- |
- def setUp(self): |
- super(EndToEndTestBase, self).setUp() |
- |
- self.stub = TestService.Stub(self.connection) |
- |
- self.other_connection = self.CreateTransport(self.other_service_url) |
- self.other_stub = TestService.Stub(self.other_connection) |
- |
- self.mismatched_stub = AlternateService.Stub(self.connection) |
- |
- @property |
- def other_service_url(self): |
- return 'http://localhost:%d/my/other_service' % self.port |
- |
- def CreateWsgiApplication(self): |
- """Create WSGI application used on the server side for testing.""" |
- return webapp.WSGIApplication(self.DEFAULT_MAPPING, True) |
- |
- def DoRawRequest(self, |
- method, |
- content='', |
- content_type='application/json', |
- headers=None): |
- headers = headers or {} |
- headers.update({'content-length': len(content or ''), |
- 'content-type': content_type, |
- }) |
- request = urllib2.Request('%s.%s' % (self.service_url, method), |
- content, |
- headers) |
- return urllib2.urlopen(request) |
- |
- def RawRequestError(self, |
- method, |
- content=None, |
- content_type='application/json', |
- headers=None): |
- try: |
- self.DoRawRequest(method, content, content_type, headers) |
- self.fail('Expected HTTP error') |
- except urllib2.HTTPError as err: |
- return err.code, err.read(), err.headers |