18d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#!/usr/bin/env python 28d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 38d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Copyright 2011 Google Inc. 48d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 58d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Licensed under the Apache License, Version 2.0 (the "License"); 68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# you may not use this file except in compliance with the License. 78d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# You may obtain a copy of the License at 88d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 98d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# http://www.apache.org/licenses/LICENSE-2.0 108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Unless required by applicable law or agreed to in writing, software 128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# distributed under the License is distributed on an "AS IS" BASIS, 138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# See the License for the specific language governing permissions and 158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# limitations under the License. 168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi"""WSGI utility library tests.""" 198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport six 208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom six.moves import filter 218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi__author__ = 'rafe@google.com (Rafe Kaplan)' 238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport six.moves.http_client 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport unittest 278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom protorpc import test_util 298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom protorpc import util 308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom protorpc import webapp_test_util 318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom protorpc.wsgi import util as wsgi_util 328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi KandoiAPP1 = wsgi_util.static_page('App1') 348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi KandoiAPP2 = wsgi_util.static_page('App2') 358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi KandoiNOT_FOUND = wsgi_util.error(six.moves.http_client.NOT_FOUND) 368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass WsgiTestBase(webapp_test_util.WebServerTestBase): 398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi server_thread = None 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def CreateWsgiApplication(self): 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return None 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def DoHttpRequest(self, 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi path='/', 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content=None, 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content_type='text/plain; charset=utf-8', 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers=None): 508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi connection = six.moves.http_client.HTTPConnection('localhost', self.port) 518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if content is None: 528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi method = 'GET' 538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi else: 548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi method = 'POST' 558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers = {'content=type': content_type} 568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers.update(headers) 578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi connection.request(method, path, content, headers) 588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi response = connection.getresponse() 598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi not_date_or_server = lambda header: header[0] not in ('date', 'server') 618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers = list(filter(not_date_or_server, response.getheaders())) 628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return response.status, response.reason, response.read(), dict(headers) 648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass StaticPageBase(WsgiTestBase): 678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testDefault(self): 698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page() 708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasContent(self): 818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page('my content') 828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('my content', content) 878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': str(len('my content')), 888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasContentType(self): 938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(content_type='text/plain') 948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/plain', 1018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasStatus(self): 1058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(status='400 Not Good Request') 1068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(400, status) 1098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('Not Good Request', reason) 1108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasStatusInt(self): 1178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(status=401) 1188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(401, status) 1218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('Unauthorized', reason) 1228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasStatusUnknown(self): 1298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(status=909) 1308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(909, status) 1338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('Unknown Error', reason) 1348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasStatusTuple(self): 1418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(status=(500, 'Bad Thing')) 1428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(500, status) 1458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('Bad Thing', reason) 1468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasHeaders(self): 1538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(headers=[('x', 'foo'), 1548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi ('a', 'bar'), 1558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi ('z', 'bin')]) 1568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 1598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 1608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'x': 'foo', 1648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'a': 'bar', 1658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'z': 'bin', 1668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHeadersUnicodeSafe(self): 1708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(headers=[('x', u'foo')]) 1718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 1748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 1758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'x': 'foo', 1798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertTrue(isinstance(headers['x'], str)) 1828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testHasHeadersDict(self): 1848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi default_page = wsgi_util.static_page(headers={'x': 'foo', 1858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'a': 'bar', 1868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'z': 'bin'}) 1878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(default_page) 1888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, reason, content, headers = self.DoHttpRequest() 1898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(200, status) 1908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('OK', reason) 1918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('', content) 1928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '0', 1938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 1948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'x': 'foo', 1958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'a': 'bar', 1968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'z': 'bin', 1978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 1988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 1998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass FirstFoundTest(WsgiTestBase): 2028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testEmptyConfiguration(self): 2048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found([])) 2058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.NOT_FOUND, status) 2078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.NOT_FOUND], status_text) 2088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(util.pad_string(six.moves.http_client.responses[six.moves.http_client.NOT_FOUND]), 2098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content) 2108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '512', 2118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/plain; charset=utf-8', 2128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testOneApp(self): 2168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found([APP1])) 2178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.OK, status) 2208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.OK], status_text) 2218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('App1', content) 2228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '4', 2238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 2248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testIterator(self): 2288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found(iter([APP1]))) 2298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.OK, status) 2328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.OK], status_text) 2338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('App1', content) 2348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '4', 2358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 2368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Do request again to make sure iterator was properly copied. 2408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.OK, status) 2428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.OK], status_text) 2438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('App1', content) 2448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '4', 2458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 2468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testTwoApps(self): 2508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found([APP1, APP2])) 2518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.OK, status) 2548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.OK], status_text) 2558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('App1', content) 2568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '4', 2578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 2588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testFirstNotFound(self): 2628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found([NOT_FOUND, APP2])) 2638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.OK, status) 2668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(six.moves.http_client.responses[six.moves.http_client.OK], status_text) 2678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('App2', content) 2688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals({'content-length': '4', 2698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'content-type': 'text/html; charset=utf-8', 2708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }, 2718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers) 2728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testOnlyNotFound(self): 2748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def current_error(environ, start_response): 2758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi """The variable current_status is defined in loop after ResetServer.""" 2768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi headers = [('content-type', 'text/plain')] 2778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status_line = '%03d Whatever' % current_status 2788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi start_response(status_line, headers) 2798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return [] 2808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.ResetServer(wsgi_util.first_found([current_error, APP2])) 2828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi statuses_to_check = sorted(httplib.responses.keys()) 2848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # 100, 204 and 304 have slightly different expectations, so they are left 2858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # out of this test in order to keep the code simple. 2868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for dont_check in (100, 200, 204, 304, 404): 2878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi statuses_to_check.remove(dont_check) 2888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for current_status in statuses_to_check: 2898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi status, status_text, content, headers = self.DoHttpRequest('/') 2908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(current_status, status) 2918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals('Whatever', status_text) 2928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiif __name__ == '__main__': 2958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi unittest.main() 296