-import os, signal, time
+import os, signal, sys, time
from random import randrange
from twisted.internet import reactor, defer
from twisted.python import failure
+from allmydata.util import fileutil, log
+from allmydata.util.encodingutil import unicode_platform, get_filesystem_encoding
+
+
def insecurerandstr(n):
return ''.join(map(chr, map(randrange, [0]*n, [256]*n)))
assert result != s, "Internal error -- flip_one_bit() produced the same string as its input: %s == %s" % (result, s)
return result
+
+class ReallyEqualMixin:
+ def failUnlessReallyEqual(self, a, b, msg=None):
+ self.failUnlessEqual(a, b, msg=msg)
+ self.failUnlessEqual(type(a), type(b), msg="a :: %r, b :: %r, %r" % (a, b, msg))
+
+
+class NonASCIIPathMixin:
+ def mkdir_nonascii(self, dirpath):
+ # Kludge to work around the fact that buildbot can't remove a directory tree that has
+ # any non-ASCII directory names on Windows. (#1472)
+ if sys.platform == "win32":
+ def _cleanup():
+ try:
+ fileutil.rm_dir(dirpath)
+ finally:
+ if os.path.exists(dirpath):
+ msg = ("We were unable to delete a non-ASCII directory %r created by the test. "
+ "This is liable to cause failures on future builds." % (dirpath,))
+ print msg
+ log.err(msg)
+ self.addCleanup(_cleanup)
+ os.mkdir(dirpath)
+
+ def unicode_or_fallback(self, unicode_name, fallback_name):
+ if unicode_platform():
+ return unicode_name
+ try:
+ unicode_name.encode(get_filesystem_encoding())
+ return unicode_name
+ except UnicodeEncodeError:
+ return fallback_name
+
+
class SignalMixin:
# This class is necessary for any code which wants to use Processes
# outside the usual reactor.run() environment. It is copied from
if p.active():
p.cancel()
else:
- print "WEIRNESS! pending timed call not active+!"
+ print "WEIRDNESS! pending timed call not active!"
if required_to_quiesce and active:
self.fail("Reactor was still active when it was required to be quiescent.")
+
+class TimezoneMixin(object):
+
+ def setTimezone(self, timezone):
+ unset = object()
+ originalTimezone = os.environ.get('TZ', unset)
+ def restoreTimezone():
+ if originalTimezone is unset:
+ del os.environ['TZ']
+ time.tzset()
+ else:
+ os.environ['TZ'] = originalTimezone
+ time.tzset()
+ os.environ['TZ'] = timezone
+ time.tzset()
+ self.addCleanup(restoreTimezone)
+
+
try:
import win32file
import win32con