From bbf6253a771ccffd161f0716eca6e20d850eaebb Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 9 Oct 2009 13:43:36 +0000 Subject: 2009-10-09 Sebastian Huber * sp40/init.c, sp40/sp40.doc, sp40/sp40.scn: New test cases. * spintrcritical09/init.c, spintrcritical10/init.c, spintrcritical11/init.c: Fixed potentially infinite loops. --- testsuites/sptests/ChangeLog | 8 ++- testsuites/sptests/sp40/init.c | 117 +++++++++++++++++++++++++++++++++------ testsuites/sptests/sp40/sp40.doc | 3 + testsuites/sptests/sp40/sp40.scn | 11 +++- 4 files changed, 120 insertions(+), 19 deletions(-) (limited to 'testsuites') diff --git a/testsuites/sptests/ChangeLog b/testsuites/sptests/ChangeLog index b1c7e7d71c..32561f5143 100644 --- a/testsuites/sptests/ChangeLog +++ b/testsuites/sptests/ChangeLog @@ -1,7 +1,11 @@ +2009-10-09 Sebastian Huber + + * sp40/init.c, sp40/sp40.doc, sp40/sp40.scn: New test cases. + 2009-10-04 Sebastian Huber - * sptests/spintrcritical09/init.c, sptests/spintrcritical10/init.c, - sptests/spintrcritical11/init.c: Fixed potentially infinite loops. + * spintrcritical09/init.c, spintrcritical10/init.c, + spintrcritical11/init.c: Fixed potentially infinite loops. * sp20/system.h: Increased micro seconds per tick in order to be more independent of the console output speed. diff --git a/testsuites/sptests/sp40/init.c b/testsuites/sptests/sp40/init.c index e85437f188..db916e4f37 100644 --- a/testsuites/sptests/sp40/init.c +++ b/testsuites/sptests/sp40/init.c @@ -4,6 +4,8 @@ * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2009 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. @@ -11,24 +13,42 @@ * $Id$ */ +#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ + #include -rtems_device_driver test_open( +static rtems_device_driver test_open( rtems_device_major_number minor, rtems_device_minor_number major, void *ignored ) { + return RTEMS_IO_ERROR; } -rtems_driver_address_table test_driver = { - NULL, /* initialization procedure */ - test_open, /* open request procedure */ - NULL, /* close request procedure */ - NULL, /* read request procedure */ - NULL, /* write request procedure */ - NULL, /* special functions procedure */ +static rtems_driver_address_table test_driver = { + .initialization_entry = NULL, + .open_entry = test_open, + .close_entry = NULL, + .read_entry = NULL, + .write_entry = NULL, + .control_entry = NULL }; + +#define test_interrupt_context_enter( level ) \ + do { \ + _Thread_Disable_dispatch(); \ + rtems_interrupt_disable( level ); \ + ++_ISR_Nest_level; \ + } while (0) + +#define test_interrupt_context_leave( level ) \ + do { \ + --_ISR_Nest_level; \ + rtems_interrupt_enable( level ); \ + _Thread_Enable_dispatch(); \ + } while (0) + rtems_task Init( rtems_task_argument argument ) @@ -36,6 +56,8 @@ rtems_task Init( rtems_status_code sc; rtems_device_major_number registered; rtems_device_major_number registered_not; + rtems_device_major_number invalid_major = _IO_Number_of_drivers + 1; + rtems_interrupt_level level; puts( "\n\n*** TEST 40 ***" ); @@ -58,23 +80,86 @@ rtems_task Init( ); puts( "Init - rtems_io_register_driver - used slot" ); - sc = rtems_io_register_driver( registered, &test_driver, ®istered ); + sc = rtems_io_register_driver( registered, &test_driver, ®istered_not ); fatal_directive_status( sc, RTEMS_RESOURCE_IN_USE, "rtems_io_register_driver slot in use" ); - puts( "*** END OF TEST 40 ***" ); - rtems_test_exit( 0 ); -} + puts( "Init - rtems_io_unregister_driver - used slot" ); + sc = rtems_io_unregister_driver( registered ); + directive_failed( sc, "rtems_io_unregister_driver" ); + + puts( "Init - rtems_io_register_driver - free slot" ); + sc = rtems_io_register_driver( registered, &test_driver, ®istered ); + directive_failed( sc, "rtems_io_register_driver" ); + puts( "Init - rtems_io_register_driver - called from interrupt context" ); + test_interrupt_context_enter( level ); + sc = rtems_io_register_driver( 0, NULL, NULL ); + test_interrupt_context_leave( level ); + fatal_directive_status( + sc, + RTEMS_CALLED_FROM_ISR, + "rtems_io_register_driver" + ); -/* functions */ + puts( "Init - rtems_io_register_driver - invalid registered major pointer" ); + sc = rtems_io_register_driver( 0, NULL, NULL ); + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); -rtems_task Init( - rtems_task_argument argument -); + puts( "Init - rtems_io_register_driver - invalid driver table pointer" ); + sc = rtems_io_register_driver( 0, NULL, ®istered ); + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_register_driver - invalid empty driver table" ); + test_driver.open_entry = NULL; + sc = rtems_io_register_driver( 0, &test_driver, ®istered ); + test_driver.open_entry = test_open; + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_register_driver - invalid major" ); + sc = rtems_io_register_driver( invalid_major, &test_driver, ®istered ); + fatal_directive_status( + sc, + RTEMS_INVALID_NUMBER, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_unregister_driver - called from interrupt context" ); + test_interrupt_context_enter( level ); + sc = rtems_io_unregister_driver( 0 ); + test_interrupt_context_leave( level ); + fatal_directive_status( + sc, + RTEMS_CALLED_FROM_ISR, + "rtems_io_unregister_driver" + ); + + puts( "Init - rtems_io_unregister_driver - invalid major number" ); + sc = rtems_io_unregister_driver( invalid_major ); + fatal_directive_status( + sc, + RTEMS_UNSATISFIED, + "rtems_io_unregister_driver" + ); + + puts( "*** END OF TEST 40 ***" ); + rtems_test_exit( 0 ); +} /* configuration information */ diff --git a/testsuites/sptests/sp40/sp40.doc b/testsuites/sptests/sp40/sp40.doc index 4fe3640aad..fe30db18c9 100644 --- a/testsuites/sptests/sp40/sp40.doc +++ b/testsuites/sptests/sp40/sp40.doc @@ -16,6 +16,7 @@ test set name: sp40 directives: rtems_io_register_driver + rtems_io_unregister_driver concepts: @@ -23,3 +24,5 @@ concepts: when inserting into a slot that is already in use. + Focus on case where initialization entry is NULL and open entry is NOT NULL. + ++ Provoke error conditions. diff --git a/testsuites/sptests/sp40/sp40.scn b/testsuites/sptests/sp40/sp40.scn index 04fe9a98d8..c5ba8f7722 100644 --- a/testsuites/sptests/sp40/sp40.scn +++ b/testsuites/sptests/sp40/sp40.scn @@ -2,6 +2,15 @@ Init - rtems_io_register_driver - init == NULL, open != NULL OK Init - Major slot returned = 2 Init - rtems_io_register_driver - init == NULL, open != NULL OK -Init - Major slot returned = 0 +Init - Major slot returned = 3 Init - rtems_io_register_driver - used slot +Init - rtems_io_unregister_driver - used slot +Init - rtems_io_register_driver - free slot +Init - rtems_io_register_driver - called from interrupt context +Init - rtems_io_register_driver - invalid registered major pointer +Init - rtems_io_register_driver - invalid driver table pointer +Init - rtems_io_register_driver - invalid empty driver table +Init - rtems_io_register_driver - invalid major +Init - rtems_io_unregister_driver - called from interrupt context +Init - rtems_io_unregister_driver - invalid major number *** END OF TEST 40 *** -- cgit v1.2.3