1-- C974009.A 2-- 3-- Grant of Unlimited Rights 4-- 5-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, 6-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 7-- unlimited rights in the software and documentation contained herein. 8-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making 9-- this public release, the Government intends to confer upon all 10-- recipients unlimited rights equal to those held by the Government. 11-- These rights include rights to use, duplicate, release or disclose the 12-- released technical data and computer software in whole or in part, in 13-- any manner and for any purpose whatsoever, and to have or permit others 14-- to do so. 15-- 16-- DISCLAIMER 17-- 18-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR 19-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 20-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE 21-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 22-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A 23-- PARTICULAR PURPOSE OF SAID MATERIAL. 24--* 25-- 26-- OBJECTIVE: 27-- Check that the abortable part of an asynchronous select statement 28-- is not started if the triggering statement is a task entry call, 29-- the entry call is not queued and the entry call completes by 30-- propagating an exception. 31-- 32-- Check that the exception is properly propagated to the asynchronous 33-- select statement and thus the sequence of statements of the triggering 34-- alternative is not executed after the abortable part is left. 35-- 36-- Check that the exception propagated by the entry call is re-raised 37-- immediately following the asynchronous select. 38-- 39-- TEST DESCRIPTION: 40-- 41-- Use a small subset of the base Automated teller machine simulation 42-- which is shown in greater detail in other tests of this series. 43-- Declare a main procedure containing an asynchronous select with a task 44-- entry call as triggering statement. Force the task to be waiting at 45-- the accept statement so that the call is not queued and the rendezvous 46-- is executed immediately. Simulate an unexpected exception in the 47-- rendezvous. Use stripped down versions of called procedures to check 48-- the correct path in the test. 49-- 50-- 51-- CHANGE HISTORY: 52-- 06 Dec 94 SAIC ACVC 2.0 53-- 54--! 55 56 57package C974009_0 is -- Automated teller machine abstraction. 58 59 60 Propagated_From_Task : exception; 61 Transaction_Canceled : exception; 62 63 type Key_Enum is (None, Cancel, Deposit, Withdraw); 64 65 type Card_Number_Type is private; 66 type Card_PIN_Type is private; 67 type ATM_Card_Type is private; 68 69 task type ATM_Keyboard_Task is 70 entry Cancel_Pressed; 71 end ATM_Keyboard_Task; 72 73 74 procedure Validate_Card (Card : in ATM_Card_Type); 75 76 procedure Perform_Transaction (Card : in ATM_Card_Type); 77 78 79private 80 81 type Card_Number_Type is range 1 .. 9999; 82 type Card_PIN_Type is range 100 .. 999; 83 84 type ATM_Card_Type is record 85 Number : Card_Number_Type; 86 PIN : Card_PIN_Type; 87 end record; 88 89end C974009_0; 90 91 92 --==================================================================-- 93 94 95with Report; 96package body C974009_0 is 97 98 99 100 -- One of these gets created as "Keyboard" for each transaction 101 -- 102 task body ATM_Keyboard_Task is 103 Key_Pressed : Key_Enum := None; 104 begin 105 accept Cancel_Pressed do -- queued entry call. 106 null; --:::: stub, user code for cancel 107 -- Now simulate an unexpected exception arising in the 108 -- user code 109 raise Propagated_From_Task; -- Propagate an exception. 110 111 end Cancel_Pressed; 112 113 Report.Failed ("Exception not propagated in ATM_Keyboard_Task"); 114 115 exception 116 when Propagated_From_Task => 117 null; -- This is the expected test behavior 118 when others => 119 Report.Failed ("Unexpected Exception in ATM_Keyboard_Task"); 120 end ATM_Keyboard_Task; 121 122 procedure Validate_Card (Card : in ATM_Card_Type) is 123 begin 124 Report.Failed ("Abortable part was executed"); 125 end Validate_Card; 126 127 128 procedure Perform_Transaction (Card : in ATM_Card_Type) is 129 begin 130 Report.Failed ("Exception not re-raised immediately following " & 131 "asynchronous select"); 132 end Perform_Transaction; 133 134 135end C974009_0; 136 137 138 --==================================================================-- 139 140 141with Report; 142with ImpDef; 143 144with C974009_0; -- Automated teller machine abstraction. 145use C974009_0; 146 147procedure C974009 is 148 149 Card_Data : ATM_Card_Type; 150 151begin -- Main program. 152 153 Report.Test ("C974009", "Asynchronous Select: Trigger is a call to a " & 154 "task entry, is not queued and is completed " & 155 "first by an exception"); 156 157 158 begin 159 160 declare 161 -- Create the task for this transaction 162 Keyboard : C974009_0.ATM_Keyboard_Task; 163 begin 164 165 -- Ensure task is waiting a the accept so the call is not queued 166 -- This is the time required to activate another task and allow it 167 -- to run to its first accept statement 168 -- 169 delay ImpDef.Switch_To_New_Task; 170 171 -- -- 172 -- Asynchronous select is tested here -- 173 -- -- 174 175 select 176 177 Keyboard.Cancel_Pressed; 178 179 raise Transaction_Canceled; -- Should not be executed. 180 then abort 181 Validate_Card (Card_Data); -- Keyboard.Cancel_Pressed is accepted 182 -- and propagates an exception before 183 -- this call is executed 184 end select; 185 186 -- The propagated exception is re-raised here. 187 Perform_Transaction(Card_Data); -- Should not be reached. 188 189 exception 190 when Transaction_Canceled => 191 Report.Failed ("Triggering alternative sequence of statements " & 192 "executed"); 193 when Propagated_From_Task => 194 null; -- This is the expected test path 195 when others => 196 Report.Failed ("Wrong exception raised"); 197 end; 198 199 exception 200 when others => 201 Report.Failed ("Unexpected exception raised"); 202 end; 203 204 Report.Result; 205 206end C974009; 207