I don't see anything obviously wrong but I don't have any idea what the test is actually trying to exercise.
How about some comments and is there a doc file in this test directory that needs updating? --joel On Mon, Mar 28, 2022 at 4:04 AM Matthew Joyce < matthew.jo...@embedded-brains.de> wrote: > From: Matt Joyce <matthew.jo...@embedded-brains.de> > > --- > testsuites/libtests/newlib01/init.c | 110 ++++++++++++++++++++++------ > 1 file changed, 88 insertions(+), 22 deletions(-) > > diff --git a/testsuites/libtests/newlib01/init.c > b/testsuites/libtests/newlib01/init.c > index c58154023b..bba187e8e2 100644 > --- a/testsuites/libtests/newlib01/init.c > +++ b/testsuites/libtests/newlib01/init.c > @@ -28,6 +28,8 @@ const char rtems_test_name[] = "NEWLIB 1"; > > static const char file_path[] = "/file"; > > +static const char file_path2[] = "/file2"; > + > typedef enum { > INIT, > OPEN, > @@ -39,6 +41,8 @@ typedef struct { > rtems_id main_task_id; > rtems_id worker_task_id; > test_state current; > + FILE *glob_file_stream; > + int glob_fd; > } test_context; > > static test_context test_instance; > @@ -59,7 +63,7 @@ static void wait(void) > rtems_test_assert(sc == RTEMS_SUCCESSFUL); > } > > -static void worker_task(rtems_task_argument arg) > +static void thread_specific_worker(rtems_task_argument arg) > { > test_context *ctx = &test_instance; > struct _reent *reent = _REENT; > @@ -90,6 +94,30 @@ static void worker_task(rtems_task_argument arg) > rtems_test_assert(0); > } > > +static void global_file_object_worker(rtems_task_argument arg) > +{ > + test_context *ctx = &test_instance; > + FILE *fp; > + char buf[1] = { 'y' }; > + size_t n; > + int fd; > + > + fp = ctx->glob_file_stream = fopen(&file_path2[0], "w"); > + rtems_test_assert(fp != NULL); > + > + /* Get file descriptor of new global file stream, store it in text > context */ > + fd = fileno(fp); > + rtems_test_assert(fd != -1); > + ctx->glob_fd = fd; > + > + n = fwrite(&buf[0], sizeof(buf), 1, fp); > + rtems_test_assert(n == 1); > + > + wake_up_main(ctx); > + > + rtems_test_assert(0); > +} > + > static int handler_open( > rtems_libio_t *iop, > const char *path, > @@ -250,9 +278,34 @@ static const IMFS_node_control node_control = > IMFS_GENERIC_INITIALIZER( > IMFS_node_destroy_default > ); > > -static void test_thread_specific_close(test_context *ctx) > +static void task_create_and_delete_helper( > + test_context *ctx, > + rtems_task_entry entry > +) > { > rtems_status_code sc; > + > + sc = rtems_task_create( > + rtems_build_name('W', 'O', 'R', 'K'), > + 2, > + RTEMS_MINIMUM_STACK_SIZE, > + RTEMS_DEFAULT_MODES, > + RTEMS_DEFAULT_ATTRIBUTES, > + &ctx->worker_task_id > + ); > + rtems_test_assert(sc == RTEMS_SUCCESSFUL); > + > + sc = rtems_task_start(ctx->worker_task_id, entry, 0); > + rtems_test_assert(sc == RTEMS_SUCCESSFUL); > + > + wait(); > + > + sc = rtems_task_delete(ctx->worker_task_id); > + rtems_test_assert(sc == RTEMS_SUCCESSFUL); > +} > + > +static void test_thread_specific_close(test_context *ctx) > +{ > int rv; > rtems_resource_snapshot snapshot; > > @@ -266,23 +319,7 @@ static void test_thread_specific_close(test_context > *ctx) > ); > rtems_test_assert(rv == 0); > > - sc = rtems_task_create( > - rtems_build_name('W', 'O', 'R', 'K'), > - 2, > - RTEMS_MINIMUM_STACK_SIZE, > - RTEMS_DEFAULT_MODES, > - RTEMS_DEFAULT_ATTRIBUTES, > - &ctx->worker_task_id > - ); > - rtems_test_assert(sc == RTEMS_SUCCESSFUL); > - > - sc = rtems_task_start(ctx->worker_task_id, worker_task, 0); > - rtems_test_assert(sc == RTEMS_SUCCESSFUL); > - > - wait(); > - > - sc = rtems_task_delete(ctx->worker_task_id); > - rtems_test_assert(sc == RTEMS_SUCCESSFUL); > + task_create_and_delete_helper(ctx, thread_specific_worker); > > rv = unlink(&file_path[0]); > rtems_test_assert(rv == 0); > @@ -290,6 +327,11 @@ static void test_thread_specific_close(test_context > *ctx) > rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); > } > > +static void test_global_file_object_close(test_context *ctx) > +{ > + task_create_and_delete_helper(ctx, global_file_object_worker); > +} > + > /* > * This exit handler will be called last among the functions registered > with > * atexit(). Check that stdio file descriptors are closed. The Newlib > cleanup > @@ -298,6 +340,7 @@ static void test_thread_specific_close(test_context > *ctx) > */ > static void check_after_libio_exit(void) > { > + test_context *ctx = &test_instance; > struct stat unused; > int rv; > > @@ -319,6 +362,11 @@ static void check_after_libio_exit(void) > rtems_test_assert(stdin->_flags != 0); > rtems_test_assert(stdout->_flags != 0); > rtems_test_assert(stderr->_flags != 0); > + > + /* Global file tests. Global fd still open at this point. */ > + rv = fstat(ctx->glob_fd, &unused); > + rtems_test_assert(rv == 0); > + rtems_test_assert(ctx->glob_file_stream->_flags != 0); > } > > static void register_exit_handler_before_libio_exit(void) > @@ -342,7 +390,7 @@ > RTEMS_SYSINIT_ITEM(register_exit_handler_before_libio_exit, > * cleanup procedures have been called. Therefore, stdio file descriptors > * should be open and stdio FILE object flags should be non-zero. > */ > -static void test_exit_handling(void) > +static void test_exit_handling(test_context *ctx) > { > struct stat unused; > int rv; > @@ -360,6 +408,14 @@ static void test_exit_handling(void) > rtems_test_assert(stdout->_flags != 0); > rtems_test_assert(stderr->_flags != 0); > > + /* > + * Global file descriptor should still be open; global FILE object flags > + * should still be non-zero. > + */ > + rv = fstat(ctx->glob_fd, &unused); > + rtems_test_assert(rv == 0); > + rtems_test_assert(ctx->glob_file_stream->_flags != 0); > + > /* Run exit handlers and Newlib cleanup procedures */ > exit(0); > } > @@ -380,7 +436,8 @@ static void Init(rtems_task_argument arg) > rtems_test_assert(rv == 0); > > test_thread_specific_close(ctx); > - test_exit_handling(); > + test_global_file_object_close(ctx); > + test_exit_handling(ctx); > } > > static void fatal_extension( > @@ -400,6 +457,7 @@ static void fatal_extension( > */ > struct stat unused; > int rv; > + test_context *ctx = &test_instance; > > errno = 0; > rv = fstat(0, &unused); > @@ -419,6 +477,14 @@ static void fatal_extension( > rtems_test_assert(stdin->_flags == 0); > rtems_test_assert(stdout->_flags == 0); > rtems_test_assert(stderr->_flags == 0); > + > + /* Global file tests */ > + errno = 0; > + rv = fstat(ctx->glob_fd, &unused); > + rtems_test_assert(rv == -1); > + rtems_test_assert(errno == EBADF); > + rtems_test_assert(ctx->glob_file_stream->_flags == 0); > + > TEST_END(); > } > } > @@ -426,7 +492,7 @@ static void fatal_extension( > #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER > #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER > > -#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4 > +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 5 > > #define CONFIGURE_MAXIMUM_TASKS 2 > > -- > 2.31.1 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel