aboutsummaryrefslogtreecommitdiff
path: root/test/py
diff options
context:
space:
mode:
authorJohn Levon <john.levon@nutanix.com>2021-05-25 14:51:02 +0100
committerGitHub <noreply@github.com>2021-05-25 14:51:02 +0100
commit6e8ffd28978f068741122f7894780f614e85ff12 (patch)
treefceea7c7de512b031e6a25ccc60a5d3d5f8cc325 /test/py
parent405f2ffc3125d44c7fde31fe2bb9b312746eb4e1 (diff)
downloadlibvfio-user-6e8ffd28978f068741122f7894780f614e85ff12.zip
libvfio-user-6e8ffd28978f068741122f7894780f614e85ff12.tar.gz
libvfio-user-6e8ffd28978f068741122f7894780f614e85ff12.tar.bz2
python tests: add vfu_irq_trigger() (#475)
Signed-off-by: John Levon <john.levon@nutanix.com> Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'test/py')
-rw-r--r--test/py/libvfio_user.py6
-rw-r--r--test/py/test_irq_trigger.py86
2 files changed, 92 insertions, 0 deletions
diff --git a/test/py/libvfio_user.py b/test/py/libvfio_user.py
index d53740a..faebf03 100644
--- a/test/py/libvfio_user.py
+++ b/test/py/libvfio_user.py
@@ -253,6 +253,7 @@ lib.vfu_pci_find_capability.restype = (c.c_ulong)
lib.vfu_pci_find_next_capability.argtypes = (c.c_void_p, c.c_bool, c.c_ulong,
c.c_int)
lib.vfu_pci_find_next_capability.restype = (c.c_ulong)
+lib.vfu_irq_trigger.argtypes = (c.c_void_p, c.c_uint)
def to_byte(val):
@@ -493,3 +494,8 @@ def vfu_pci_find_next_capability(ctx, extended, offset, cap_id):
assert ctx != None
return lib.vfu_pci_find_next_capability(ctx, extended, offset, cap_id)
+
+def vfu_irq_trigger(ctx, subindex):
+ assert ctx != None
+
+ return lib.vfu_irq_trigger(ctx, subindex)
diff --git a/test/py/test_irq_trigger.py b/test/py/test_irq_trigger.py
new file mode 100644
index 0000000..422eb3e
--- /dev/null
+++ b/test/py/test_irq_trigger.py
@@ -0,0 +1,86 @@
+#
+# Copyright (c) 2021 Nutanix Inc. All rights reserved.
+#
+# Authors: John Levon <john.levon@nutanix.com>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Nutanix nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+
+from libvfio_user import *
+import ctypes as c
+import errno
+
+ctx = None
+sock = None
+
+def test_irq_trigger_setup():
+ global ctx, sock
+
+ ctx = vfu_create_ctx(flags=LIBVFIO_USER_FLAG_ATTACH_NB)
+ assert ctx != None
+
+ ret = vfu_pci_init(ctx)
+ assert ret == 0
+
+ ret = vfu_setup_device_nr_irqs(ctx, VFU_DEV_MSIX_IRQ, 2048)
+ assert ret == 0
+
+ ret = vfu_realize_ctx(ctx)
+ assert ret == 0
+
+ sock = connect_client(ctx)
+
+def test_irq_trigger_bad_subindex():
+ ret = vfu_irq_trigger(ctx, 2048)
+ assert ret == -1
+ assert c.get_errno() == errno.EINVAL
+
+ ret = vfu_irq_trigger(ctx, 2049)
+ assert ret == -1
+ assert c.get_errno() == errno.EINVAL
+
+def test_irq_trigger_no_interrupt():
+ ret = vfu_irq_trigger(ctx, 0)
+ assert ret == -1
+ assert c.get_errno() == errno.ENOENT
+
+def test_irq_trigger():
+ # struct vfio_irq_set
+ payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER |
+ VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 8, 1)
+
+ fd = eventfd(initval=4)
+
+ hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload))
+ sock.sendmsg([hdr + payload], [(socket.SOL_SOCKET, socket.SCM_RIGHTS,
+ struct.pack("I", fd))])
+ vfu_run_ctx(ctx)
+ get_reply(sock)
+
+ ret = vfu_irq_trigger(ctx, 8)
+
+ assert struct.unpack("Q", os.read(fd, 8))[0] == 5
+
+def test_irq_trigger_cleanup():
+ vfu_destroy_ctx(ctx)