[Sheepdog] [PATCH] tests: add qemu-io testcases.

chenbaozi at gmail.com chenbaozi at gmail.com
Mon Nov 14 08:45:54 CET 2011


From: CHEN Baozi <chenbaozi.pt at taobao.com>

Signed-off-by: CHEN Baozi <chenbaozi.pt at taobao.com>
---
 tests/qemu_io_testcases.py |  182 ++++++++++++++++++++++++++++++++++++++++++++
 tests/test_qemu_io.py      |   84 ++++++++++++++++++++
 2 files changed, 266 insertions(+), 0 deletions(-)
 create mode 100644 tests/qemu_io_testcases.py
 create mode 100644 tests/test_qemu_io.py

diff --git a/tests/qemu_io_testcases.py b/tests/qemu_io_testcases.py
new file mode 100644
index 0000000..d9e8fc2
--- /dev/null
+++ b/tests/qemu_io_testcases.py
@@ -0,0 +1,182 @@
+# Copyright (c) 2011 Taobao.com, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Based on code from the QEMU I/O test suite (qemu-iotests)
+#   Copyright (C) 2009 Red Hat, Inc.
+#
+
+# Brief description of each test cases.
+cases_desc = {
+"001": "Test simple read/write using plain bdrv_read/bdrv_write.",
+"002": "Test simple read/write using plain bdrv_pread/bdrv_pwrite.",
+"003": "Test simple read/write using bdrv_aio_readv/bdrv_aio_writev.",
+"004": "Make sure we can't read and write outside of the image size.",
+"008": "Test simple asynchronous read/write operations.",
+"011": "Test for AIO allocation on the same cluster.",
+"016": "Test I/O after EOF for growable images.",
+"025": "Resizing images.",
+}
+
+# Used by test_io() method.
+io_cases = {
+"001":[
+("read 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write -P 0xa 0 128M", """wrote 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -P 0xa 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+"002":[
+("read -p 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write -pP 0xa 0 128M", """wrote 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -pP 0xa 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write -pP 0xab 66 42", """wrote 42/42 bytes at offset 66
+42.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -pP 0xab 66 42", """read 42/42 bytes at offset 66
+42.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+"003":[
+("readv 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("writev -P 0xa 0 128M", """wrote 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("readv -P 0xa 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("writev -P 0xb 67M 8k 8k 8k 8k 8k 8k 8k",
+"""wrote 57344/57344 bytes at offset 70254592
+56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("readv -P 0xb 67M 8k 8k 8k 8k 8k 8k 8k",
+"""read 57344/57344 bytes at offset 70254592
+56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+"004":[
+("write 127M 1M", """wrote 1048576/1048576 bytes at offset 133169152
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write 127M 4M", """write failed: Input/output error"""),
+("write 128M 4096", """write failed: Input/output error"""),
+("write 140M 4096", """write failed: Input/output error"""),
+("write -p 140M 4096", """write failed: Input/output error"""),
+("writev 140M 4096","""writev failed: Input/output error"""),
+("read 127M 1M", """read 1048576/1048576 bytes at offset 133169152
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read 127M 4M", """read failed: Input/output error"""),
+("read 128M 4096", """read failed: Input/output error"""),
+("read 140M 4096", """read failed: Input/output error"""),
+("read -p 140M 4096", """read failed: Input/output error"""),
+("readv 140M 4096", """readv failed: Input/output error"""),
+],
+"008":[
+("aio_read 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("aio_write -P 0xa 0 128M", """wrote 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("aio_read -P 0xa 0 128M", """read 134217728/134217728 bytes at offset 0
+128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+"025":[
+("length", """128 MiB"""),
+("truncate 384M", """"""),
+("length", """384 MiB"""),
+],
+}
+
+# Used by test_growable_io() method.
+io_cases_g = {
+"016":[
+("read -P 0 128M 512", """read 512/512 bytes at offset 134217728
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -P 0 256M 512", """read 512/512 bytes at offset 268435456
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write -P 66 128M 512", """wrote 512/512 bytes at offset 134217728
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -P 66 128M 512", """read 512/512 bytes at offset 134217728
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("write -P 66 256M 512", """wrote 512/512 bytes at offset 268435456
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("read -P 66 256M 512", """read 512/512 bytes at offset 268435456
+512.000000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+}
+
+# Used by test_aio()
+aio_cases = {
+"011":[
+("""aio_write 1M 1M
+aio_write 1536K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 2M 1M
+aio_write 2560K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 3M 1M
+aio_write 3584K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 4M 1M
+aio_write 4608K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 5M 1M
+aio_write 5632K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 6M 1M
+aio_write 6656K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 7M 1M
+aio_write 7680K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 8M 1M
+aio_write 8704K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 9M 1M
+aio_write 9728K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+("""aio_write 10M 1M
+aio_write 10752K 1M""", """wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset XXX
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)"""),
+],
+}
+
+# Used to specify the image size of each test case.
+size_cases = {
+"001":128*1024*1024,
+"002":128*1024*1024,
+"003":128*1024*1024,
+"004":128*1024*1024,
+"008":128*1024*1024,
+"011":6*1024*1024*1024,
+"016":128*1024*1024,
+"025":128*1024*1024,
+}
diff --git a/tests/test_qemu_io.py b/tests/test_qemu_io.py
new file mode 100644
index 0000000..2ba951a
--- /dev/null
+++ b/tests/test_qemu_io.py
@@ -0,0 +1,84 @@
+from sheepdog_test import *
+from qemu_io_testcases import *
+import time
+
+def test_io():
+
+    cmd = ["qemu-io"]
+    sdog = Sheepdog()
+
+    for n in sdog.nodes:
+        n.start()
+        n.wait()
+
+    p = sdog.format()
+    p.wait()
+
+    for i in io_cases:
+        vdi = sdog.create_vdi(str(i), size_cases[i])
+        vdi.wait()
+        time.sleep(1)
+        vm = n.create_vm(vdi)
+        for j in io_cases[i]:
+            (out, err) = vm.test_io(cmd, j[0] + "\n")
+            assert out == j[1]
+            time.sleep(1)
+        print "Pass"
+        vdi.destroy()
+        vdi.wait()
+
+    p = sdog.format()
+    p.wait()
+    for n in sdog.nodes:
+        n.stop()
+
+def test_aio():
+
+    cmd = ["qemu-io"]
+    sdog = Sheepdog()
+
+    for n in sdog.nodes:
+        n.start()
+        n.wait()
+
+    p = sdog.format()
+    p.wait()
+
+    for i in aio_cases:
+        vdi = sdog.create_vdi(str(i), size_cases[i])
+        vdi.wait()
+        time.sleep(1)
+        vm = n.create_vm(vdi)
+        for j in aio_cases[i]:
+            (out, err) = vm.test_io(cmd, j[0] + "\n", async=True)
+            assert out == j[1]
+            time.sleep(1)
+        print "Pass"
+        vdi.destroy()
+        vdi.wait()
+
+def test_growable_io():
+
+    cmd = ["qemu-io", "-g"]
+    sdog = Sheepdog()
+
+    for n in sdog.nodes:
+        n.start()
+        n.wait()
+
+    p = sdog.format()
+    p.wait()
+
+    for i in io_cases_g:
+        vdi = sdog.create_vdi(str(i), size_cases[i])
+        vdi.wait()
+        time.sleep(1)
+        vm = n.create_vm(vdi)
+        for j in io_cases_g[i]:
+            (out, err) = vm.test_io(cmd, j[0] + "\n")
+            assert out == j[1]
+            time.sleep(1)
+        print "Pass"
+        vdi.destroy()
+        vdi.wait()
+
-- 
1.7.6.4




More information about the sheepdog mailing list