1*faefdba8SAlbert Esteve /* 2*faefdba8SAlbert Esteve * QEMU tests for shared dma-buf API 3*faefdba8SAlbert Esteve * 4*faefdba8SAlbert Esteve * Copyright (c) 2023 Red Hat, Inc. 5*faefdba8SAlbert Esteve * 6*faefdba8SAlbert Esteve * This library is free software; you can redistribute it and/or 7*faefdba8SAlbert Esteve * modify it under the terms of the GNU Lesser General Public 8*faefdba8SAlbert Esteve * License as published by the Free Software Foundation; either 9*faefdba8SAlbert Esteve * version 2.1 of the License, or (at your option) any later version. 10*faefdba8SAlbert Esteve * 11*faefdba8SAlbert Esteve * This library is distributed in the hope that it will be useful, 12*faefdba8SAlbert Esteve * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*faefdba8SAlbert Esteve * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*faefdba8SAlbert Esteve * Lesser General Public License for more details. 15*faefdba8SAlbert Esteve * 16*faefdba8SAlbert Esteve * You should have received a copy of the GNU Lesser General Public 17*faefdba8SAlbert Esteve * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18*faefdba8SAlbert Esteve * 19*faefdba8SAlbert Esteve */ 20*faefdba8SAlbert Esteve 21*faefdba8SAlbert Esteve #include "qemu/osdep.h" 22*faefdba8SAlbert Esteve #include "hw/virtio/virtio-dmabuf.h" 23*faefdba8SAlbert Esteve 24*faefdba8SAlbert Esteve 25*faefdba8SAlbert Esteve static void test_add_remove_resources(void) 26*faefdba8SAlbert Esteve { 27*faefdba8SAlbert Esteve QemuUUID uuid; 28*faefdba8SAlbert Esteve int i, dmabuf_fd; 29*faefdba8SAlbert Esteve 30*faefdba8SAlbert Esteve for (i = 0; i < 100; ++i) { 31*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid); 32*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500); 33*faefdba8SAlbert Esteve /* Add a new resource */ 34*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd)); 35*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd); 36*faefdba8SAlbert Esteve /* Remove the resource */ 37*faefdba8SAlbert Esteve g_assert(virtio_remove_resource(&uuid)); 38*faefdba8SAlbert Esteve /* Resource is not found anymore */ 39*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1); 40*faefdba8SAlbert Esteve } 41*faefdba8SAlbert Esteve } 42*faefdba8SAlbert Esteve 43*faefdba8SAlbert Esteve static void test_add_remove_dev(void) 44*faefdba8SAlbert Esteve { 45*faefdba8SAlbert Esteve QemuUUID uuid; 46*faefdba8SAlbert Esteve struct vhost_dev *dev = g_new0(struct vhost_dev, 1); 47*faefdba8SAlbert Esteve int i; 48*faefdba8SAlbert Esteve 49*faefdba8SAlbert Esteve for (i = 0; i < 100; ++i) { 50*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid); 51*faefdba8SAlbert Esteve virtio_add_vhost_device(&uuid, dev); 52*faefdba8SAlbert Esteve /* vhost device is found */ 53*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) != NULL); 54*faefdba8SAlbert Esteve /* Remove the vhost device */ 55*faefdba8SAlbert Esteve g_assert(virtio_remove_resource(&uuid)); 56*faefdba8SAlbert Esteve /* vhost device is not found anymore */ 57*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) == NULL); 58*faefdba8SAlbert Esteve } 59*faefdba8SAlbert Esteve g_free(dev); 60*faefdba8SAlbert Esteve } 61*faefdba8SAlbert Esteve 62*faefdba8SAlbert Esteve static void test_remove_invalid_resource(void) 63*faefdba8SAlbert Esteve { 64*faefdba8SAlbert Esteve QemuUUID uuid; 65*faefdba8SAlbert Esteve int i; 66*faefdba8SAlbert Esteve 67*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) { 68*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid); 69*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1); 70*faefdba8SAlbert Esteve /* Removing a resource that does not exist returns false */ 71*faefdba8SAlbert Esteve g_assert_false(virtio_remove_resource(&uuid)); 72*faefdba8SAlbert Esteve } 73*faefdba8SAlbert Esteve } 74*faefdba8SAlbert Esteve 75*faefdba8SAlbert Esteve static void test_add_invalid_resource(void) 76*faefdba8SAlbert Esteve { 77*faefdba8SAlbert Esteve QemuUUID uuid; 78*faefdba8SAlbert Esteve struct vhost_dev *dev = NULL; 79*faefdba8SAlbert Esteve int i, dmabuf_fd = -2, alt_dmabuf = 2; 80*faefdba8SAlbert Esteve 81*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) { 82*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid); 83*faefdba8SAlbert Esteve /* Add a new resource with invalid (negative) resource fd */ 84*faefdba8SAlbert Esteve g_assert_false(virtio_add_dmabuf(&uuid, dmabuf_fd)); 85*faefdba8SAlbert Esteve /* Resource is not found */ 86*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1); 87*faefdba8SAlbert Esteve /* Add a new vhost device with invalid (NULL) pointer */ 88*faefdba8SAlbert Esteve g_assert_false(virtio_add_vhost_device(&uuid, dev)); 89*faefdba8SAlbert Esteve /* vhost device is not found */ 90*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) == NULL); 91*faefdba8SAlbert Esteve } 92*faefdba8SAlbert Esteve 93*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) { 94*faefdba8SAlbert Esteve /* Add a valid resource */ 95*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid); 96*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500); 97*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd)); 98*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd); 99*faefdba8SAlbert Esteve /* Add a new resource with repeated uuid returns false */ 100*faefdba8SAlbert Esteve g_assert_false(virtio_add_dmabuf(&uuid, alt_dmabuf)); 101*faefdba8SAlbert Esteve /* The value for the uuid key is not replaced */ 102*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd); 103*faefdba8SAlbert Esteve } 104*faefdba8SAlbert Esteve } 105*faefdba8SAlbert Esteve 106*faefdba8SAlbert Esteve static void test_free_resources(void) 107*faefdba8SAlbert Esteve { 108*faefdba8SAlbert Esteve QemuUUID uuids[20]; 109*faefdba8SAlbert Esteve int i, dmabuf_fd; 110*faefdba8SAlbert Esteve 111*faefdba8SAlbert Esteve for (i = 0; i < ARRAY_SIZE(uuids); ++i) { 112*faefdba8SAlbert Esteve qemu_uuid_generate(&uuids[i]); 113*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500); 114*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuids[i], dmabuf_fd)); 115*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, dmabuf_fd); 116*faefdba8SAlbert Esteve } 117*faefdba8SAlbert Esteve virtio_free_resources(); 118*faefdba8SAlbert Esteve for (i = 0; i < ARRAY_SIZE(uuids); ++i) { 119*faefdba8SAlbert Esteve /* None of the resources is found after free'd */ 120*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, -1); 121*faefdba8SAlbert Esteve } 122*faefdba8SAlbert Esteve 123*faefdba8SAlbert Esteve } 124*faefdba8SAlbert Esteve 125*faefdba8SAlbert Esteve int main(int argc, char **argv) 126*faefdba8SAlbert Esteve { 127*faefdba8SAlbert Esteve g_test_init(&argc, &argv, NULL); 128*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_rm_res", test_add_remove_resources); 129*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_rm_dev", test_add_remove_dev); 130*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/rm_invalid_res", 131*faefdba8SAlbert Esteve test_remove_invalid_resource); 132*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_invalid_res", 133*faefdba8SAlbert Esteve test_add_invalid_resource); 134*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/free_res", test_free_resources); 135*faefdba8SAlbert Esteve 136*faefdba8SAlbert Esteve return g_test_run(); 137*faefdba8SAlbert Esteve } 138