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