summaryrefslogtreecommitdiffstats
path: root/c/src/ada-tests/sptests/sp13/sptest.adb
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/ada-tests/sptests/sp13/sptest.adb')
-rw-r--r--c/src/ada-tests/sptests/sp13/sptest.adb189
1 files changed, 181 insertions, 8 deletions
diff --git a/c/src/ada-tests/sptests/sp13/sptest.adb b/c/src/ada-tests/sptests/sp13/sptest.adb
index 568b7541af..5b631ffea6 100644
--- a/c/src/ada-tests/sptests/sp13/sptest.adb
+++ b/c/src/ada-tests/sptests/sp13/sptest.adb
@@ -25,9 +25,13 @@ with RTEMS;
with TEST_SUPPORT;
with TEXT_IO;
with UNSIGNED32_IO;
+use type RTEMS.STATUS_CODES;
package body SPTEST is
+ type BIG_BUFFER_TYPE is array (1 .. 2048) of RTEMS.UNSIGNED8;
+
+
--PAGE
--
-- INIT
@@ -216,16 +220,19 @@ package body SPTEST is
procedure TASK_1 (
ARGUMENT : in RTEMS.TASK_ARGUMENT
) is
- QID : RTEMS.ID;
- BUFFER : SPTEST.BUFFER;
- BUFFER_POINTER : RTEMS.ADDRESS;
- COUNT : RTEMS.UNSIGNED32;
- MESSAGE_SIZE : RTEMS.UNSIGNED32;
- STATUS : RTEMS.STATUS_CODES;
+ QID : RTEMS.ID;
+ BIG_SEND_BUFFER : BIG_BUFFER_TYPE;
+ BIG_SEND_BUFFER_POINTER : RTEMS.ADDRESS := BIG_SEND_BUFFER'ADDRESS;
+ BIG_RECEIVE_BUFFER : BIG_BUFFER_TYPE;
+ BIG_RECEIVE_BUFFER_POINTER : RTEMS.ADDRESS := BIG_RECEIVE_BUFFER'ADDRESS;
+ BUFFER : SPTEST.BUFFER;
+ BUFFER_POINTER : RTEMS.ADDRESS := BUFFER'ADDRESS;
+ COUNT : RTEMS.UNSIGNED32;
+ MESSAGE_SIZE : RTEMS.UNSIGNED32;
+ STATUS : RTEMS.STATUS_CODES;
+ SIZE : RTEMS.UNSIGNED32;
begin
- BUFFER_POINTER := BUFFER'ADDRESS;
-
RTEMS.MESSAGE_QUEUE_IDENT(
SPTEST.QUEUE_NAME( 1 ),
RTEMS.SEARCH_ALL_NODES,
@@ -431,6 +438,17 @@ TEST_SUPPORT.PAUSE;
RTEMS.MESSAGE_QUEUE_DELETE( SPTEST.QUEUE_ID( 2 ), STATUS );
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
+ TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
+ RTEMS.MESSAGE_QUEUE_GET_NUMBER_PENDING(
+ SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
+ );
+ TEXT_IO.PUT( "TA1 - " );
+ UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
+ TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
+
TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - empty Q 3" );
RTEMS.MESSAGE_QUEUE_FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
@@ -458,6 +476,31 @@ TEST_SUPPORT.PAUSE;
);
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
+ -- this broadcast should have no effect on the queue
+ SPTEST.FIlL_BUFFER( "NO BUFFER TO Q1 ", BUFFER );
+ TEXT_IO.PUT_LINE( "TA1 - message_queue_broadcast - NO BUFFER TO Q1" );
+ RTEMS.MESSAGE_QUEUE_BROADCAST(
+ SPTEST.QUEUE_ID( 1 ),
+ BUFFER_POINTER,
+ 16,
+ COUNT,
+ STATUS
+ );
+ TEXT_IO.PUT( "TA1 - number of tasks awakened = " );
+ UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
+ TEXT_IO.NEW_LINE;
+
+ TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
+ RTEMS.MESSAGE_QUEUE_GET_NUMBER_PENDING(
+ SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
+ );
+ TEXT_IO.PUT( "TA1 - " );
+ UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
+ TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
+
SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
RTEMS.MESSAGE_QUEUE_SEND(
@@ -503,7 +546,137 @@ TEST_SUPPORT.PAUSE;
TEXT_IO.PUT( "TA1 - " );
UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
+
+TEST_SUPPORT.PAUSE;
+ TEXT_IO.PUT_LINE( "TA1 - create message queue of 20 bytes on queue 1" );
+ RTEMS.MESSAGE_QUEUE_CREATE(
+ SPTEST.QUEUE_NAME( 1 ),
+ 100,
+ 20,
+ RTEMS.DEFAULT_ATTRIBUTES,
+ SPTEST.QUEUE_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "MESSAGE_QUEUE_CREATE of Q1; 20 bytes each"
+ );
+ RTEMS.MESSAGE_QUEUE_SEND(
+ SPTEST.QUEUE_ID( 1 ), BIG_SEND_BUFFER_POINTER, 40, STATUS
+ );
+ TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
+ STATUS, RTEMS.INVALID_SIZE, "expected INVALID_SIZE"
+ );
+
+ TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
+ RTEMS.MESSAGE_QUEUE_DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
+
+TEST_SUPPORT.PAUSE;
+
+ TEXT_IO.PUT_LINE( "TA1 - message_queue_create - variable sizes " );
+ for QUEUE_SIZE in 1 .. 1029 loop
+ RTEMS.MESSAGE_QUEUE_CREATE(
+ SPTEST.QUEUE_NAME( 1 ),
+ 2, -- just 2 msgs each
+ RTEMS.UNSIGNED32( QUEUE_SIZE ),
+ RTEMS.DEFAULT_ATTRIBUTES,
+ QUEUE_ID( 1 ),
+ STATUS
+ );
+ if STATUS /= RTEMS.SUCCESSFUL then
+ TEXT_IO.PUT( "TA1 - msq que size: " );
+ UNSIGNED32_IO.PUT(
+ RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
+ );
+ TEXT_IO.NEW_LINE;
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "message_queue_create of Q1"
+ );
+ end if;
+
+ RTEMS.MESSAGE_QUEUE_DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
+ end loop;
+
+ TEXT_IO.PUT_LINE(
+ "TA1 - message_queue_create and send - variable sizes "
+ );
+ for QUEUE_SIZE in 1 .. 1029 loop
+
+ RTEMS.MESSAGE_QUEUE_CREATE(
+ SPTEST.QUEUE_NAME( 1 ),
+ 2, -- just 2 msgs each
+ RTEMS.UNSIGNED32( QUEUE_SIZE ),
+ RTEMS.DEFAULT_ATTRIBUTES,
+ SPTEST.QUEUE_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( status, "message_queue_create of Q1" );
+
+ BIG_SEND_BUFFER := (others => CHARACTER'POS( 'A' ));
+ BIG_RECEIVE_BUFFER := (others => CHARACTER'POS( 'Z' ));
+
+ -- send a msg too big
+ RTEMS.MESSAGE_QUEUE_SEND(
+ SPTEST.QUEUE_ID( 1 ),
+ BIG_SEND_BUFFER_POINTER,
+ RTEMS.UNSIGNED32( QUEUE_SIZE + 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
+ STATUS, RTEMS.INVALID_SIZE, "message_queue_send too large"
+ );
+
+ -- send a msg that is just right
+ RTEMS.MESSAGE_QUEUE_SEND(
+ SPTEST.QUEUE_ID( 1 ),
+ BIG_SEND_BUFFER_POINTER,
+ RTEMS.UNSIGNED32( QUEUE_SIZE ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "message_queue_send exact size"
+ );
+
+ -- now read and verify the message just sent
+ RTEMS.MESSAGE_QUEUE_RECEIVE(
+ SPTEST.QUEUE_ID( 1 ),
+ BIG_RECEIVE_BUFFER_POINTER,
+ RTEMS.DEFAULT_OPTIONS,
+ 1 * TEST_SUPPORT.TICKS_PER_SECOND,
+ SIZE,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS, "message_queue_receive exact size"
+ );
+ if SIZE /= RTEMS.UNSIGNED32( QUEUE_SIZE ) then
+ TEXT_IO.PUT(
+ "TA1 - exact size size match failed for queue_size = "
+ );
+ UNSIGNED32_IO.PUT(
+ RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
+ );
+ TEXT_IO.NEW_LINE;
+ end if;
+
+ if (BIG_SEND_BUFFER( BIG_SEND_BUFFER'FIRST .. Integer( SIZE )) /=
+ BIG_RECEIVE_BUFFER( BIG_RECEIVE_BUFFER'FIRST .. Integer( SIZE ))) then
+ TEXT_IO.PUT_LINE("TA1 - exact size data match failed");
+ end if;
+
+ for I in Integer( SIZE + 1 ) .. BIG_RECEIVE_BUFFER'LAST loop
+ if BIG_RECEIVE_BUFFER( I ) /= CHARACTER'POS( 'Z' ) then
+ TEXT_IO.PUT_LINE("TA1 - exact size overrun match failed");
+ end if;
+ end loop;
+
+ -- all done with this one; delete it
+ RTEMS.MESSAGE_QUEUE_DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
+ end loop;
+
TEXT_IO.PUT_LINE( "*** END OF TEST 13 ***" );
RTEMS.SHUTDOWN_EXECUTIVE( 0 );