Example #1
0
 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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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])
Example #5
0
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)