1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
-- C974010.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:
-- Check that the abortable part of an asynchronous select statement
-- is not started if the triggering statement is a task entry call to
-- a task that has already terminated.
--
-- Check that Tasking_Error is properly propagated to the asynchronous
-- select statement and thus the sequence of statements of the triggering
-- alternative is not executed after the abortable part is left.
--
-- Check that Tasking_Error is re-raised immediately following the
-- asynchronous select.
--
-- TEST DESCRIPTION:
--
-- Use a small subset of the base Automated Teller Machine simulation
-- which is shown in greater detail in other tests of this series.
-- Declare a main procedure containing an asynchronous select with a task
-- entry call as triggering statement. Ensure that the task is
-- terminated before the entry call. Use stripped down versions of
-- the called procedures to check the correct path in the test.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package C974010_0 is -- Automated teller machine abstraction.
Transaction_Canceled : exception;
type Key_Enum is (None, Cancel, Deposit, Withdraw);
type Card_Number_Type is private;
type Card_PIN_Type is private;
type ATM_Card_Type is private;
task type ATM_Keyboard_Task is
entry Cancel_Pressed;
end ATM_Keyboard_Task;
procedure Validate_Card (Card : in ATM_Card_Type);
procedure Perform_Transaction (Card : in ATM_Card_Type);
private
type Card_Number_Type is range 1 .. 9999;
type Card_PIN_Type is range 100 .. 999;
type ATM_Card_Type is record
Number : Card_Number_Type;
PIN : Card_PIN_Type;
end record;
end C974010_0;
--==================================================================--
with Report;
package body C974010_0 is
-- One of these gets created as "Keyboard" for each transaction
--
task body ATM_Keyboard_Task is
TC_Suicide : exception;
Key_Pressed : Key_Enum := None;
begin
raise TC_Suicide; -- Simulate early, unexpected termination
accept Cancel_Pressed do -- queued entry call.
null; --:::: user code for cancel
end Cancel_Pressed;
exception
when TC_Suicide =>
null; -- This is the expected test behavior
when others =>
Report.Failed ("Unexpected Exception in ATM_Keyboard_Task");
end ATM_Keyboard_Task;
procedure Validate_Card (Card : in ATM_Card_Type) is
begin
Report.Failed ("Abortable part was executed");
end Validate_Card;
procedure Perform_Transaction (Card : in ATM_Card_Type) is
begin
Report.Failed ("Exception not re-raised immediately following " &
"asynchronous select");
end Perform_Transaction;
end C974010_0;
--==================================================================--
with Report;
with ImpDef;
with C974010_0; -- Automated teller machine abstraction.
use C974010_0;
procedure C974010 is
Card_Data : ATM_Card_Type;
TC_Tasking_Error_Handled : Boolean := false;
begin -- Main program.
Report.Test ("C974010", "Asynchronous Select: Trigger is a call to a " &
"task entry of a task that is already completed");
declare
-- Create the task for this transaction
Keyboard : C974010_0.ATM_Keyboard_Task;
begin
-- Ensure the task is already completed before calling
--
while not Keyboard'terminated loop
delay ImpDef.Minimum_Task_Switch;
end loop;
-- --
-- Asynchronous select is tested here --
-- --
select
Keyboard.Cancel_Pressed;
raise Transaction_Canceled; -- Should not be executed.
then abort
-- Since the triggering call is not queued the abortable part
-- should not be executed.
--
Validate_Card (Card_Data);
end select;
--
-- The propagated exception is re-raised here.
Perform_Transaction(Card_Data); -- Should not be reached.
exception
when Transaction_Canceled =>
Report.Failed ("Triggering alternative sequence of statements " &
"executed");
when Tasking_Error =>
-- This is the expected test path
TC_Tasking_Error_Handled := true;
when others =>
Report.Failed ("Wrong exception raised: ");
end;
if not TC_Tasking_Error_Handled then
Report.Failed ("Tasking_Error not properly propagated");
end if;
Report.Result;
exception
when Tasking_Error =>
Report.Failed ("Tasking_Error propagated to wrong handler");
Report.Result;
end C974010;
|