I get failing tests on WinXP-sp2, apache 2.0.54, python 2.4.2.
This may be because the test suite is looking for things not there yet.
Put the 3.2.8 binary distribution on my system and did a svn update to
get the latest test suite. When running the tests, I got the following
failures (can we do something about the readability of the output):
======================================================================
FAIL: test_req_auth_type (__main__.PerRequestTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 661, in test_req_auth_type
self.fail(`rsp`)
AssertionError: '\n<pre>\nMod_python error: "PythonAuthenHandler
tests::req_auth_type"\n\nTraceback (most recent call last):\n\n File
"C:\\Python24\\Lib\\site-
packages\\mod_python\\apache.py", line 299, in HandlerDispatch\n
result = object(req)\n\n File
"C:/source/mod_python/test/htdocs/tests.py", line 609, in req
_auth_type\n if req.auth_type() != "dummy":\n\nAttributeError:
\'mp_request\' object has no attribute \'auth_type\'\n\n</pre>\n'
======================================================================
FAIL: test_req_construct_url (__main__.PerRequestTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 753, in test_req_construct_url
self.fail("construct_url")
AssertionError: construct_url
======================================================================
FAIL: test_req_handler (__main__.PerRequestTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 1009, in test_req_handler
self.fail(`rsp`)
AssertionError: '\n<pre>\nMod_python error: "PythonFixupHandler
tests::req_handler"\n\nTraceback (most recent call last):\n\n File
"C:\\Python24\\Lib\\site-pac
kages\\mod_python\\apache.py", line 299, in HandlerDispatch\n result
= object(req)\n\n File "C:/source/mod_python/test/htdocs/tests.py",
line 770, in req_ha
ndler\n req.handler = "mod_python"\n\nTypeError: attribute
\'handler\' of \'mp_request\' objects is not writable\n\n</pre>\n'
======================================================================
FAIL: test_trans (__main__.PerRequestTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 1402, in test_trans
self.fail(`rsp`)
AssertionError: ' #\r\n # \r\n # Licensed under the Apache License,
Version 2.0 (the "License"); you\r\n # may not use this file except in
compliance with the L
icense. You\r\n # may obtain a copy of the License at\r\n #\r\n #
http://www.apache.org/licenses/LICENSE-2.0\r\n #\r\n # Unless required
by applicable law
or agreed to in writing, software\r\n # distributed under the License
is distributed on an "AS IS" BASIS,\r\n # WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, e
ither express or\r\n # implied. See the License for the specific
language governing\r\n # permissions and limitations under the
License.\r\n #\r\n #\r\n # $Id:
tests.py 379638 2006-02-22 00:41:51Z jgallacher $\r\n #\r\n\r\n#
mod_python tests\r\n\r\nfrom __future__ import generators\r\nfrom
mod_python.python22 import *
\r\n\r\nfrom mod_python import apache\r\nimport unittest\r\nimport
re\r\nimport time\r\nimport os\r\nimport cStringIO\r\n\r\n# This is used
for mod_python.publi
sher security tests\r\n_SECRET_PASSWORD = \'root\'\r\n__ANSWER =
42\r\n\r\nclass SimpleTestCase(unittest.TestCase):\r\n\r\n def
__init__(self, methodName, re
q):\r\n unittest.TestCase.__init__(self, methodName)\r\n
self.req = req\r\n\r\n def test_apache_log_error(self):\r\n\r\n
s = self.req.se
rver\r\n apache.log_error("Testing apache.log_error():",
apache.APLOG_INFO, s)\r\n apache.log_error("xEMERGx",
apache.APLOG_EMERG, s)\r\n a
pache.log_error("xALERTx", apache.APLOG_ALERT, s)\r\n
apache.log_error("xCRITx", apache.APLOG_CRIT, s)\r\n
apache.log_error("xERRx", apache.APLOG_
ERR, s)\r\n apache.log_error("xWARNINGx", apache.APLOG_WARNING,
s)\r\n apache.log_error("xNOTICEx", apache.APLOG_NOTICE, s)\r\n
apache.log_
error("xINFOx", apache.APLOG_INFO, s)\r\n
apache.log_error("xDEBUGx", apache.APLOG_DEBUG, s)\r\n\r\n # see
what\'s in the log now\r\n f = o
pen("%s/logs/error_log" % apache.server_root())\r\n # for some
reason re doesn\'t like \\n, why?\r\n import string\r\n
log = "".join(map(st
ring.strip, f.readlines()))\r\n f.close()\r\n\r\n if not
re.search("xEMERGx.*xALERTx.*xCRITx.*xERRx.*xWARNINGx.*xNOTICEx.*xINFOx.*xDEBUGx",
log):\
r\n self.fail("Could not find test messages in
error_log")\r\n \r\n\r\n def
test_apache_table(self):\r\n\r\n log = self.req.log_
error\r\n\r\n log("Testing table object.")\r\n\r\n # tests
borrowed from Python test suite for dict\r\n
_test_table()\r\n\r\n # inhe
ritance\r\n log(" inheritance")\r\n class
mytable(apache.table):\r\n def __str__(self):\r\n
return "str() from mytable"
\r\n mt = mytable({\'a\':\'b\'})\r\n\r\n # add()\r\n
log(" table.add()")\r\n a = apache.table({\'a\':\'b\'})\r\n
a.add(\'a\'
, \'c\')\r\n if a[\'a\'] != [\'b\', \'c\']:\r\n
self.fail(\'table.add() broken: a["a"] is %s\' % `a["a"]`)\r\n\r\n
log("Table test DONE
.")\r\n\r\n def test_req_add_common_vars(self):\r\n\r\n
self.req.log_error("Testing req.add_common_vars().")\r\n\r\n a =
len(self.req.subproces
s_env)\r\n self.req.add_common_vars()\r\n b =
len(self.req.subprocess_env)\r\n if a >= b: \r\n
self.fail("req.subprocess_env() i
s same size before and after")\r\n\r\n def
test_req_members(self):\r\n\r\n # just run through request
members making sure\r\n # they make sense
\r\n\r\n req = self.req\r\n log = req.log_error\r\n\r\n
log("Examining request memebers:")\r\n\r\n log("
req.connection: %s" % `r
eq.connection`)\r\n s = str(type(req.connection))\r\n if s
!= "<type \'mp_conn\'>":\r\n self.fail("strange
req.connection type %s" % `s
`)\r\n\r\n log(" req.server: \'%s\'" % `req.server`)\r\n
s = str(type(req.server))\r\n if s != "<type
\'mp_server\'>":\r\n se
lf.fail("strange req.server type %s" % `s`)\r\n\r\n for x in
((req.next, "next"),\r\n (req.prev, "prev"),\r\n
(req.main
, "main")):\r\n val, name = x\r\n log(" req.%s:
\'%s\'" % (name, `val`))\r\n if val:\r\n
self.fail("strange,
req.%s should be None, not %s" % (name, `val`))\r\n \r\n
log(" req.the_request: \'%s\'" % req.the_request)\r\n if not
re.match(r"GET /.*
HTTP/1\\.", req.the_request):\r\n self.fail("strange
req.the_request %s" % `req.the_request`)\r\n\r\n for x in
((req.assbackwards, "assbackwa
rds"),\r\n (req.proxyreq, "proxyreq"),\r\n
(req.header_only, "header_only")):\r\n val, name =
x\r\n log(
" req.%s: %s" % (name, `val`))\r\n if val:\r\n
self.fail("%s should be 0" % name)\r\n\r\n log("
req.protocol: %s" % `req.
protocol`)\r\n if not req.protocol ==
req.the_request.split()[-1]:\r\n self.fail("req.protocol
doesn\'t match req.the_request")\r\n\r\n
log(" req.proto_num: %s" % `req.proto_num`)\r\n if
req.proto_num != 1000 + int(req.protocol[-1]):\r\n
self.fail("req.proto_num doesn\'t ma
tch req.protocol")\r\n\r\n log(" req.hostname: %s" %
`req.hostname`)\r\n if req.hostname != "test_internal":\r\n
self.fail("req.host
name isn\'t \'test_internal\'")\r\n\r\n log("
req.request_time: %s" % `req.request_time`)\r\n if (time.time() -
req.request_time) > 10:\r\n
self.fail("req.request_time suggests request started more than
10 secs ago")\r\n\r\n log(" req.status_line: %s" %
`req.status_line`)\r\n
if req.status_line:\r\n self.fail("req.status_line should
be None at this point")\r\n\r\n log(" req.status: %s" %
`req.status`)\r\n
if req.status != 200:\r\n self.fail("req.status should be
200")\r\n req.status = req.status # make sure its
writable\r\n\r\n log("
req.method: %s" % `req.method`)\r\n if req.method != "GET":\r\n
self.fail("req.method should be \'GET\'")\r\n\r\n
log(" req.method_
number: %s" % `req.method_number`) \r\n if
req.method_number != 0:\r\n self.fail("req.method_number
should be 0")\r\n\r\n log("
req.allowed: %s" % `req.allowed`)\r\n if req.allowed !=
0:\r\n self.fail("req.allowed should be 0")\r\n
\r\n log(" req
.allowed_xmethods: %s" % `req.allowed_xmethods`)\r\n if
req.allowed_xmethods != ():\r\n
self.fail("req.allowed_xmethods should be an empty tup
le")\r\n \r\n log(" req.allowed_methods: %s" %
`req.allowed_methods`)\r\n if req.allowed_methods != ():\r\n
self.fail("re
q.allowed_methods should be an empty tuple")\r\n \r\n
log(" req.sent_bodyct: %s" % `req.sent_bodyct`)\r\n if
req.sent_bodyct != 0:\r
\n self.fail("req.sent_bodyct should be 0")\r\n
\r\n log(" req.bytes_sent: %s" % `req.bytes_sent`)\r\n
save = req.bytes_s
ent\r\n log(" writing 4 bytes...")\r\n
req.write("1234")\r\n log(" req.bytes_sent: %s" %
`req.bytes_sent`)\r\n if req.by
tes_sent - save != 4:\r\n self.fail("req.bytes_sent should
have incremented by 4, but didn\'t")\r\n\r\n log(" req.mtime:
%s" % `req.mtime`)
\r\n if req.mtime != 0:\r\n self.fail("req.mtime
should be 0")\r\n \r\n log(" req.chunked: %s" %
`req.chunked`)\r\n if
req.chunked != 1:\r\n self.fail("req.chunked should be
1")\r\n \r\n log(" req.range: %s" %
`req.range`)\r\n if req.range
:\r\n self.fail("req.range should be None")\r\n
\r\n log(" req.clength: %s" % `req.clength`)\r\n log("
calling req
.set_content_length(15)...")\r\n req.set_content_length(15)\r\n
log(" req.clength: %s" % `req.clength`)\r\n if
req.clength != 15:\r\
n self.fail("req.clength should be 15")\r\n \r\n
log(" req.remaining: %s" % `req.remaining`)\r\n if
req.remaining != 0:\r\n
self.fail("req.remaining should be 0")\r\n \r\n
log(" req.read_length: %s" % `req.read_length`)\r\n if
req.read_length !=
0:\r\n self.fail("req.read_length should be 0")\r\n
\r\n log(" req.read_body: %s" % `req.read_body`)\r\n if
req.read_body !=
0:\r\n self.fail("req.read_body should be 0")\r\n
\r\n log(" req.read_chunked: %s" % `req.read_chunked`)\r\n
if req.read_
chunked != 0:\r\n self.fail("req.read_chunked should be
0")\r\n \r\n log(" req.expecting_100: %s" %
`req.expecting_100`)\r\n
if req.expecting_100 != 0:\r\n
self.fail("req.expecting_100 should be 0")\r\n\r\n log("
req.headers_in: %s" % `req.headers_in`) \r\n
if req.headers_in["Host"][:13].lower() != "test_internal":\r\n
self.fail("The \'Host\' header should begin with
\'test_internal\'")\r\n\r\n
log(" req.headers_out: %s" % `req.headers_out`)\r\n if
((not req.headers_out.has_key("content-length")) or\r\n
req.headers_out["content-
length"] != "15"):\r\n
self.fail("req.headers_out[\'content-length\'] should be 15")\r\n
\r\n log(" req.subprocess_env: %s" % `r
eq.subprocess_env`)\r\n if
req.subprocess_env["SERVER_SOFTWARE"].find("Python") == -1:\r\n
self.fail("req.subprocess_env[\'SERVER_SOFTWARE\']
should contain \'Python\'")\r\n \r\n log("
req.notes: %s" % `req.notes`)\r\n log(" doing
req.notes[\'testing\'] = \'123\' ...
")\r\n req.notes[\'testing\'] = \'123\'\r\n log("
req.notes: %s" % `req.notes`)\r\n if req.notes["testing"] !=
\'123\':\r\n s
elf.fail("req.notes[\'testing\'] should be \'123\'")\r\n \r\n
log(" req.phase: %s" % `req.phase`)\r\n if req.phase !=
"PythonHandler":\r
\n self.fail("req.phase should be \'PythonHandler\'")\r\n
\r\n log(" req.interpreter: %s" %
`req.interpreter`)\r\n if req
.interpreter != req.server.server_hostname:\r\n
self.fail("req.interpreter should be same as req.server_hostname: %s" %
`req.server_hostname`)\r\n
\r\n log(" req.content_type: %s" %
`req.content_type`)\r\n log(" doing req.content_type =
\'test/123\' ...")\r\n req.con
tent_type = \'test/123\'\r\n log(" req.content_type: %s" %
`req.content_type`)\r\n if req.content_type != \'test/123\' or
not req._content_
type_set:\r\n self.fail("req.content_type should be
\'test/123\' and req._content_type_set 1")\r\n \r\n log("
req.handler: %s" % `re
q.handler`)\r\n if req.handler != "mod_python":\r\n
self.fail("req.handler should be \'mod_python\'")\r\n \r\n
log(" req.
content_encoding: %s" % `req.content_encoding`)\r\n if
req.content_encoding:\r\n self.fail("req.content_encoding
should be None")\r\n
\r\n log(" req.content_languages: %s" %
`req.content_languages`)\r\n if req.content_languages != ():\r\n
self.fail("req.content_
languages should be an empty tuple")\r\n \r\n log("
req.vlist_validator: %s" % `req.vlist_validator`)\r\n if
req.vlist_validator:\r\
n self.fail("req.vlist_validator should be None")\r\n
\r\n log(" req.user: %s" % `req.user`)\r\n if
req.user:\r\n
self.fail("req.user should be None")\r\n \r\n
log(" req.ap_auth_type: %s" % `req.ap_auth_type`)\r\n if
req.ap_auth_type:\r\n
self.fail("req.ap_auth_type should be None")\r\n
\r\n log(" req.no_cache: %s" % `req.no_cache`)\r\n if
req.no_cache != 0:\r\
n self.fail("req.no_cache should be 0")\r\n \r\n
log(" req.no_local_copy: %s" % `req.no_local_copy`)\r\n
if req.no_local_
copy != 0:\r\n self.fail("req.no_local_copy should be 0")\r\n
\r\n log(" req.unparsed_uri: %s" %
`req.unparsed_uri`)\r\n
if req.unparsed_uri != "/tests.py":\r\n
self.fail("req.unparse_uri should be \'/tests.py\'")\r\n \r\n
log(" req.uri: %s" % `req.
uri`)\r\n if req.uri != "/tests.py":\r\n
self.fail("req.uri should be \'/tests.py\'")\r\n \r\n
log(" req.filename: %s" %
`req.filename`)\r\n if req.filename != req.document_root() +
req.uri:\r\n self.fail("req.filename should be
req.document_root() + req.uri, but
it isn\'t")\r\n \r\n log("
req.canonical_filename: %s" % `req.canonical_filename`)\r\n if
not req.canonical_filename:\r\n
self.fail("req.canonical_filename should not be blank")\r\n
\r\n log(" req.path_info: %s" % `req.path_info`)\r\n if
req.path_info != \
'\':\r\n self.fail("req.path_info should be \'\'")\r\n
\r\n log(" req.args: %s" % `req.args`)\r\n if
req.args:\r\n
self.fail("req.args should be None")\r\n \r\n log("
req.finfo: %s" % `req.finfo`)\r\n if req.finfo[10] and
(req.finfo[10] != req.ca
nonical_filename):\r\n self.fail("req.finfo[10] should be the
(canonical) filename")\r\n \r\n log(" req.parsed_uri:
%s" % `req.parse
d_uri`)\r\n if req.parsed_uri[6] != \'/tests.py\':\r\n
self.fail("req.parsed_uri[6] should be \'/tests.py\'")\r\n
\r\n log("
req.used_path_info: %s" % `req.used_path_info`)\r\n if
req.used_path_info != 2:\r\n self.fail("req.used_path_info
should be 2") # XXX real
ly? :-)\r\n \r\n log(" req.eos_sent: %s" %
`req.eos_sent`)\r\n if req.eos_sent:\r\n
self.fail("req.eos_sent says we sent
EOS, but we didn\'t")\r\n\r\n def test_req_get_config(self):\r\n\r\n
req = self.req\r\n log = req.log_error\r\n\r\n
log("req.get_config(
): %s" % `req.get_config()`)\r\n if
req.get_config()["PythonDebug"] != "1":\r\n
self.fail("get_config return should show PythonDebug 1")\r\n\r
\n log("req.get_options(): %s" % `req.get_options()`)\r\n
if req.get_options() != apache.table({"testing":"123"}):\r\n
self.fail("get_o
ptions() should contain \'testing\':\'123\', contains
%s"%req.get_options().items())\r\n\r\n def
test_req_get_remote_host(self):\r\n\r\n # simulating
this test for real is too complex...\r\n req = self.req\r\n
log = req.log_error\r\n log("req.get_get_remote_host(): %s" %
`req.get_remote_h
ost(apache.REMOTE_HOST)`)\r\n log("req.get_get_remote_host(): %s"
% `req.get_remote_host()`)\r\n if
(req.get_remote_host(apache.REMOTE_HOST) != No
ne) or \\\r\n (req.get_remote_host() != "127.0.0.1"):\r\n
self.fail("remote host test failed")\r\n\r\n def
test_server_members(self):\r\
n\r\n req = self.req\r\n log = req.log_error\r\n
server = req.server\r\n\r\n log("Examining server
memebers:")\r\n\r\n log("
server.defn_name: %s" % `server.defn_name`)\r\n if
server.defn_name[-9:] != "test.conf":\r\n
self.fail("server.defn_name does not end in \'
test.conf\'")\r\n \r\n log(" server.defn_line_number:
%s" % `server.defn_line_number`)\r\n if server.defn_line_number
== 0:\r\n
self.fail("server.defn_line_number should not be 0")\r\n \r\n
log(" server.server_admin: %s" % `server.server_admin`)\r\n
if server.s
erver_admin != "[EMAIL PROTECTED]":\r\n
self.fail("server.server_admin must be
\'[EMAIL PROTECTED]'")\r\n \r\n log("
server.server_hostname: %s" % `server.server_hostname`)\r\n if
server.server_hostname != "test_internal":\r\n
self.fail("server.server_hostn
ame must be \'test_internal\'")\r\n \r\n log("
server.port: %s" % `server.port`)\r\n # hmm it really is 0...\r\n
#if server.port
== 0:\r\n # self.fail("server.port should not be 0")\r\n
\r\n log(" server.error_fname: %s" %
`server.error_fname`)\r\n if
server.error_fname != "logs/error_log":\r\n
self.fail("server.error_fname should be \'logs/error_log\'")\r\n
\r\n log(" server.logl
evel: %s" % `server.loglevel`)\r\n if server.loglevel != 7:\r\n
self.fail("server.loglevel should be 7")\r\n \r\n
log(" serve
r.is_virtual: %s" % `server.is_virtual`)\r\n if server.is_virtual
!= 1:\r\n self.fail("server.is_virtual should be 1")\r\n
\r\n
log(" server.timeout: %s" % `server.timeout`)\r\n if not
server.timeout in (5.0, 300.0):\r\n self.fail("server.timeout
should be 5.0 or 300
.0")\r\n \r\n log(" server.keep_alive_timeout: %s" %
`server.keep_alive_timeout`)\r\n if server.keep_alive_timeout !=
15.0:\r\n
self.fail("server.keep_alive_timeout should be 15.0")\r\n
\r\n log(" server.keep_alive_max: %s" %
`server.keep_alive_max`)\r\n if
server.keep_alive_max != 100:\r\n
self.fail("server.keep_alive_max should be 100")\r\n \r\n
log(" server.keep_alive: %s" % `ser
ver.keep_alive`)\r\n if server.keep_alive != 1:\r\n
self.fail("server.keep_alive should be 1")\r\n \r\n log("
server.path: %s
" % `server.path`)\r\n if server.path != "some/path":\r\n
self.fail("server.path should be \'some/path\'")\r\n \r\n
log(" ser
ver.pathlen: %s" % `server.pathlen`)\r\n if server.pathlen !=
len(\'some/path\'):\r\n self.fail("server.pathlen should be
%d" % len(\'some/pat
h\'))\r\n \r\n log(" server.limit_req_line: %s" %
`server.limit_req_line`)\r\n if server.limit_req_line !=
8190:\r\n self.fai
l("server.limit_req_line should be 8190")\r\n \r\n
log(" server.limit_req_fieldsize: %s" %
`server.limit_req_fieldsize`)\r\n if serv
er.limit_req_fieldsize != 8190:\r\n
self.fail("server.limit_req_fieldsize should be 8190")\r\n
\r\n log(" server.limit_req_field
s: %s" % `server.limit_req_fields`)\r\n if
server.limit_req_fields != 100:\r\n
self.fail("server.limit_req_fields should be 100")\r\n \r\n
log(" server.names: %s" % `server.names`)\r\n if
server.names != ():\r\n self.fail("server.names should be an
empty tuple")
\r\n \r\n log(" server.wild_names: %s" %
`server.wild_names`)\r\n if server.wild_names != ():\r\n
self.fail("server.wild_names shoul
d be an empty tuple")\r\n \r\n\r\n def
test_connection_members(self):\r\n\r\n req = self.req\r\n
log = req.log_error\r\n conn
= req.connection\r\n\r\n log("Examining connection
memebers:")\r\n\r\n log(" connection.base_server: %s" %
`conn.base_server`)\r\n if t
ype(conn.base_server) is not type(req.server):\r\n
self.fail("conn.base_server should be same type as req.server")\r\n
\r\n log(" co
nnection.local_addr: %s" % `conn.local_addr`)\r\n if not
conn.local_addr[0] in ("127.0.0.1", "0.0.0.0"):\r\n
self.fail("conn.local_addr[0] sho
uld be \'127.0.0.1\' or \'0.0.0.0\'")\r\n \r\n log("
connection.remote_addr: %s" % `conn.remote_addr`)\r\n if not
conn.remote_addr[0] in
("127.0.0.1", "0.0.0.0"):\r\n
self.fail("conn.remote_addr[0] should be \'127.0.0.1\' or
\'0.0.0.0\'")\r\n\r\n log(" connection.remote_ip:
%s" % `conn.remote_ip`)\r\n if conn.remote_ip != "127.0.0.1":\r\n
self.fail("conn.remote_ip should be \'127.0.0.1\'")\r\n\r\n
log("
connection.remote_host: %s" % `conn.remote_host`)\r\n if
conn.remote_host is not None:\r\n self.fail("conn.remote_host
should be None")\r\n\r\
n log(" connection.remote_logname: %s" %
`conn.remote_logname`)\r\n if conn.remote_logname is not
None:\r\n self.fail("conn.remote_l
ogname should be None")\r\n \r\n log("
connection.aborted: %s" % `conn.aborted`)\r\n if conn.aborted !=
0:\r\n self.fail("con
n.aborted should be 0")\r\n\r\n log(" connection.keepalive:
%s" % `conn.keepalive`)\r\n if conn.keepalive != 2:\r\n
self.fail("conn.
keepalive should be 2")\r\n \r\n log("
connection.double_reverse: %s" % `conn.double_reverse`)\r\n if
conn.double_reverse != 0:\r\n
self.fail("conn.double_reverse should be 0")\r\n \r\n
log(" connection.keepalives: %s" % `conn.keepalives`)\r\n
if conn.keepalive
s != 1:\r\n self.fail("conn.keepalives should be 1")\r\n\r\n
log(" connection.local_ip: %s" % `conn.local_ip`)\r\n
if conn.local_ip
!= "127.0.0.1":\r\n self.fail("conn.local_ip should be
\'127.0.0.1\'")\r\n\r\n log(" connection.local_host: %s" %
`conn.local_host`)\r\n
if conn.local_host is not None:\r\n
self.fail("conn.local_host should be None")\r\n\r\n log("
connection.id: %s" % `conn.id`)\r\n
if conn.id > 100:\r\n self.fail("conn.id should not be
this high")\r\n \r\n log(" connection.notes: %s" %
`conn.notes`)\r\n
if `conn.notes` != \'{}\':\r\n self.fail("conn.notes
should be {}")\r\n\r\ndef make_suite(req):\r\n\r\n mpTestSuite =
unittest.TestSuite()\r\n
mpTestSuite.addTest(SimpleTestCase("test_apache_log_error", req))\r\n
mpTestSuite.addTest(SimpleTestCase("test_apache_table", req))\r\n
mpTestSuite.addT
est(SimpleTestCase("test_req_add_common_vars", req))\r\n
mpTestSuite.addTest(SimpleTestCase("test_req_members", req))\r\n
mpTestSuite.addTest(SimpleTestCa
se("test_req_get_config", req))\r\n
mpTestSuite.addTest(SimpleTestCase("test_req_get_remote_host", req))\r\n
mpTestSuite.addTest(SimpleTestCase("test_serv
er_members", req))\r\n
mpTestSuite.addTest(SimpleTestCase("test_connection_members", req))\r\n
return mpTestSuite\r\n\r\n\r\ndef handler(req):\r\n\r\n
out = cStringIO.StringIO()\r\n\r\n tr =
unittest.TextTestRunner(out)\r\n result =
tr.run(make_suite(req))\r\n\r\n req.log_error(out.getvalue())\r\n\r\n
if result.wasSuccessful():\r\n req.write("test ok")\r\n
else:\r\n req.write("test failed")\r\n\r\n return
apache.OK\r\n\r\ndef req_add_h
andler(req):\r\n\r\n req.secret_message = "foo"\r\n
req.add_handler("PythonHandler", "tests::simple_handler")\r\n\r\n
return apache.OK\r\n\r\ndef simpl
e_handler(req):\r\n # for req_add_handler()\r\n if
(req.secret_message == "foo"):\r\n req.write("test ok")\r\n
\r\n return apache.OK\r\n\
r\ndef req_add_bad_handler(req):\r\n # bad_handler does not exist so
adding it should \r\n # should raise an AttributeError exception\r\n
\r\n req.l
og_error("req_add_bad_handler")\r\n req.add_handler("PythonHandler",
"tests::bad_handler")\r\n req.write("test ok")\r\n\r\n return
apache.OK\r\n\r\ndef
req_add_empty_handler_string(req):\r\n # Adding an empty string as
a handler should should \r\n # should raise an exception\r\n \r\n
req.log_error(
"req_add_empty_handler_string")\r\n req.add_handler("PythonHandler",
"")\r\n req.write("no exception")\r\n\r\n return
apache.OK\r\n\r\ndef accesshandle
r_add_handler_to_empty_hl(req):\r\n # Prior to version 3.2.6, adding
a python handler \r\n # to and empty handler list would cause a
segfault\r\n \r\n
req.secret_message = "foo"\r\n
req.log_error("accesshandler_add_handler_to_empty_hl")\r\n
req.add_handler("PythonHandler", "tests::simple_handler")\r\n\r\
n return apache.OK\r\n\r\ndef req_allow_methods(req):\r\n\r\n
req.allow_methods(["PYTHONIZE"])\r\n return
apache.HTTP_METHOD_NOT_ALLOWED\r\n\r\ndef req
_get_basic_auth_pw(req):\r\n\r\n pw = req.get_basic_auth_pw()\r\n
if req.user != "spam" or pw != "eggs":\r\n req.write("test
failed")\r\n else:\
r\n req.write("test ok")\r\n\r\n return apache.OK\r\n\r\ndef
req_auth_type(req):\r\n\r\n if (req.phase ==
"PythonAuthenHandler"):\r\n if req
.auth_type() != "dummy":\r\n req.log_error("auth_type check
failed")\r\n req.write("test failed")\r\n return
apache.DONE\r\n
if req.auth_name() != "blah":\r\n
req.log_error("auth_name check failed")\r\n req.write("test
failed")\r\n return apache.D
ONE\r\n req.user = "dummy"\r\n req.ap_auth_type =
req.auth_type()\r\n else:\r\n if req.ap_auth_type !=
"dummy":\r\n req.log_e
rror("ap_auth_type check failed")\r\n req.write("test
failed")\r\n return apache.OK\r\n if req.user !=
"dummy":\r\n req.
log_error("user check failed")\r\n req.write("test
failed")\r\n return apache.OK\r\n req.write("test
ok")\r\n\r\n return apache.
OK\r\n\r\ndef req_requires(req):\r\n\r\n req.user = "blah" # or
else!\r\n\r\n if req.requires() == (\'valid-user\',):\r\n
req.write("test ok")\r\n
return apache.DONE\r\n\r\n return apache.OK\r\n\r\ndef
req_document_root(req):\r\n\r\n req.write(req.document_root())\r\n
return apache.OK\r\n\r
\ndef req_internal_redirect(req):\r\n\r\n
req.internal_redirect("/test.int")\r\n\r\n return
apache.OK\r\n\r\ndef req_internal_redirect_int(req):\r\n #
used by req_internal_redirect\r\n\r\n req.prev.write("test ")\r\n
req.write("ok")\r\n\r\n return apache.OK\r\n\r\ndef
req_construct_url(req):\r\n\r\n
url = req.construct_url("/index.html")\r\n\r\n if not
re.match("^http://test_req_construct_url:[0-9]+/index.html$",url):\r\n
req.write("test failed"
)\r\n else:\r\n req.write("test ok")\r\n\r\n return
apache.OK\r\n\r\ndef req_read(req):\r\n\r\n s = req.read()\r\n
req.write(s)\r\n\r\n re
turn apache.OK\r\n\r\ndef req_readline(req):\r\n\r\n s =
req.readline()\r\n while s:\r\n req.write(s)\r\n s =
req.readline()\r\n\r\n retu
rn apache.OK\r\n\r\ndef req_readlines(req):\r\n\r\n lines =
req.readlines()\r\n req.write("".join(lines))\r\n\r\n return
apache.OK\r\n\r\ndef req_regis
ter_cleanup(req):\r\n\r\n req.cleanup_data = "req_register_cleanup
test ok"\r\n req.register_cleanup(cleanup, req)\r\n
req.write("registered cleanup th
at will write to log")\r\n\r\n return apache.OK\r\n\r\ndef
cleanup(data):\r\n # for req_register_cleanup above\r\n\r\n
data.log_error(data.cleanup_data
)\r\n\r\ndef server_cleanup(data):\r\n # for srv_register_cleanup and
apache_register_cleanup below\r\n\r\n
apache.log_error(data)\r\n\r\ndef req_headers_
out(req):\r\n\r\n req.headers_out["X-Test-Header"] = "test ok"\r\n
req.write("test ok")\r\n\r\n return apache.OK\r\n\r\ndef
req_headers_out_access(req)
:\r\n\r\n return apache.OK\r\n\r\ndef req_sendfile(req):\r\n\r\n
import tempfile\r\n fname = tempfile.mktemp("txt")\r\n f =
open(fname, "w")\r\n
f.write(" test ok ");\r\n f.close()\r\n\r\n
req.sendfile(fname, 2, 7)\r\n\r\n # os.remove(fname)\r\n return
apache.OK\r\n\r\ndef req_sendfile2(re
q):\r\n\r\n import tempfile\r\n fname =
tempfile.mktemp("txt")\r\n f = open(fname, "w")\r\n
f.write("0123456789"*100);\r\n f.close()\r\n\r\n
req.sendfile(fname)\r\n\r\n # os.remove(fname)\r\n return
apache.OK\r\n \r\ndef req_sendfile3(req):\r\n """Check if sendfile
handles symlinks properly.
\r\n This is only valid on posix systems.\r\n """\r\n\r\n
import tempfile\r\n # note mktemp is deprecated in python 2.3. Should
use mkstemp inste
ad.\r\n fname = tempfile.mktemp("txt")\r\n f = open(fname,
"w")\r\n f.write("0123456789"*100);\r\n f.close()\r\n
fname_symlink = \'%s.lnk\' % f
name\r\n os.symlink(fname, fname_symlink)\r\n
req.sendfile(fname_symlink)\r\n os.remove(fname_symlink)\r\n
os.remove(fname)\r\n return apache.OK\
r\n\r\ndef req_handler(req):\r\n if req.phase ==
"PythonFixupHandler":\r\n req.handler = "mod_python"\r\n
req.add_handler("PythonHandler","test
s::req_handler")\r\n return apache.OK\r\n elif req.phase ==
"PythonHandler":\r\n req.write(\'test ok\')\r\n return
apache.OK\r\n else
:\r\n req.write(\'test failed\')\r\n return
apache.OK\r\n\r\ndef fileupload(req):\r\n from mod_python import
util\r\n import md5\r\n fiel
ds = util.FieldStorage(req)\r\n f = fields.getfirst(\'testfile\')\r\n
\r\n req.write(md5.new(f.file.read()).hexdigest())\r\n return
apache.OK\r\n\r\
ndef srv_register_cleanup(req):\r\n\r\n
req.server.register_cleanup(req, server_cleanup, "srv_register_cleanup
test ok")\r\n req.write("registered server
cleanup that will write to log")\r\n\r\n return apache.OK\r\n\r\ndef
apache_register_cleanup(req):\r\n\r\n
apache.register_cleanup(req.interpreter, req.se
rver, server_cleanup, "apache_register_cleanup test ok")\r\n
req.write("registered server cleanup that will write to log")\r\n\r\n
return apache.OK\r\n\r\
ndef apache_exists_config_define(req):\r\n if
apache.exists_config_define(\'FOOBAR\'):\r\n
req.write(\'FOOBAR\')\r\n else:\r\n req.write(\'N
O_FOOBAR\')\r\n return apache.OK\r\n\r\ndef
util_fieldstorage(req):\r\n\r\n from mod_python import util\r\n
req.write(`util.FieldStorage(req).list`)\r\
n return apache.OK\r\n\r\ndef postreadrequest(req):\r\n\r\n
req.write("test ok")\r\n\r\n return apache.DONE\r\n\r\n\r\ndef
trans(req):\r\n\r\n req.f
ilename = req.document_root()+"/tests.py"\r\n\r\n return
apache.OK\r\n\r\ndef import_test(req):\r\n\r\n import sys\r\n if
sys.modules.has_key("dummymod
ule"):\r\n req.write("test ok")\r\n else:\r\n
req.log_error("dummymodule not found in sys.modules")\r\n
req.write("test failed")\r\n\r\n
return apache.OK\r\n\r\ndef outputfilter(filter):\r\n\r\n s =
filter.read()\r\n while s:\r\n filter.write(s.upper())\r\n
s = filter.read
()\r\n\r\n if s is None:\r\n filter.close()\r\n\r\n return
apache.OK\r\n\r\ndef simplehandler(req):\r\n\r\n req.write("test
ok")\r\n\r\n retu
rn apache.OK\r\n\r\ndef connectionhandler(conn):\r\n\r\n # read
whatever\r\n s = conn.readline().strip()\r\n while s:\r\n s
= conn.readline().st
rip()\r\n\r\n # fake an HTTP response\r\n conn.write("HTTP/1.1 200
OK\\r\\n")\r\n conn.write("Content-Length: 7\\r\\n\\r\\n")\r\n
conn.write("test o
k")\r\n\r\n return apache.OK\r\n\r\ndef pipe_ext(req):\r\n\r\n #
this is called by publisher\r\n\r\n return "pipe ext"\r\n\r\n\r\ndef
Cookie_Cookie(req
):\r\n\r\n from mod_python import Cookie\r\n\r\n cookies =
Cookie.get_cookies(req)\r\n\r\n for k in cookies:\r\n
Cookie.add_cookie(req, cookies[
k])\r\n\r\n req.write("test ok")\r\n \r\n return
apache.OK\r\n\r\ndef Cookie_MarshalCookie(req):\r\n\r\n from
mod_python import Cookie\r\n\r\n co
okies = Cookie.get_cookies(req, Cookie.MarshalCookie,\r\n
secret="secret")\r\n\r\n for k in cookies:\r\n
Cookie.add_coo
kie(req, cookies[k])\r\n\r\n req.write("test ok")\r\n \r\n
return apache.OK\r\n \r\n\r\ndef global_lock(req):\r\n\r\n import
_apache\r\n\r\n _
apache._global_lock(req.server, 1)\r\n time.sleep(1)\r\n
_apache._global_unlock(req.server, 1)\r\n\r\n req.write("test
ok")\r\n \r\n return apach
e.OK\r\n\r\ndef Session_Session(req):\r\n\r\n from mod_python import
Session, Cookie\r\n\r\n s = Session.Session(req)\r\n if
s.is_new():\r\n s.s
ave()\r\n \r\n cookies = Cookie.get_cookies(req)\r\n if
cookies.has_key(Session.COOKIE_NAME) and s.is_new():\r\n
req.write(str(cookies[Sessi
on.COOKIE_NAME]))\r\n else:\r\n req.write("test ok")\r\n\r\n
return apache.OK\r\n\r\ndef test_sys_argv(req):\r\n import sys\r\n
req.write(rep
r(sys.argv))\r\n return apache.OK\r\n \r\ndef
PythonOption_items(req):\r\n options = req.get_options().items()\r\n
options.sort()\r\n req.wri
te(str(options))\r\n return apache.OK\r\n\r\ndef
interpreter(req):\r\n req.write(req.interpreter)\r\n return
apache.OK\r\n\r\ndef index(req):\r\n re
turn "test ok, interpreter=%s" % req.interpreter\r\n\r\ndef
test_publisher(req):\r\n return "test ok, interpreter=%s" %
req.interpreter\r\n\r\nclass OldStyle
ClassTest:\r\n def __init__(self):\r\n pass\r\n def
__call__(self, req):\r\n return "test callable old-style instance
ok"\r\n def travers
e(self, req):\r\n return "test traversable old-style instance
ok"\r\nold_instance = OldStyleClassTest()\r\n\r\ntest_dict = {1:1, 2:2,
3:3}\r\ntest_dict_k
eys = test_dict.keys\r\n\r\ndef test_dict_iteration(req):\r\n return
test_dict_keys()\r\n \r\ndef test_generator(req):\r\n c = 0\r\n
while c < 10:\r
\n yield c\r\n c += 1\r\n\r\nclass
InstanceTest(object):\r\n def __call__(self, req):\r\n return
"test callable instance ok"\r\n def
traverse(self, req):\r\n return "test traversable instance
ok"\r\ninstance = InstanceTest()\r\n\r\n# Hierarchy traversal
tests\r\nclass Mapping(object):\
r\n def __init__(self,name):\r\n self.name = name\r\n\r\n
def __call__(self,req):\r\n return "Called
%s"%self.name\r\nhierarchy_root = Mappi
ng("root");\r\nhierarchy_root.page1 =
Mapping("page1")\r\nhierarchy_root.page1.subpage1 =
Mapping("subpage1")\r\nhierarchy_root.page2 = Mapping("page2")\r\n\r\n
class Mapping2:\r\n pass\r\nhierarchy_root_2 =
Mapping2()\r\nhierarchy_root_2.__call__ =
index\r\nhierarchy_root_2.page1 = index\r\nhierarchy_root_2.page2 =
index\r\n\r\ndef _test_table():\r\n\r\n log =
apache.log_error\r\n\r\n log(" starting _test_table")\r\n d =
apache.table()\r\n if d.keys() != []:
raise TestFailed, \'{}.keys()\'\r\n if d.has_key(\'a\') != 0: raise
TestFailed, \'{}.has_key(\\\'a\\\')\'\r\n if (\'a\' in d) != 0: raise
TestFailed, "\'
a\' in {}"\r\n if (\'a\' not in d) != 1: raise TestFailed, "\'a\' not
in {}"\r\n if len(d) != 0: raise TestFailed, \'len({})\'\r\n d =
{\'a\': 1, \'b\'
: 2}\r\n if len(d) != 2: raise TestFailed, \'len(dict)\'\r\n k =
d.keys()\r\n k.sort()\r\n if k != [\'a\', \'b\']: raise
TestFailed, \'dict keys()\'
\r\n if d.has_key(\'a\') and d.has_key(\'b\') and not
d.has_key(\'c\'): pass\r\n else: raise TestFailed, \'dict
keys()\'\r\n if \'a\' in d and \'b\' in
d and \'c\' not in d: pass\r\n else: raise TestFailed, \'dict
keys() # in/not in version\'\r\n if d[\'a\'] != 1 or d[\'b\'] != 2:
raise TestFailed, \'dic
t item\'\r\n d[\'c\'] = 3\r\n d[\'a\'] = 4\r\n if d[\'c\'] != 3
or d[\'a\'] != 4: raise TestFailed, \'dict item assignment\'\r\n del
d[\'b\']\r\n
if d != {\'a\': 4, \'c\': 3}: raise TestFailed, \'dict item
deletion\'\r\n \r\n # dict.clear()\r\n log("
table.clear()")\r\n d = apache.table()\
r\n d[\'1\'] = \'1\'\r\n d[\'2\'] = \'2\'\r\n d[\'3\'] =
\'3\'\r\n d.clear()\r\n if d != apache.table(): raise TestFailed,
\'dict clear\'\r\n
\r\n # dict.update()\r\n log(" table.update()")\r\n
d.update({\'1\':\'100\'})\r\n d.update({\'2\':\'20\'})\r\n
d.update({\'1\':\'1\', \'2\':\'
2\', \'3\':\'3\'})\r\n if d != apache.table({\'1\':\'1\',
\'2\':\'2\', \'3\':\'3\'}): raise TestFailed, \'dict update\'\r\n
d.clear()\r\n try: d.update
(None)\r\n except AttributeError: pass\r\n else: raise TestFailed,
\'dict.update(None), AttributeError expected\'\r\n class
SimpleUserDict:\r\n
def __init__(self):\r\n self.d = {1:1, 2:2, 3:3}\r\n
def keys(self):\r\n return self.d.keys()\r\n def
__getitem__(self, i):\
r\n return self.d[i]\r\n d.update(SimpleUserDict())\r\n
if d != apache.table({1:1, 2:2, 3:3}): raise TestFailed,
\'dict.update(instance)\'\r\n
d.clear()\r\n class FailingUserDict:\r\n def
keys(self):\r\n raise ValueError\r\n try:
d.update(FailingUserDict())\r\n except Valu
eError: pass\r\n else: raise TestFailed, \'dict.keys() expected
ValueError\'\r\n class FailingUserDict:\r\n def
keys(self):\r\n class Bo
gonIter:\r\n def __iter__(self):\r\n
raise ValueError\r\n return BogonIter()\r\n try:
d.update(FailingUserDict()
)\r\n except ValueError: pass\r\n else: raise TestFailed,
\'iter(dict.keys()) expected ValueError\'\r\n class
FailingUserDict:\r\n def keys(self
):\r\n class BogonIter:\r\n def
__init__(self):\r\n self.i = 1\r\n def
__iter__(self):\r\n
return self\r\n def next(self):\r\n
if self.i:\r\n self.i = 0\r\n
retu
rn \'a\'\r\n raise ValueError\r\n return
BogonIter()\r\n def __getitem__(self, key):\r\n return
key\r\n try:
d.update(FailingUserDict())\r\n except ValueError: pass\r\n else:
raise TestFailed, \'iter(dict.keys()).next() expected ValueError\'\r\n
class FailingU
serDict:\r\n def keys(self):\r\n class BogonIter:\r\n
def __init__(self):\r\n self.i =
ord(\'a\')\r\n
def __iter__(self):\r\n return self\r\n
def next(self):\r\n if self.i <=
ord(\'z\'):\r\n
rtn = chr(self.i)\r\n self.i +=
1\r\n return rtn\r\n raise
StopIteration\r\n
return BogonIter()\r\n def __getitem__(self, key):\r\n
raise ValueError\r\n try: d.update(FailingUserDict())\r\n
except ValueErro
r: pass\r\n else: raise TestFailed, \'dict.update(), __getitem__
expected ValueError\'\r\n # dict.copy()\r\n log("
table.copy()")\r\n d = {1:1, 2
:2, 3:3}\r\n if d.copy() != {1:1, 2:2, 3:3}: raise TestFailed, \'dict
copy\'\r\n if apache.table().copy() != apache.table(): raise
TestFailed, \'empty dic
t copy\'\r\n # dict.get()\r\n log(" table.get()")\r\n d =
apache.table()\r\n if d.get(\'c\') is not None: raise TestFailed,
\'missing {} get, no
2nd arg\'\r\n if d.get(\'c\', \'3\') != \'3\': raise TestFailed,
\'missing {} get, w/ 2nd arg\'\r\n d = apache.table({\'a\' : \'1\',
\'b\' : \'2\'})\r\n
if d.get(\'c\') is not None: raise TestFailed, \'missing dict get, no
2nd arg\'\r\n if d.get(\'c\', \'3\') != \'3\': raise TestFailed,
\'missing dict get,
w/ 2nd arg\'\r\n if d.get(\'a\') != \'1\': raise TestFailed,
\'present dict get, no 2nd arg\'\r\n if d.get(\'a\', \'3\') != \'1\':
raise TestFailed, \'pre
sent dict get, w/ 2nd arg\'\r\n # dict.setdefault()\r\n log("
table.setdefault()")\r\n d = apache.table()\r\n
d.setdefault(\'key0\')\r\n if d.
setdefault(\'key0\') is not "":\r\n raise TestFailed, \'missing
{} setdefault, no 2nd arg\'\r\n if d.setdefault(\'key0\') is not
"":\r\n raise
TestFailed, \'present {} setdefault, no 2nd arg\'\r\n #
dict.popitem()\r\n log(" table.popitem()")\r\n for copymode in
-1, +1:\r\n # -1: b ha
s same structure as a\r\n # +1: b is a.copy()\r\n for
log2size in range(12):\r\n size = 2**log2size\r\n
a = apache.table()\r
\n b = apache.table()\r\n for i in
range(size):\r\n a[`i`] = str(i)\r\n if
copymode < 0:\r\n
b[`i`] = str(i)\r\n if copymode > 0:\r\n
b = a.copy()\r\n for i in range(size):\r\n ka,
va = ta = a.popi
tem()\r\n if va != ka: raise TestFailed, "a.popitem: %s"
% str(ta)\r\n kb, vb = tb = b.popitem()\r\n
if vb != kb: r
aise TestFailed, "b.popitem: %s" % str(tb)\r\n if
copymode < 0 and ta != tb:\r\n raise TestFailed,
"a.popitem != b.popitem: %s
, %s" % (\r\n str(ta), str(tb))\r\n if
a: raise TestFailed, \'a not empty after popitems: %s\' % str(a)\r\n
if b: r
aise TestFailed, \'b not empty after popitems: %s\' % str(b)\r\n\r\n
# iteration (just make sure we can iterate without a segfault)\r\n d
= apache.table({
\'a\' : \'1\', \'b\' : \'2\', \'c\' : \'3\'})\r\n log(" for k in
table")\r\n for k in d:\r\n pass\r\n\r\n log("
_test_table test finished"
)\r\n\r\n'
----------------------------------------------------------------------
Ran 48 tests in 21.484s
FAILED (failures=4)
F Stopping Apache...
"C:\Program Files\Apache Group\Apache2\bin\Apache.exe" -k stop -f
C:\source\mod_python\test\conf\test.conf
The Apache2 service is stopping.
The Apache2 service has stopped.
======================================================================
FAIL: testPerRequestTests (__main__.PerInstanceTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 2130, in testPerRequestTests
self.failUnless(result.wasSuccessful())
AssertionError
----------------------------------------------------------------------
Ran 6 tests in 92.843s
FAILED (failures=1)