Skip to content

Commit 989ae9f

Browse files
committed
Merge branch 'storage-perf'
* storage-perf: tests: add simple storage performance tests
2 parents bd22d44 + 6bcfcc8 commit 989ae9f

File tree

4 files changed

+402
-0
lines changed

4 files changed

+402
-0
lines changed

qubes/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ def load_tests(loader, tests, pattern): # pylint: disable=unused-argument
18291829
"qubes.tests.integ.devices_pci",
18301830
"qubes.tests.integ.qrexec",
18311831
"qubes.tests.integ.qrexec_perf",
1832+
"qubes.tests.integ.storage_perf",
18321833
"qubes.tests.integ.dom0_update",
18331834
"qubes.tests.integ.vm_update",
18341835
"qubes.tests.integ.network",

qubes/tests/integ/storage_perf.py

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
#
2+
# The Qubes OS Project, https://www.qubes-os.org/
3+
#
4+
# Copyright (C) 2025 Marek Marczykowski-Górecki
5+
6+
#
7+
# This program is free software; you can redistribute it and/or modify
8+
# it under the terms of the GNU Lesser General Public License as published by
9+
# the Free Software Foundation; either version 2.1 of the License, or
10+
# (at your option) any later version.
11+
#
12+
# This program is distributed in the hope that it will be useful,
13+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
# GNU Lesser General Public License for more details.
16+
#
17+
# You should have received a copy of the GNU Lesser General Public License along
18+
# with this program; if not, see <http://www.gnu.org/licenses/>.
19+
20+
import asyncio
21+
import os
22+
import subprocess
23+
import sys
24+
import time
25+
26+
import qubes.tests
27+
28+
test_script = "/usr/lib/qubes/tests/storage_perf.py"
29+
30+
31+
class StoragePerfBase(qubes.tests.SystemTestCase):
32+
def setUp(self):
33+
super().setUp()
34+
self.vm = self.app.domains[0]
35+
36+
def run_test(self, volume, name):
37+
cmd = [
38+
test_script,
39+
f"--volume={volume}",
40+
f"--vm={self.vm.name}",
41+
name,
42+
]
43+
p = self.loop.run_until_complete(asyncio.create_subprocess_exec(*cmd))
44+
self.loop.run_until_complete(p.wait())
45+
if p.returncode:
46+
self.fail(f"'{' '.join(cmd)}' failed: {p.returncode}")
47+
48+
49+
class TC_00_StoragePerfDom0(StoragePerfBase):
50+
def test_000_root_seq1m_q8t1_read(self):
51+
self.run_test("root", "seq1m_q8t1_read")
52+
53+
def test_001_root_seq1m_q8t1_write(self):
54+
self.run_test("root", "seq1m_q8t1_write")
55+
56+
def test_003_root_seq1m_q1t1_read(self):
57+
self.run_test("root", "seq1m_q1t1_read")
58+
59+
def test_004_root_seq1m_q1t1_write(self):
60+
self.run_test("root", "seq1m_q1t1_write")
61+
62+
def test_005_root_rnd4k_q32t1_read(self):
63+
self.run_test("root", "rnd4k_q32t1_read")
64+
65+
def test_005_root_rnd4k_q32t1_write(self):
66+
self.run_test("root", "rnd4k_q32t1_write")
67+
68+
def test_006_root_rnd4k_q1t1_read(self):
69+
self.run_test("root", "rnd4k_q1t1_read")
70+
71+
def test_007_root_rnd4k_q1t1_write(self):
72+
self.run_test("root", "rnd4k_q1t1_write")
73+
74+
def test_010_varlibqubes_seq1m_q8t1_read(self):
75+
self.run_test("varlibqubes", "seq1m_q8t1_read")
76+
77+
def test_011_varlibqubes_seq1m_q8t1_write(self):
78+
self.run_test("varlibqubes", "seq1m_q8t1_write")
79+
80+
def test_013_varlibqubes_seq1m_q1t1_read(self):
81+
self.run_test("varlibqubes", "seq1m_q1t1_read")
82+
83+
def test_014_varlibqubes_seq1m_q1t1_write(self):
84+
self.run_test("varlibqubes", "seq1m_q1t1_write")
85+
86+
def test_015_varlibqubes_rnd4k_q32t1_read(self):
87+
self.run_test("varlibqubes", "rnd4k_q32t1_read")
88+
89+
def test_015_varlibqubes_rnd4k_q32t1_write(self):
90+
self.run_test("varlibqubes", "rnd4k_q32t1_write")
91+
92+
def test_016_varlibqubes_rnd4k_q1t1_read(self):
93+
self.run_test("varlibqubes", "rnd4k_q1t1_read")
94+
95+
def test_017_varlibqubes_rnd4k_q1t1_write(self):
96+
self.run_test("varlibqubes", "rnd4k_q1t1_write")
97+
98+
99+
class TC_10_StoragePerfVM(StoragePerfBase):
100+
def setUp(self):
101+
super().setUp()
102+
self.vm = self.app.add_new_vm(
103+
"AppVM",
104+
name=self.make_vm_name("vm1"),
105+
label="red",
106+
)
107+
self.loop.run_until_complete(
108+
self.vm.create_on_disk(),
109+
)
110+
self.loop.run_until_complete(
111+
self.vm.start(),
112+
)
113+
114+
def test_000_root_seq1m_q8t1_read(self):
115+
self.run_test("root", "seq1m_q8t1_read")
116+
117+
def test_001_root_seq1m_q8t1_write(self):
118+
self.run_test("root", "seq1m_q8t1_write")
119+
120+
def test_002_root_seq1m_q1t1_read(self):
121+
self.run_test("root", "seq1m_q1t1_read")
122+
123+
def test_003_root_seq1m_q1t1_write(self):
124+
self.run_test("root", "seq1m_q1t1_write")
125+
126+
def test_004_root_rnd4k_q32t1_read(self):
127+
self.run_test("root", "rnd4k_q32t1_read")
128+
129+
def test_005_root_rnd4k_q32t1_write(self):
130+
self.run_test("root", "rnd4k_q32t1_write")
131+
132+
def test_006_root_rnd4k_q1t1_read(self):
133+
self.run_test("root", "rnd4k_q1t1_read")
134+
135+
def test_007_root_rnd4k_q1t1_write(self):
136+
self.run_test("root", "rnd4k_q1t1_write")
137+
138+
def test_010_private_seq1m_q8t1_read(self):
139+
self.run_test("private", "seq1m_q8t1_read")
140+
141+
def test_011_private_seq1m_q8t1_write(self):
142+
self.run_test("private", "seq1m_q8t1_write")
143+
144+
def test_012_private_seq1m_q1t1_read(self):
145+
self.run_test("private", "seq1m_q1t1_read")
146+
147+
def test_013_private_seq1m_q1t1_write(self):
148+
self.run_test("private", "seq1m_q1t1_write")
149+
150+
def test_014_private_rnd4k_q32t1_read(self):
151+
self.run_test("private", "rnd4k_q32t1_read")
152+
153+
def test_015_private_rnd4k_q32t1_write(self):
154+
self.run_test("private", "rnd4k_q32t1_write")
155+
156+
def test_016_private_rnd4k_q1t1_read(self):
157+
self.run_test("private", "rnd4k_q1t1_read")
158+
159+
def test_017_private_rnd4k_q1t1_write(self):
160+
self.run_test("private", "rnd4k_q1t1_write")
161+
162+
def test_020_volatile_seq1m_q8t1_read(self):
163+
self.run_test("volatile", "seq1m_q8t1_read")
164+
165+
def test_021_volatile_seq1m_q8t1_write(self):
166+
self.run_test("volatile", "seq1m_q8t1_write")
167+
168+
def test_022_volatile_seq1m_q1t1_read(self):
169+
self.run_test("volatile", "seq1m_q1t1_read")
170+
171+
def test_023_volatile_seq1m_q1t1_write(self):
172+
self.run_test("volatile", "seq1m_q1t1_write")
173+
174+
def test_024_volatile_rnd4k_q32t1_read(self):
175+
self.run_test("volatile", "rnd4k_q32t1_read")
176+
177+
def test_025_volatile_rnd4k_q32t1_write(self):
178+
self.run_test("volatile", "rnd4k_q32t1_write")
179+
180+
def test_026_volatile_rnd4k_q1t1_read(self):
181+
self.run_test("volatile", "rnd4k_q1t1_read")
182+
183+
def test_027_volatile_rnd4k_q1t1_write(self):
184+
self.run_test("volatile", "rnd4k_q1t1_write")

rpm_spec/core-dom0.spec.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ done
528528
%{python3_sitelib}/qubes/tests/integ/qrexec.py
529529
%{python3_sitelib}/qubes/tests/integ/qrexec_perf.py
530530
%{python3_sitelib}/qubes/tests/integ/storage.py
531+
%{python3_sitelib}/qubes/tests/integ/storage_perf.py
531532
%{python3_sitelib}/qubes/tests/integ/vm_qrexec_gui.py
532533

533534
%dir %{python3_sitelib}/qubes/tests/integ/tools
@@ -549,6 +550,7 @@ done
549550
/usr/lib/qubes/fix-dir-perms.sh
550551
/usr/lib/qubes/startup-misc.sh
551552
/usr/lib/qubes/tests/qrexec_perf.py
553+
/usr/lib/qubes/tests/storage_perf.py
552554
%{_unitdir}/[email protected]/30_qubes.conf
553555
%{_unitdir}/qubes-core.service
554556
%{_unitdir}/qubes-qmemman.service

0 commit comments

Comments
 (0)