diff --git a/components/vfs/test/test_vfs_eventfd.c b/components/vfs/test/test_vfs_eventfd.c index 906bdecd1c..d250b7c33b 100644 --- a/components/vfs/test/test_vfs_eventfd.c +++ b/components/vfs/test/test_vfs_eventfd.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -349,3 +349,51 @@ TEST_CASE("eventfd multiple selects", "[vfs][eventfd]") TEST_ASSERT_EQUAL(0, close(fd)); TEST_ESP_OK(esp_vfs_eventfd_unregister()); } + +typedef struct { + QueueHandle_t queue; + int fd; +} select_block_task_args_t; + +static void select_block_task(void *arg) +{ + select_block_task_args_t *select_arg = (select_block_task_args_t *)arg; + int fd = select_arg->fd; + fd_set read_fds; + + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + + int val = select(fd + 1, &read_fds, NULL, NULL, NULL); + assert(val == 1); + bool is_selected = true; + xQueueSend(select_arg->queue, &is_selected, 0); + vTaskDelete(NULL); +} + +TEST_CASE("eventfd select block", "[vfs][eventfd]") +{ + esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT(); + TEST_ESP_OK(esp_vfs_eventfd_register(&config)); + + select_block_task_args_t args; + args.fd = eventfd(0, 0); + TEST_ASSERT_GREATER_OR_EQUAL(0, args.fd); + args.queue = xQueueCreate(1, sizeof(bool)); + + int fd_write = eventfd(0, 0); + TEST_ASSERT_GREATER_OR_EQUAL(0, fd_write); + + xTaskCreate(select_block_task, "select_block_task", 2048, &args, 5, NULL); + + bool is_selected = false; + uint64_t val = 1; + TEST_ASSERT_EQUAL(sizeof(val), write(fd_write, &val, sizeof(val))); + TEST_ASSERT(!xQueueReceive(args.queue, &is_selected, pdMS_TO_TICKS(2000))); + TEST_ASSERT_EQUAL(sizeof(val), write(args.fd, &val, sizeof(val))); + TEST_ASSERT(xQueueReceive(args.queue, &is_selected, pdMS_TO_TICKS(1000))); + TEST_ASSERT_EQUAL(true, is_selected); + TEST_ASSERT_EQUAL(0, close(args.fd)); + TEST_ASSERT_EQUAL(0, close(fd_write)); + TEST_ESP_OK(esp_vfs_eventfd_unregister()); +}