# Uncomment this line, and replace the device with something sensible
# for you ...
# fs = job.partition('/dev/hda2', job.tmpdir)
# or ...

part = job.partition('/tmp/looped', 1024, job.tmpdir)

# dbench 1024, ltp, 1024-byte blocksize, a few other things.  Lots of fscking.
# I haven't tested nobh mode yet, 
# and I have yet to point run-bash-shared-mapping at it.
# (different mount options for ext3)

def test_fs():
	part.mkfs(fstype)
	part.mount()
	try:
		job.run_test('fsx', dir=part.mountpoint, tag=fstype)
		job.run_test('iozone', dir=part.mountpoint, tag=fstype)
		job.run_test('dbench', dir=part.mountpoint, tag=fstype)
	finally:
		part.unmount()
		part.fsck()

for fstype in ('ext2', 'ext3', 'jfs', 'xfs', 'reiserfs'):
	job.run_group(test_fs)
