forked from Imagelibrary/rtems
libtests/newlib01: New test
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
ACLOCAL_AMFLAGS = -I ../aclocal
|
ACLOCAL_AMFLAGS = -I ../aclocal
|
||||||
|
|
||||||
SUBDIRS = POSIX
|
SUBDIRS = POSIX
|
||||||
|
SUBDIRS += newlib01
|
||||||
SUBDIRS += block17
|
SUBDIRS += block17
|
||||||
SUBDIRS += exit02
|
SUBDIRS += exit02
|
||||||
SUBDIRS += exit01
|
SUBDIRS += exit01
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ AM_CONDITIONAL(HAS_POSIX,test x"${rtems_cv_RTEMS_POSIX_API}" = x"yes")
|
|||||||
|
|
||||||
# Explicitly list all Makefiles here
|
# Explicitly list all Makefiles here
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
|
newlib01/Makefile
|
||||||
block17/Makefile
|
block17/Makefile
|
||||||
exit02/Makefile
|
exit02/Makefile
|
||||||
exit01/Makefile
|
exit01/Makefile
|
||||||
|
|||||||
19
testsuites/libtests/newlib01/Makefile.am
Normal file
19
testsuites/libtests/newlib01/Makefile.am
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
rtems_tests_PROGRAMS = newlib01
|
||||||
|
newlib01_SOURCES = init.c
|
||||||
|
|
||||||
|
dist_rtems_tests_DATA = newlib01.scn newlib01.doc
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
|
||||||
|
include $(top_srcdir)/../automake/compile.am
|
||||||
|
include $(top_srcdir)/../automake/leaf.am
|
||||||
|
|
||||||
|
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
|
||||||
|
|
||||||
|
LINK_OBJS = $(newlib01_OBJECTS)
|
||||||
|
LINK_LIBS = $(newlib01_LDLIBS)
|
||||||
|
|
||||||
|
newlib01$(EXEEXT): $(newlib01_OBJECTS) $(newlib01_DEPENDENCIES)
|
||||||
|
@rm -f newlib01$(EXEEXT)
|
||||||
|
$(make-exe)
|
||||||
|
|
||||||
|
include $(top_srcdir)/../automake/local.am
|
||||||
311
testsuites/libtests/newlib01/init.c
Normal file
311
testsuites/libtests/newlib01/init.c
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Dornierstr. 4
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.org/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/imfs.h>
|
||||||
|
#include <rtems/libcsupport.h>
|
||||||
|
|
||||||
|
#include "tmacros.h"
|
||||||
|
|
||||||
|
const char rtems_test_name[] = "NEWLIB 1";
|
||||||
|
|
||||||
|
static const char file_path[] = "/file";
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
INIT,
|
||||||
|
OPEN,
|
||||||
|
WRITTEN,
|
||||||
|
CLOSED
|
||||||
|
} test_state;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
rtems_id main_task_id;
|
||||||
|
rtems_id worker_task_id;
|
||||||
|
test_state current;
|
||||||
|
} test_context;
|
||||||
|
|
||||||
|
static test_context test_instance;
|
||||||
|
|
||||||
|
static void wake_up_main(const test_context *ctx)
|
||||||
|
{
|
||||||
|
rtems_status_code sc;
|
||||||
|
|
||||||
|
sc = rtems_event_transient_send(ctx->main_task_id);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wait(void)
|
||||||
|
{
|
||||||
|
rtems_status_code sc;
|
||||||
|
|
||||||
|
sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void worker_task(rtems_task_argument arg)
|
||||||
|
{
|
||||||
|
test_context *ctx = &test_instance;
|
||||||
|
FILE *file = freopen(&file_path[0], "r+", stdout);
|
||||||
|
char buf[1] = { 'x' };
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
rtems_test_assert(file != NULL);
|
||||||
|
|
||||||
|
n = fwrite(&buf[0], sizeof(buf), 1, file);
|
||||||
|
rtems_test_assert(n == 1);
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->current == OPEN);
|
||||||
|
|
||||||
|
wake_up_main(ctx);
|
||||||
|
|
||||||
|
rtems_test_assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_open(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
const char *path,
|
||||||
|
int oflag,
|
||||||
|
mode_t mode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
test_context *ctx = &test_instance;
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->current == INIT);
|
||||||
|
ctx->current = OPEN;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_close(
|
||||||
|
rtems_libio_t *iop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
test_context *ctx = &test_instance;
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->current == WRITTEN);
|
||||||
|
ctx->current = CLOSED;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t handler_read(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
void *buffer,
|
||||||
|
size_t count
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t handler_write(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
const void *buffer,
|
||||||
|
size_t count
|
||||||
|
)
|
||||||
|
{
|
||||||
|
test_context *ctx = &test_instance;
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->current == OPEN);
|
||||||
|
ctx->current = WRITTEN;
|
||||||
|
|
||||||
|
iop->offset += count;
|
||||||
|
|
||||||
|
return (ssize_t) count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_ioctl(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
uint32_t request,
|
||||||
|
void *buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static off_t handler_lseek(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
off_t length,
|
||||||
|
int whence
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_ftruncate(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
off_t length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_fsync(
|
||||||
|
rtems_libio_t *iop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_fdatasync(
|
||||||
|
rtems_libio_t *iop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handler_fcntl(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
int cmd
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t handler_readv(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
const struct iovec *iov,
|
||||||
|
int iovcnt,
|
||||||
|
ssize_t total
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t handler_writev(
|
||||||
|
rtems_libio_t *iop,
|
||||||
|
const struct iovec *iov,
|
||||||
|
int iovcnt,
|
||||||
|
ssize_t total
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_test_assert(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const rtems_filesystem_file_handlers_r node_handlers = {
|
||||||
|
.open_h = handler_open,
|
||||||
|
.close_h = handler_close,
|
||||||
|
.read_h = handler_read,
|
||||||
|
.write_h = handler_write,
|
||||||
|
.ioctl_h = handler_ioctl,
|
||||||
|
.lseek_h = handler_lseek,
|
||||||
|
.fstat_h = rtems_filesystem_default_fstat,
|
||||||
|
.ftruncate_h = handler_ftruncate,
|
||||||
|
.fsync_h = handler_fsync,
|
||||||
|
.fdatasync_h = handler_fdatasync,
|
||||||
|
.fcntl_h = handler_fcntl,
|
||||||
|
.readv_h = handler_readv,
|
||||||
|
.writev_h = handler_writev
|
||||||
|
};
|
||||||
|
|
||||||
|
static const IMFS_node_control node_control = {
|
||||||
|
.imfs_type = IMFS_GENERIC,
|
||||||
|
.handlers = &node_handlers,
|
||||||
|
.node_initialize = IMFS_node_initialize_default,
|
||||||
|
.node_remove = IMFS_node_remove_default,
|
||||||
|
.node_destroy = IMFS_node_destroy_default
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test(void)
|
||||||
|
{
|
||||||
|
test_context *ctx = &test_instance;
|
||||||
|
rtems_status_code sc;
|
||||||
|
int rv;
|
||||||
|
rtems_resource_snapshot snapshot;
|
||||||
|
|
||||||
|
ctx->main_task_id = rtems_task_self();
|
||||||
|
|
||||||
|
rtems_resource_snapshot_take(&snapshot);
|
||||||
|
|
||||||
|
rv = IMFS_make_generic_node(
|
||||||
|
&file_path[0],
|
||||||
|
S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO,
|
||||||
|
&node_control,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
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);
|
||||||
|
|
||||||
|
rv = unlink(&file_path[0]);
|
||||||
|
rtems_test_assert(rv == 0);
|
||||||
|
|
||||||
|
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Init(rtems_task_argument arg)
|
||||||
|
{
|
||||||
|
TEST_BEGIN();
|
||||||
|
|
||||||
|
test();
|
||||||
|
|
||||||
|
TEST_END();
|
||||||
|
rtems_test_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||||
|
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||||
|
|
||||||
|
#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
|
||||||
|
|
||||||
|
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
|
||||||
|
|
||||||
|
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||||
|
|
||||||
|
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||||
|
|
||||||
|
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||||
|
|
||||||
|
#define CONFIGURE_INIT
|
||||||
|
|
||||||
|
#include <rtems/confdefs.h>
|
||||||
13
testsuites/libtests/newlib01/newlib01.doc
Normal file
13
testsuites/libtests/newlib01/newlib01.doc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
This file describes the directives and concepts tested by this test set.
|
||||||
|
|
||||||
|
test set name: newlib01
|
||||||
|
|
||||||
|
directives:
|
||||||
|
|
||||||
|
- newlib_create_hook()
|
||||||
|
- newlib_delete_hook()
|
||||||
|
- newlib_terminate_hook()
|
||||||
|
|
||||||
|
concepts:
|
||||||
|
|
||||||
|
- Ensure that the Newlib hooks works as expected.
|
||||||
2
testsuites/libtests/newlib01/newlib01.scn
Normal file
2
testsuites/libtests/newlib01/newlib01.scn
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*** BEGIN OF TEST NEWLIB 1 ***
|
||||||
|
*** END OF TEST NEWLIB 1 ***
|
||||||
Reference in New Issue
Block a user