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