from pathlib import Path
-class FioTest(object):
+class FioTest():
"""Base for all fio tests."""
def __init__(self, exe_path, parameters, success):
return
iops_files = []
- for i in range(1,4):
- file_data, success = self.get_file(os.path.join(self.test_dir, "{0}_iops.{1}.log".format(os.path.basename(self.fio_job), i)))
+ for i in range(1, 4):
+ filename = os.path.join(self.test_dir, "{0}_iops.{1}.log".format(os.path.basename(
+ self.fio_job), i))
+ file_data, success = self.get_file(filename)
if not success:
self.failure_reason = "{0} unable to open output file,".format(self.failure_reason)
ratio1 = iops3/iops2
ratio2 = iops3/iops1
- logging.debug(
- "sample {0}: job1 iops={1} job2 iops={2} job3 iops={3} job3/job2={4:.3f} job3/job1={5:.3f}".format(
- i, iops1, iops2, iops3, ratio1, ratio2
- )
- )
+ logging.debug("sample {0}: job1 iops={1} job2 iops={2} job3 iops={3} " \
+ "job3/job2={4:.3f} job3/job1={5:.3f}".format(i, iops1, iops2, iops3, ratio1,
+ ratio2))
# test job1 and job2 succeeded to recalibrate
if ratio1 < 1 or ratio1 > 3 or ratio2 < 7 or ratio2 > 13:
- self.failure_reason = "{0} iops ratio mismatch iops1={1} iops2={2} iops3={3} expected r1~2 r2~10 got r1={4:.3f} r2={5:.3f},".format(
- self.failure_reason, iops1, iops2, iops3, ratio1, ratio2
- )
+ self.failure_reason += " iops ratio mismatch iops1={0} iops2={1} iops3={2} " \
+ "expected r1~2 r2~10 got r1={3:.3f} r2={4:.3f},".format(iops1, iops2, iops3,
+ ratio1, ratio2)
self.passed = False
return
return
iops_files = []
- for i in range(1,4):
- file_data, success = self.get_file(os.path.join(self.test_dir, "{0}_iops.{1}.log".format(os.path.basename(self.fio_job), i)))
+ for i in range(1, 4):
+ filename = os.path.join(self.test_dir, "{0}_iops.{1}.log".format(os.path.basename(
+ self.fio_job), i))
+ file_data, success = self.get_file(filename)
if not success:
self.failure_reason = "{0} unable to open output file,".format(self.failure_reason)
if ratio1 < 0.43 or ratio1 > 0.57 or ratio2 < 0.21 or ratio2 > 0.45:
- self.failure_reason = "{0} iops ratio mismatch iops1={1} iops2={2} iops3={3}\
- expected r1~0.5 r2~0.33 got r1={4:.3f} r2={5:.3f},".format(
- self.failure_reason, iops1, iops2, iops3, ratio1, ratio2
- )
+ self.failure_reason += " iops ratio mismatch iops1={0} iops2={1} iops3={2} " \
+ "expected r1~0.5 r2~0.33 got r1={3:.3f} r2={4:.3f},".format(
+ iops1, iops2, iops3, ratio1, ratio2)
self.passed = False
iops1 = iops1 + float(iops_files[0][i].split(',')[1])
ratio1 = iops1/iops2
ratio2 = iops1/iops3
- logging.debug(
- "sample {0}: job1 iops={1} job2 iops={2} job3 iops={3} job1/job2={4:.3f} job1/job3={5:.3f}".format(
- i, iops1, iops2, iops3, ratio1, ratio2
- )
- )
+ logging.debug("sample {0}: job1 iops={1} job2 iops={2} job3 iops={3} " \
+ "job1/job2={4:.3f} job1/job3={5:.3f}".format(i, iops1, iops2, iops3,
+ ratio1, ratio2))
# test job1 and job2 succeeded to recalibrate
if ratio1 < 0.43 or ratio1 > 0.57:
- self.failure_reason = "{0} iops ratio mismatch iops1={1} iops2={2} expected ratio~0.5 got ratio={3:.3f},".format(
- self.failure_reason, iops1, iops2, ratio1
- )
+ self.failure_reason += " iops ratio mismatch iops1={0} iops2={1} expected ratio~0.5 " \
+ "got ratio={2:.3f},".format(iops1, iops2, ratio1)
self.passed = False
return
bw_log_filename = os.path.join(self.test_dir, "test_bw.log")
file_data, success = self.get_file(bw_log_filename)
+ if not success:
+ self.failure_reason += " unable to open output file {0}".format(bw_log_filename)
+ self.passed = False
+ return
+
log_lines = file_data.split('\n')
prev = -4096
bw_log_filename = os.path.join(self.test_dir, "test_bw.log")
file_data, success = self.get_file(bw_log_filename)
+ if not success:
+ self.failure_reason += " unable to open output file {0}".format(bw_log_filename)
+ self.passed = False
+ return
+
log_lines = file_data.split('\n')
seq_count = 0
bw_log_filename = os.path.join(self.test_dir, "test_bw.log")
file_data, success = self.get_file(bw_log_filename)
+ if not success:
+ self.failure_reason += " unable to open output file {0}".format(bw_log_filename)
+ self.passed = False
+ return
+
log_lines = file_data.split('\n')
filesize = 1024*1024
if len(offsets) == filesize/bs:
self.passed = False
- self.failure_reason += " no duplicate offsets found with norandommap=1".format(len(offsets))
+ self.failure_reason += " no duplicate offsets found with norandommap=1"
class FioJobTest_t0023(FioJobTest):
- """Test consists of fio test job t0023"""
+ """Test consists of fio test job t0023 randtrimwrite test."""
def check_trimwrite(self, filename):
"""Make sure that trims are followed by writes of the same size at the same offset."""
bw_log_filename = os.path.join(self.test_dir, filename)
file_data, success = self.get_file(bw_log_filename)
+ if not success:
+ self.failure_reason += " unable to open output file {0}".format(bw_log_filename)
+ self.passed = False
+ return
+
log_lines = file_data.split('\n')
prev_ddir = 1
if prev_ddir == 1:
if ddir != 2:
self.passed = False
- self.failure_reason += " {0}: write not preceeded by trim: {1}".format(bw_log_filename, line)
+ self.failure_reason += " {0}: write not preceeded by trim: {1}".format(
+ bw_log_filename, line)
break
else:
if ddir != 1:
self.passed = False
- self.failure_reason += " {0}: trim not preceeded by write: {1}".format(bw_log_filename, line)
+ self.failure_reason += " {0}: trim not preceeded by write: {1}".format(
+ bw_log_filename, line)
break
else:
if prev_bs != bs:
self.passed = False
- self.failure_reason += " {0}: block size does not match: {1}".format(bw_log_filename, line)
+ self.failure_reason += " {0}: block size does not match: {1}".format(
+ bw_log_filename, line)
break
if prev_offset != offset:
self.passed = False
- self.failure_reason += " {0}: offset does not match: {1}".format(bw_log_filename, line)
+ self.failure_reason += " {0}: offset does not match: {1}".format(
+ bw_log_filename, line)
break
prev_ddir = ddir
prev_bs = bs
def check_all_offsets(self, filename, sectorsize, filesize):
+ """Make sure all offsets were touched."""
+
file_data, success = self.get_file(os.path.join(self.test_dir, filename))
if not success:
self.passed = False
offset = int(vals[4])
if offset % sectorsize != 0:
self.passed = False
- self.failure_reason += " {0}: offset {1} not a multiple of sector size {2}".format(filename, offset, sectorsize)
- break;
+ self.failure_reason += " {0}: offset {1} not a multiple of sector size {2}".format(
+ filename, offset, sectorsize)
+ break
if bs % sectorsize != 0:
self.passed = False
- self.failure_reason += " {0}: block size {1} not a multiple of sector size {2}".format(filename, bs, sectorsize)
- break;
+ self.failure_reason += " {0}: block size {1} not a multiple of sector size " \
+ "{2}".format(filename, bs, sectorsize)
+ break
for i in range(int(bs/sectorsize)):
offsets.add(offset/sectorsize + i)
if len(offsets) != filesize/sectorsize:
self.passed = False
- self.failure_reason += " {0}: only {1} offsets touched; expected {2}".format(filename, len(offsets), filesize/sectorsize)
+ self.failure_reason += " {0}: only {1} offsets touched; expected {2}".format(
+ filename, len(offsets), filesize/sectorsize)
else:
- logging.debug("{0}: {1} sectors touched".format(filename, len(offsets)))
+ logging.debug("%s: %d sectors touched", filename, len(offsets))
def check_result(self):
self.check_all_offsets("bssplit_bw.log", 512, filesize)
+class FioJobTest_t0024(FioJobTest_t0023):
+ """Test consists of fio test job t0024 trimwrite test."""
+
+ def check_result(self):
+ # call FioJobTest_t0023's parent to skip checks done by t0023
+ super(FioJobTest_t0023, self).check_result()
+
+ filesize = 1024*1024
+
+ self.check_trimwrite("basic_bw.log")
+ self.check_trimwrite("bs_bw.log")
+ self.check_trimwrite("bsrange_bw.log")
+ self.check_trimwrite("bssplit_bw.log")
+
+ self.check_all_offsets("basic_bw.log", 4096, filesize)
+ self.check_all_offsets("bs_bw.log", 8192, filesize)
+ self.check_all_offsets("bsrange_bw.log", 512, filesize)
+ self.check_all_offsets("bssplit_bw.log", 512, filesize)
+
+
class FioJobTest_iops_rate(FioJobTest):
"""Test consists of fio test job t0009
Confirm that job0 iops == 1000
self.passed = False
-class Requirements(object):
+class Requirements():
"""Requirements consists of multiple run environment characteristics.
These are to determine if a particular test can be run"""
'pre_success': None,
'requirements': [],
},
+ {
+ 'test_id': 24,
+ 'test_class': FioJobTest_t0024,
+ 'job': 't0024.fio',
+ 'success': SUCCESS_DEFAULT,
+ 'pre_job': None,
+ 'pre_success': None,
+ 'requirements': [],
+ },
{
'test_id': 1000,
'test_class': FioExeTest,