Commit 6eeaddc3 authored by Brett Cannon's avatar Brett Cannon

Convert test_strftime, test_getargs, and test_pep247 to use unittest.

parent 887290d2
"""Test the internal getargs.c implementation """
Test the internal getargs.c implementation
PyArg_ParseTuple() is defined here. PyArg_ParseTuple() is defined here.
...@@ -11,14 +12,23 @@ single case that failed between 2.1 and 2.2a2. ...@@ -11,14 +12,23 @@ single case that failed between 2.1 and 2.2a2.
# verify that the error is propagated properly from the C code back to # verify that the error is propagated properly from the C code back to
# Python. # Python.
# XXX If the encoding succeeds using the current default encoding,
# this test will fail because it does not test the right part of the
# PyArg_ParseTuple() implementation.
from test.test_support import have_unicode
import marshal import marshal
import unittest
from test import test_support
class GetArgsTest(unittest.TestCase):
# If the encoding succeeds using the current default encoding,
# this test will fail because it does not test the right part of the
# PyArg_ParseTuple() implementation.
def test_with_marshal(self):
if not test_support.have_unicode:
return
arg = unicode(r'\222', 'unicode-escape')
self.assertRaises(UnicodeError, marshal.loads, arg)
def test_main():
test_support.run_unittest(GetArgsTest)
if have_unicode: if __name__ == '__main__':
try: test_main()
marshal.loads(unicode(r"\222", 'unicode-escape'))
except UnicodeError:
pass
# """
# Test suite to check compliance with PEP 247, the standard API for Test suite to check compilance with PEP 247, the standard API
# hashing algorithms. for hashing algorithms
# """
import warnings import warnings
warnings.filterwarnings("ignore", "the md5 module is deprecated.*", warnings.filterwarnings('ignore', 'the md5 module is deprecated.*',
DeprecationWarning) DeprecationWarning)
warnings.filterwarnings("ignore", "the sha module is deprecated.*", warnings.filterwarnings('ignore', 'the sha module is deprecated.*',
DeprecationWarning) DeprecationWarning)
import md5, sha, hmac import hmac
from test.test_support import verbose import md5
import sha
import unittest
from test import test_support
def check_hash_module(module, key=None): class Pep247Test(unittest.TestCase):
assert hasattr(module, 'digest_size'), "Must have digest_size"
assert (module.digest_size is None or
module.digest_size > 0), "digest_size must be None or positive"
if key is not None: def check_module(self, module, key=None):
obj1 = module.new(key) self.assert_(hasattr(module, 'digest_size'))
obj2 = module.new(key, "string") self.assert_(module.digest_size is None or module.digest_size > 0)
h1 = module.new(key, "string").digest() if not key is None:
obj3 = module.new(key) ; obj3.update("string") ; h2 = obj3.digest() obj1 = module.new(key)
assert h1 == h2, "Hashes must match" obj2 = module.new(key, 'string')
h1 = module.new(key, 'string').digest()
obj3 = module.new(key)
obj3.update('string')
h2 = obj3.digest()
else: else:
obj1 = module.new() obj1 = module.new()
obj2 = module.new("string") obj2 = module.new('string')
h1 = module.new('string').digest()
obj3 = module.new()
obj3.update('string')
h2 = obj3.digest()
self.assertEquals(h1, h2)
h1 = module.new("string").digest() self.assert_(hasattr(obj1, 'digest_size'))
obj3 = module.new() ; obj3.update("string") ; h2 = obj3.digest()
assert h1 == h2, "Hashes must match"
assert hasattr(obj1, 'digest_size'), "Objects must have digest_size attr" if not module.digest_size is None:
if module.digest_size is not None: self.assertEquals(obj1.digest_size, module.digest_size)
assert obj1.digest_size == module.digest_size, "digest_size must match"
assert obj1.digest_size == len(h1), "digest_size must match actual size" self.assertEquals(obj1.digest_size, len(h1))
obj1.update("string") obj1.update('string')
obj_copy = obj1.copy() obj_copy = obj1.copy()
assert obj1.digest() == obj_copy.digest(), "Copied objects must match" self.assertEquals(obj1.digest(), obj_copy.digest())
assert obj1.hexdigest() == obj_copy.hexdigest(), \ self.assertEquals(obj1.hexdigest(), obj_copy.hexdigest())
"Copied objects must match"
digest, hexdigest = obj1.digest(), obj1.hexdigest() digest, hexdigest = obj1.digest(), obj1.hexdigest()
hd2 = "" hd2 = ""
for byte in digest: for byte in digest:
hd2 += "%02x" % ord(byte) hd2 += '%02x' % ord(byte)
assert hd2 == hexdigest, "hexdigest doesn't appear correct" self.assertEquals(hd2, hexdigest)
if verbose: def test_md5(self):
print 'Module', module.__name__, 'seems to comply with PEP 247' self.check_module(md5)
def test_sha(self):
self.check_module(sha)
def test_main(): def test_hmac(self):
check_hash_module(md5) self.check_module(hmac, key='abc')
check_hash_module(sha)
check_hash_module(hmac, key='abc')
def test_main():
test_support.run_unittest(Pep247Test)
if __name__ == '__main__': if __name__ == '__main__':
test_main() test_main()
#! /usr/bin/env python """
Unittest for time.strftime
"""
# Sanity checker for time.strftime import calendar
import sys
import os
import re
from test import test_support
import time
import unittest
import time, calendar, sys, re
from test.test_support import verbose
def main(): # helper functions
global verbose def fixasctime(s):
# For C Python, these tests expect C locale, so we try to set that if s[8] == ' ':
# explicitly. For Jython, Finn says we need to be in the US locale; my s = s[:8] + '0' + s[9:]
# understanding is that this is the closest Java gets to C's "C" locale. return s
# Jython ought to supply an _locale module which Does The Right Thing, but
# this is the best we can do given today's state of affairs.
try:
import java
java.util.Locale.setDefault(java.util.Locale.US)
except ImportError:
# Can't do this first because it will succeed, even in Jython
import locale
locale.setlocale(locale.LC_TIME, 'C')
now = time.time()
strftest(now)
verbose = 0
# Try a bunch of dates and times, chosen to vary through time of
# day and daylight saving time
for j in range(-5, 5):
for i in range(25):
strftest(now + (i + j*100)*23*3603)
def escapestr(text, ampm): def escapestr(text, ampm):
"""Escape text to deal with possible locale values that have regex """
syntax while allowing regex syntax used for the comparison.""" Escape text to deal with possible locale values that have regex
syntax while allowing regex syntax used for comparison.
"""
new_text = re.escape(text) new_text = re.escape(text)
new_text = new_text.replace(re.escape(ampm), ampm) new_text = new_text.replace(re.escape(ampm), ampm)
new_text = new_text.replace("\%", "%") new_text = new_text.replace('\%', '%')
new_text = new_text.replace("\:", ":") new_text = new_text.replace('\:', ':')
new_text = new_text.replace("\?", "?") new_text = new_text.replace('\?', '?')
return new_text return new_text
def strftest(now): class StrftimeTest(unittest.TestCase):
if verbose:
print "strftime test for", time.ctime(now) def __init__(self, *k, **kw):
nowsecs = str(long(now))[:-1] unittest.TestCase.__init__(self, *k, **kw)
gmt = time.gmtime(now)
def _update_variables(self, now):
# we must update the local variables on every cycle
self.gmt = time.gmtime(now)
now = time.localtime(now) now = time.localtime(now)
if now[3] < 12: ampm='(AM|am)' if now[3] < 12: self.ampm='(AM|am)'
else: ampm='(PM|pm)' else: self.ampm='(PM|pm)'
jan1 = time.localtime(time.mktime((now[0], 1, 1, 0, 0, 0, 0, 1, 0))) self.jan1 = time.localtime(time.mktime((now[0], 1, 1, 0, 0, 0, 0, 1, 0)))
try: try:
if now[8]: tz = time.tzname[1] if now[8]: self.tz = time.tzname[1]
else: tz = time.tzname[0] else: self.tz = time.tzname[0]
except AttributeError: except AttributeError:
tz = '' self.tz = ''
if now[3] > 12: clock12 = now[3] - 12 if now[3] > 12: self.clock12 = now[3] - 12
elif now[3] > 0: clock12 = now[3] elif now[3] > 0: self.clock12 = now[3]
else: clock12 = 12 else: self.clock12 = 12
self.now = now
def setUp(self):
try:
import java
java.util.Locale.setDefault(java.util.Locale.US)
except ImportError:
import locale
locale.setlocale(locale.LC_TIME, 'C')
def test_strftime(self):
now = time.time()
self._update_variables(now)
self.strftest1(now)
self.strftest2(now)
if test_support.verbose:
print "Strftime test, platform: %s, Python version: %s" % \
(sys.platform, sys.version.split()[0])
for j in range(-5, 5):
for i in range(25):
arg = now + (i+j*100)*23*3603
self._update_variables(arg)
self.strftest1(arg)
self.strftest2(arg)
def strftest1(self, now):
if test_support.verbose:
print "strftime test for", time.ctime(now)
now = self.now
# Make sure any characters that could be taken as regex syntax is # Make sure any characters that could be taken as regex syntax is
# escaped in escapestr() # escaped in escapestr()
expectations = ( expectations = (
...@@ -70,16 +95,16 @@ def strftest(now): ...@@ -70,16 +95,16 @@ def strftest(now):
# %c see below # %c see below
('%d', '%02d' % now[2], 'day of month as number (00-31)'), ('%d', '%02d' % now[2], 'day of month as number (00-31)'),
('%H', '%02d' % now[3], 'hour (00-23)'), ('%H', '%02d' % now[3], 'hour (00-23)'),
('%I', '%02d' % clock12, 'hour (01-12)'), ('%I', '%02d' % self.clock12, 'hour (01-12)'),
('%j', '%03d' % now[7], 'julian day (001-366)'), ('%j', '%03d' % now[7], 'julian day (001-366)'),
('%m', '%02d' % now[1], 'month as number (01-12)'), ('%m', '%02d' % now[1], 'month as number (01-12)'),
('%M', '%02d' % now[4], 'minute, (00-59)'), ('%M', '%02d' % now[4], 'minute, (00-59)'),
('%p', ampm, 'AM or PM as appropriate'), ('%p', self.ampm, 'AM or PM as appropriate'),
('%S', '%02d' % now[5], 'seconds of current time (00-60)'), ('%S', '%02d' % now[5], 'seconds of current time (00-60)'),
('%U', '%02d' % ((now[7] + jan1[6])//7), ('%U', '%02d' % ((now[7] + self.jan1[6])//7),
'week number of the year (Sun 1st)'), 'week number of the year (Sun 1st)'),
('%w', '0?%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'), ('%w', '0?%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'),
('%W', '%02d' % ((now[7] + (jan1[6] - 1)%7)//7), ('%W', '%02d' % ((now[7] + (self.jan1[6] - 1)%7)//7),
'week number of the year (Mon 1st)'), 'week number of the year (Mon 1st)'),
# %x see below # %x see below
('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'), ('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
...@@ -89,12 +114,32 @@ def strftest(now): ...@@ -89,12 +114,32 @@ def strftest(now):
('%%', '%', 'single percent sign'), ('%%', '%', 'single percent sign'),
) )
for e in expectations:
# musn't raise a value error
try:
result = time.strftime(e[0], now)
except ValueError, error:
print "Standard '%s' format gaver error:" % (e[0], error)
continue
if re.match(escapestr(e[1], self.ampm), result):
continue
if not result or result[0] == '%':
print "Does not support standard '%s' format (%s)" % \
(e[0], e[2])
else:
print "Conflict for %s (%s):" % (e[0], e[2])
print " Expected %s, but got %s" % (e[1], result)
def strftest2(self, now):
nowsecs = str(long(now))[:-1]
now = self.now
nonstandard_expectations = ( nonstandard_expectations = (
# These are standard but don't have predictable output # These are standard but don't have predictable output
('%c', fixasctime(time.asctime(now)), 'near-asctime() format'), ('%c', fixasctime(time.asctime(now)), 'near-asctime() format'),
('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), ('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)),
'%m/%d/%y %H:%M:%S'), '%m/%d/%y %H:%M:%S'),
('%Z', '%s' % tz, 'time zone name'), ('%Z', '%s' % self.tz, 'time zone name'),
# These are some platform specific extensions # These are some platform specific extensions
('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'), ('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'),
...@@ -102,7 +147,7 @@ def strftest(now): ...@@ -102,7 +147,7 @@ def strftest(now):
('%h', calendar.month_abbr[now[1]], 'abbreviated month name'), ('%h', calendar.month_abbr[now[1]], 'abbreviated month name'),
('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'), ('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'),
('%n', '\n', 'newline character'), ('%n', '\n', 'newline character'),
('%r', '%02d:%02d:%02d %s' % (clock12, now[4], now[5], ampm), ('%r', '%02d:%02d:%02d %s' % (self.clock12, now[4], now[5], self.ampm),
'%I:%M:%S %p'), '%I:%M:%S %p'),
('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'), ('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'),
('%s', nowsecs, 'seconds since the Epoch in UCT'), ('%s', nowsecs, 'seconds since the Epoch in UCT'),
...@@ -112,47 +157,31 @@ def strftest(now): ...@@ -112,47 +157,31 @@ def strftest(now):
'year without century rendered using fieldwidth'), 'year without century rendered using fieldwidth'),
) )
if verbose:
print "Strftime test, platform: %s, Python version: %s" % \
(sys.platform, sys.version.split()[0])
for e in expectations:
try:
result = time.strftime(e[0], now)
except ValueError, error:
print "Standard '%s' format gave error:" % e[0], error
continue
if re.match(escapestr(e[1], ampm), result): continue
if not result or result[0] == '%':
print "Does not support standard '%s' format (%s)" % (e[0], e[2])
else:
print "Conflict for %s (%s):" % (e[0], e[2])
print " Expected %s, but got %s" % (e[1], result)
for e in nonstandard_expectations: for e in nonstandard_expectations:
try: try:
result = time.strftime(e[0], now) result = time.strftime(e[0], now)
except ValueError, result: except ValueError, result:
if verbose: msg = "Error for nonstandard '%s' format (%s): %s" % \
print "Error for nonstandard '%s' format (%s): %s" % \
(e[0], e[2], str(result)) (e[0], e[2], str(result))
if test_support.verbose:
print msg
continue continue
if re.match(escapestr(e[1], ampm), result):
if verbose: if re.match(escapestr(e[1], self.ampm), result):
if test_support.verbose:
print "Supports nonstandard '%s' format (%s)" % (e[0], e[2]) print "Supports nonstandard '%s' format (%s)" % (e[0], e[2])
elif not result or result[0] == '%': elif not result or result[0] == '%':
if verbose: if test_support.verbose:
print "Does not appear to support '%s' format (%s)" % (e[0], print "Does not appear to support '%s' format (%s)" % \
e[2]) (e[0], e[2])
else: else:
if verbose: if test_support.verbose:
print "Conflict for nonstandard '%s' format (%s):" % (e[0], print "Conflict for nonstandard '%s' format (%s):" % \
e[2]) (e[0], e[2])
print " Expected %s, but got %s" % (e[1], result) print " Expected %s, but got %s" % (e[1], result)
def fixasctime(s): def test_main():
if s[8] == ' ': test_support.run_unittest(StrftimeTest)
s = s[:8] + '0' + s[9:]
return s
main() if __name__ == '__main__':
test_main()
...@@ -75,6 +75,8 @@ Library ...@@ -75,6 +75,8 @@ Library
Tests Tests
----- -----
- GHOP 293: Convert test_strftime, test_getargs, and test_pep247 to unittest.
- Issue #2055: Convert test_fcntl to unittest. - Issue #2055: Convert test_fcntl to unittest.
- Issue 1960: Convert test_gdbm to unittest. - Issue 1960: Convert test_gdbm to unittest.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment