test: add testutil.flip_one_bit which flips a randomly chosen bit of the input string
authorZooko O'Whielacronx <zooko@zooko.com>
Mon, 28 Jul 2008 23:42:17 +0000 (16:42 -0700)
committerZooko O'Whielacronx <zooko@zooko.com>
Mon, 28 Jul 2008 23:42:17 +0000 (16:42 -0700)
src/allmydata/util/testutil.py

index 2242de650225502887822fe12276248540e8cb40..ec6afdc18134bc45ed4ad62361187104a6ee869b 100644 (file)
@@ -1,4 +1,5 @@
 import os, signal, time
+from random import randrange
 
 from twisted.internet import reactor, defer, task
 from twisted.python import failure
@@ -12,6 +13,13 @@ def flip_bit(good, which):
         pieces = good[:which], good[which:which+1], good[which+1:]
     return pieces[0] + chr(ord(pieces[1]) ^ 0x01) + pieces[2]
 
+def flip_one_bit(s):
+    # flip one random bit of the string s
+    i = randrange(0, len(s))
+    result = s[:i] + chr(ord(s[i])^(0x01<<randrange(0, 8))) + s[i+1:]
+    assert result != s, "Internal error -- flip_one_bit() produced the same string as its input: %s == %s" % (result, s)
+    return result
+
 class SignalMixin:
     # This class is necessary for any code which wants to use Processes
     # outside the usual reactor.run() environment. It is copied from