123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import random
- from pyflashsim import FlashSim
- from pyringfs import RingFSFlashPartition, RingFS
- def compare(a, b):
- if a != b:
- print ">>> %s != %s" % (a, b)
- return a == b
- class FuzzRun(object):
- def __init__(self, name, version, object_size, sector_size, total_sectors, sector_offset, sector_count):
- print "FuzzRun[%s]: v=%08x os=%d ss=%d ts=%d so=%d sc=%d" % (name, version, object_size, sector_size,
- total_sectors, sector_offset, sector_count)
- sim = FlashSim(name, total_sectors*sector_size, sector_size)
- def op_sector_erase(flash, address):
- sim.sector_erase(address)
- return 0
- def op_program(flash, address, data):
- sim.program(address, data)
- return len(data)
- def op_read(flash, address, size):
- return sim.read(address, size)
- self.version = version
- self.object_size = object_size
- self.flash = RingFSFlashPartition(sector_size, sector_offset, sector_count,
- op_sector_erase, op_program, op_read)
- self.fs = RingFS(self.flash, self.version, self.object_size)
- def run(self):
- self.fs.format()
- self.fs.dump()
- def do_append():
- self.fs.append('x'*self.object_size)
- def do_fetch():
- self.fs.fetch()
- def do_rewind():
- self.fs.rewind()
- def do_discard():
- self.fs.discard()
- for i in xrange(1000):
- fun = random.choice([do_append]*100 + [do_fetch]*100 + [do_rewind]*10 + [do_discard]*10)
- print i, fun.__name__
- fun()
- # consistency check
- newfs = RingFS(self.flash, self.version, self.object_size)
- try:
- assert newfs.scan() == 0
- assert compare(newfs.ringfs.read.sector, self.fs.ringfs.read.sector)
- assert compare(newfs.ringfs.read.slot, self.fs.ringfs.read.slot)
- assert compare(newfs.ringfs.write.sector, self.fs.ringfs.write.sector)
- assert compare(newfs.ringfs.write.slot, self.fs.ringfs.write.slot)
- except AssertionError:
- print "self.fs:"
- self.fs.dump()
- print "newfs:"
- newfs.dump()
- raise
- sector_size = random.randint(16, 256)
- total_sectors = random.randint(2, 8)
- sector_offset = random.randint(0, total_sectors-2)
- sector_count = random.randint(2, total_sectors-sector_offset)
- version = random.randint(0, 0xffffffff)
- object_size = random.randint(1, sector_size-8)
- f = FuzzRun('tests/fuzzer.sim', version, object_size, sector_size, total_sectors, sector_offset, sector_count)
- f.run()
|