def setUp(self): self.min = 0.001 self.max = 0.999 (fd, f) = tempfile.mkstemp(text=True) os.close(fd) self.tmpfile = f self.r = RangeFinder(self.min, self.max, self.tmpfile)
def test_get_ranges(self): ranges = self._ranges() # the high end of the last range should be the max self.assertAlmostEqual(ranges[-1].max, self.max) # the low end of the first range should be the min self.assertAlmostEqual(ranges[0].min, self.min) # make sure the internal ranges match up for (this, next_element) in zip(ranges[:-1], ranges[1:]): self.assertEqual(this.max, next_element.min) # Ranges would be 0.375-0.601, 0.601-0.981, 0.981-0.999 # if it weren't for the fix that merges the last two # so we should only see two ranges r = RangeFinder(0.375, 0.999, self.tmpfile) self.assertEqual(len(r.things), 2) ranges = [v for (dummy, v) in sorted(r.things.items())] self.assertAlmostEqual(ranges[0].min, 0.375) self.assertAlmostEqual(ranges[1].max, 0.999)
def __init__(self, output_base_dir, path): ''' Creates an output dir for this seedfile based on its md5 hash. @param output_base_dir: The base directory for output files @raise SeedFileError: zero-length files will raise a SeedFileError ''' BasicFile.__init__(self, path) if not self.len > 0: raise SeedFileError( 'You cannot do bitwise fuzzing on a zero-length file: %s' % self.path) # use len for bytewise, bitlen for bitwise if self.len > 1: self.range_min = 1.0 / self.len self.range_max = 1.0 - self.range_min else: self.range_min = 0 self.range_max = 1 self.tries = 0 self.rangefinder = RangeFinder(self.range_min, self.range_max)
def test_get_ranges(self): ranges = self._ranges() # the high end of the last range should be the max self.assertAlmostEqual(ranges[-1].max, self.max, 3) # the low end of the first range should be the min self.assertAlmostEqual(ranges[0].min, self.min, 3) # make sure the internal ranges match up for (this, next_element) in zip(ranges[:-1], ranges[1:]): self.assertEqual(this.max, next_element.min) # Ranges would be 0.375-0.601, 0.601-0.981, 0.981-0.999 # if it weren't for the fix that merges the last two # so we should only see two ranges r = RangeFinder(0.375, 0.999) self.assertEqual(len(r.things), 2) mins = sorted([thing.min for thing in r.things.itervalues()]) maxs = sorted([thing.max for thing in r.things.itervalues()]) self.assertEqual(0.375, mins[0]) self.assertAlmostEqual(0.61, mins[1], places=2) self.assertAlmostEqual(0.61, maxs[0], places=2) self.assertEqual(0.999, maxs[1])
class Test(unittest.TestCase): def delete_file(self, f): os.remove(f) self.assertFalse(os.path.exists(f)) def setUp(self): self.min = 0.001 self.max = 0.999 (fd, f) = tempfile.mkstemp(text=True) os.close(fd) self.tmpfile = f self.r = RangeFinder(self.min, self.max, self.tmpfile) def tearDown(self): self.delete_file(self.tmpfile) def test_get_ranges(self): ranges = self._ranges() # the high end of the last range should be the max self.assertAlmostEqual(ranges[-1].max, self.max) # the low end of the first range should be the min self.assertAlmostEqual(ranges[0].min, self.min) # make sure the internal ranges match up for (this, next_element) in zip(ranges[:-1], ranges[1:]): self.assertEqual(this.max, next_element.min) # Ranges would be 0.375-0.601, 0.601-0.981, 0.981-0.999 # if it weren't for the fix that merges the last two # so we should only see two ranges r = RangeFinder(0.375, 0.999, self.tmpfile) self.assertEqual(len(r.things), 2) ranges = [v for (dummy, v) in sorted(r.things.items())] self.assertAlmostEqual(ranges[0].min, 0.375) self.assertAlmostEqual(ranges[1].max, 0.999) def _ranges(self): keys = sorted(self.r.things.keys()) return [self.r.things[k] for k in keys] def test_range_orderings(self): # first term should be smaller than second term ranges = self.r.things.values() [self.assertTrue(x.min <= x.max) for x in ranges] def test_range_overlaps(self): # this one's min should be the next_element one's max ranges = self._ranges() [self.assertEqual(x.min, y.max) for (x, y) in zip(ranges[1:], ranges[:-1])] def test_range_mean(self): # mean should be halfway between min and max [self.assertAlmostEqual(x.mean, ((x.max + x.min) / 2)) for x in self.r.things.values()] def test_getstate_is_pickle_friendly(self): # getstate should return a pickleable object import pickle state = self.r.__getstate__() try: pickle.dumps(state) except Exception, e: self.fail('Failed to pickle state: %s' % e)