| -- C960004.A |
| -- |
| -- Grant of Unlimited Rights |
| -- |
| -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, |
| -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained |
| -- unlimited rights in the software and documentation contained herein. |
| -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making |
| -- this public release, the Government intends to confer upon all |
| -- recipients unlimited rights equal to those held by the Government. |
| -- These rights include rights to use, duplicate, release or disclose the |
| -- released technical data and computer software in whole or in part, in |
| -- any manner and for any purpose whatsoever, and to have or permit others |
| -- to do so. |
| -- |
| -- DISCLAIMER |
| -- |
| -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR |
| -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED |
| -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE |
| -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE |
| -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A |
| -- PARTICULAR PURPOSE OF SAID MATERIAL. |
| --* |
| -- |
| -- OBJECTIVE: |
| -- With the triggering statement being a delay and with the Asynchronous |
| -- Select statement being in a tasking situation complete the abortable |
| -- part before the delay expires. Check that the delay is cancelled |
| -- and that the optional statements in the triggering part are not |
| -- executed. |
| -- |
| -- TEST DESCRIPTION: |
| -- Simulate the creation of a carrier task to control the output of |
| -- a message via a line driver. If the message sending process is |
| -- not complete (the completion of the rendezvous) within a |
| -- specified time the carrier task is designed to take corrective action. |
| -- Use an asynchronous select to control the timing; arrange that |
| -- the abortable part (the rendezvous) completes almost immediately. |
| -- Check that the optional statements are not executed and that the |
| -- test completes well before the time of the trigger delay request thus |
| -- showing that it has been cancelled. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| |
| with Report; |
| with Ada.Calendar; |
| |
| procedure C960004 is |
| |
| function "-" (Left, Right : Ada.Calendar.Time) |
| return Duration renames Ada.Calendar."-"; |
| TC_Start_Time : Ada.Calendar.Time := Ada.Calendar.Clock; |
| TC_Elapsed_Time : duration; |
| |
| -- Note: a properly executing test will complete immediately. |
| Allowable_ACK_Time : duration := 600.0; |
| |
| begin |
| |
| Report.Test ("C960004", "ATC: When abortable part completes before " & |
| "a triggering delay, check that the delay " & |
| "is cancelled & optional statements " & |
| "are not performed. Tasking situation"); |
| |
| declare -- To get the Report.Result after all has completed |
| |
| type Sequence_Number is range 1..1_999_999; -- Message Number |
| subtype S_length_subtype is integer range 1..80; |
| |
| type Message_Type (Max_String : S_length_subtype := 1) is |
| record |
| Message_Number : Sequence_Number; |
| Alpha : string(1..Max_String); |
| end record; |
| |
| -- TC: Dummy message for the test |
| Dummy_Alpha : constant string := "This could be printed"; |
| Message_to_Send : Message_Type (Max_string => Dummy_Alpha'length); |
| |
| |
| -- This is the carrier task. One of these is created for each |
| -- message that requires ACK |
| -- |
| task type Require_ACK_task is |
| entry Message_In (Message_to_Send: Message_Type); |
| end Require_ACK_task; |
| type acc_Require_ACK_task is access Require_ACK_task; |
| |
| |
| --::::::::::::::::::::::::::::::::: |
| -- There would also be another task type "No_ACK_Task" which would |
| -- be the carrier task for those messages not requiring an ACK. |
| -- This task would call Send_Message.ACK_Not_Required. It is not |
| -- shown in this test as it is not used. |
| --::::::::::::::::::::::::::::::::: |
| |
| |
| |
| task Send_Message is |
| entry ACK_Required (Message_to_Send: Message_Type); |
| entry ACK_Not_Required (Message_to_Send: Message_Type); |
| end Send_Message; |
| |
| |
| -- This is the carrier task. One of these is created for each |
| -- message that requires ACK |
| -- |
| task body Require_ACK_task is |
| Hold_Message : Message_Type; |
| |
| procedure Time_Out (Failed_Message_Number : Sequence_Number) is |
| begin |
| -- Take remedial action on the timed-out message |
| null; -- stub |
| |
| Report.Failed ("Optional statements in triggering part" & |
| " were performed"); |
| end Time_out; |
| |
| begin |
| accept Message_In (Message_to_Send: Message_Type) do |
| Hold_Message := Message_to_Send; -- to release caller |
| end Message_In; |
| |
| -- Now put the message out to the Send_Message task and |
| -- wait (no more than Allowable_Ack_Time) for its completion |
| -- |
| select |
| delay Allowable_ACK_Time; |
| -- ACK not received in specified time |
| Time_out (Hold_Message.Message_Number); |
| then abort |
| -- If the rendezvous is not completed in the above time, this |
| -- call is cancelled |
| -- Note: for this test this call will complete immediately |
| -- and thus the trigger should be cancelled |
| Send_Message.ACK_Required (Hold_Message); |
| end select; |
| |
| exception |
| when others => |
| Report.Failed ("Unexpected exception in Require_ACK_task"); |
| end Require_ACK_task; |
| |
| |
| -- This is the Line Driver task |
| -- |
| task body Send_Message is |
| Hold_Non_ACK_Message : Message_Type; |
| begin |
| loop |
| select |
| accept ACK_Required (Message_to_Send: Message_Type) do |
| -- Here send the message from within the rendezvous |
| -- waiting for full transmission to complete |
| null; -- stub |
| -- Note: In this test this accept will complete immediately |
| end ACK_Required; |
| or |
| accept ACK_Not_Required (Message_to_Send: Message_Type) do |
| Hold_Non_ACK_Message := Message_to_Send; |
| end ACK_Not_Required; |
| -- Here send the message from outside the rendezvous |
| null; -- stub |
| or |
| terminate; |
| end select; |
| end loop; |
| exception |
| when others => Report.Failed ("Unexpected exception in Send_Message"); |
| end Send_Message; |
| |
| begin -- declare |
| -- Build a dummy message |
| Message_to_Send.Alpha := Dummy_Alpha; |
| Message_to_Send.Message_Number := 110_693; |
| |
| declare |
| New_Require_ACK_task : acc_Require_ACK_task := |
| new Require_ACK_task; |
| begin |
| -- Create a carrier task for this message and pass the latter in |
| New_Require_ACK_task.Message_In (Message_to_Send); |
| end; -- declare |
| |
| end; -- declare |
| |
| --Once we are out of the above declarative region, all tasks have completed |
| |
| TC_Elapsed_Time := Ada.Calendar.Clock - TC_Start_Time; |
| |
| -- Check that the test has completed well before the time of the requested |
| -- delay to ensure the delay was cancelled |
| -- |
| if (TC_Elapsed_Time > Allowable_ACK_Time/2) then |
| Report.Failed ("Triggering delay statement was not cancelled"); |
| end if; |
| |
| Report.Result; |
| end C960004; |