Merge branch 'master' of https://github.com/celestinechen/fio
[fio.git] / t / readonly.py
CommitLineData
09a66e9e
VF
1#!/usr/bin/env python3
2# SPDX-License-Identifier: GPL-2.0-only
3#
4# Copyright (c) 2019 Western Digital Corporation or its affiliates.
fef0c6fd
VF
5
6"""
09a66e9e
VF
7# readonly.py
8#
fc002f14 9# Do some basic tests of the --readonly parameter
09a66e9e
VF
10#
11# USAGE
12# python readonly.py [-f fio-executable]
13#
14# EXAMPLES
15# python t/readonly.py
16# python t/readonly.py -f ./fio
17#
18# REQUIREMENTS
19# Python 3.5+
20#
fef0c6fd 21"""
09a66e9e 22
fef0c6fd 23import os
09a66e9e 24import sys
fef0c6fd 25import time
09a66e9e 26import argparse
fef0c6fd
VF
27from pathlib import Path
28from fiotestlib import FioJobCmdTest, run_fio_tests
29from fiotestcommon import SUCCESS_DEFAULT, SUCCESS_NONZERO
30
31
32class FioReadOnlyTest(FioJobCmdTest):
33 """fio read only test."""
34
35 def setup(self, parameters):
36 """Setup the test."""
37
38 fio_args = [
39 "--name=readonly",
40 "--ioengine=null",
41 "--time_based",
42 "--runtime=1s",
43 "--size=1M",
44 f"--rw={self.fio_opts['rw']}",
45 ]
46 if 'readonly-pre' in parameters:
47 fio_args.insert(0, "--readonly")
48 if 'readonly-post' in parameters:
49 fio_args.append("--readonly")
50
51 super().setup(fio_args)
52
53
54TEST_LIST = [
55 {
56 "test_id": 1,
57 "fio_opts": { "rw": "randread", },
58 "readonly-pre": 1,
59 "success": SUCCESS_DEFAULT,
60 "test_class": FioReadOnlyTest,
61 },
62 {
63 "test_id": 2,
64 "fio_opts": { "rw": "randwrite", },
65 "readonly-pre": 1,
66 "success": SUCCESS_NONZERO,
67 "test_class": FioReadOnlyTest,
68 },
69 {
70 "test_id": 3,
71 "fio_opts": { "rw": "randtrim", },
72 "readonly-pre": 1,
73 "success": SUCCESS_NONZERO,
74 "test_class": FioReadOnlyTest,
75 },
76 {
77 "test_id": 4,
78 "fio_opts": { "rw": "randread", },
79 "readonly-post": 1,
80 "success": SUCCESS_DEFAULT,
81 "test_class": FioReadOnlyTest,
82 },
83 {
84 "test_id": 5,
85 "fio_opts": { "rw": "randwrite", },
86 "readonly-post": 1,
87 "success": SUCCESS_NONZERO,
88 "test_class": FioReadOnlyTest,
89 },
90 {
91 "test_id": 6,
92 "fio_opts": { "rw": "randtrim", },
93 "readonly-post": 1,
94 "success": SUCCESS_NONZERO,
95 "test_class": FioReadOnlyTest,
96 },
97 {
98 "test_id": 7,
99 "fio_opts": { "rw": "randread", },
100 "success": SUCCESS_DEFAULT,
101 "test_class": FioReadOnlyTest,
102 },
103 {
104 "test_id": 8,
105 "fio_opts": { "rw": "randwrite", },
106 "success": SUCCESS_DEFAULT,
107 "test_class": FioReadOnlyTest,
108 },
109 {
110 "test_id": 9,
111 "fio_opts": { "rw": "randtrim", },
112 "success": SUCCESS_DEFAULT,
113 "test_class": FioReadOnlyTest,
114 },
115 ]
09a66e9e
VF
116
117
118def parse_args():
fef0c6fd
VF
119 """Parse command-line arguments."""
120
09a66e9e 121 parser = argparse.ArgumentParser()
fef0c6fd
VF
122 parser.add_argument('-f', '--fio', help='path to fio executable (e.g., ./fio)')
123 parser.add_argument('-a', '--artifact-root', help='artifact root directory')
124 parser.add_argument('-s', '--skip', nargs='+', type=int,
125 help='list of test(s) to skip')
126 parser.add_argument('-o', '--run-only', nargs='+', type=int,
127 help='list of test(s) to run, skipping all others')
09a66e9e
VF
128 args = parser.parse_args()
129
130 return args
131
132
fef0c6fd
VF
133def main():
134 """Run readonly tests."""
09a66e9e 135
09a66e9e
VF
136 args = parse_args()
137
09a66e9e 138 if args.fio:
fef0c6fd 139 fio_path = str(Path(args.fio).absolute())
09a66e9e
VF
140 else:
141 fio_path = 'fio'
fef0c6fd 142 print(f"fio path is {fio_path}")
09a66e9e 143
fef0c6fd
VF
144 artifact_root = args.artifact_root if args.artifact_root else \
145 f"readonly-test-{time.strftime('%Y%m%d-%H%M%S')}"
146 os.mkdir(artifact_root)
147 print(f"Artifact directory is {artifact_root}")
09a66e9e 148
fef0c6fd
VF
149 test_env = {
150 'fio_path': fio_path,
151 'fio_root': str(Path(__file__).absolute().parent.parent),
152 'artifact_root': artifact_root,
153 'basename': 'readonly',
154 }
09a66e9e 155
fef0c6fd 156 _, failed, _ = run_fio_tests(TEST_LIST, test_env, args)
09a66e9e 157 sys.exit(failed)
fef0c6fd
VF
158
159
160if __name__ == '__main__':
161 main()