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 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
|
-- C974005.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 Tasking_Error is raised at the point of an entry call
-- which is the triggering statement of an asynchronous select, if
-- the entry call is queued, but the task containing the entry completes
-- before it can be accepted or canceled.
--
-- Check that the abortable part is aborted if it does not complete
-- before the triggering statement completes.
--
-- Check that the sequence of statements of the triggering alternative
-- is not executed.
--
-- TEST DESCRIPTION:
-- Declare a main procedure containing an asynchronous select with a task
-- entry call as triggering statement. Force the entry call to be
-- queued by having the task call a procedure, prior to the corresponding
-- accept statement, which simulates a routine waiting for user input
-- (with a delay).
--
-- Simulate a time-consuming routine in the abortable part by calling a
-- procedure containing an infinite loop. Meanwhile, simulate input by
-- the user (the delay expires) which is NOT the input expected by the
-- guard on the accept statement. The entry remains closed, and the
-- task completes its execution. Since the entry was not accepted before
-- its task completed, Tasking_Error is raised at the point of the entry
-- call.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package C974005_0 is -- Automated teller machine abstraction.
-- Flags for testing purposes:
Count : Integer := 1234;
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;
Transaction_Canceled : exception;
task type ATM_Keyboard_Task is
entry Cancel_Pressed;
end ATM_Keyboard_Task;
procedure Read_Card (Card : in out ATM_Card_Type);
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 C974005_0;
--==================================================================--
with Report;
with ImpDef;
package body C974005_0 is
procedure Listen_For_Input (Key : out Key_Enum) is
begin
-- Simulate the situation where a user waits a bit for the card to
-- be validated, then presses a transaction key (NOT Cancel).
-- Delay long enough to force queuing of Keyboard.Cancel_Pressed.
delay ImpDef.Clear_Ready_Queue;
if Report.Equal (3, 3) then -- Always true.
Key := Deposit; -- Cancel is NOT pressed.
end if;
end Listen_For_Input;
task body ATM_Keyboard_Task is
Key_Pressed : Key_Enum := None;
begin
-- Note: no loop. If the user does not press Cancel, the task completes.
-- In this model of the keyboard monitor, the user only gets one chance
-- to cancel the card validation.
-- Force entry
Listen_For_Input (Key_Pressed); -- calls to be
-- queued, but do
-- NOT set guard
-- to true.
select
when (Key_Pressed = Cancel) => -- Guard is false,
accept Cancel_Pressed do -- so entry call
Report.Failed ("Accept statement executed"); -- remains queued.
end Cancel_Pressed;
else -- Else alternative
Key_Pressed := None; -- executed, then
end select; -- task ends.
exception
when others =>
Report.Failed ("Unexpected exception in ATM_Keyboard_Task");
end ATM_Keyboard_Task;
procedure Read_Card (Card : in out ATM_Card_Type) is
begin
Card.Number := 9999;
Card.PIN := 111;
end Read_Card;
procedure Validate_Card (Card : in ATM_Card_Type) is
begin
-- Simulate an exceedingly long validation activity.
loop -- Infinite loop.
Count := (Count + 1) mod Integer (Card.PIN);
-- Synch Point to allow transfer of control to Keyboard task
-- during this simulation
delay ImpDef.Minimum_Task_Switch;
exit when not Report.Equal (Count, Count); -- Always false.
end loop;
end Validate_Card;
procedure Perform_Transaction (Card : in ATM_Card_Type) is
begin
Report.Failed ("Exception not re-raised immediately following " &
"asynchronous select");
if Count = 1234 then
-- Additional analysis added to aid developers
Report.Failed ("Abortable part did not execute");
end if;
end Perform_Transaction;
end C974005_0;
--==================================================================--
with Report;
with C974005_0; -- Automated teller machine abstraction.
use C974005_0;
procedure C974005 is
Card_Data : ATM_Card_Type;
begin -- Main program.
Report.Test ("C974005", "ATC: trigger is queued but task terminates" &
" before call is serviced");
Read_Card (Card_Data);
begin
declare
Keyboard : C974005_0.ATM_Keyboard_Task;
begin
-- --
-- Asynchronous select is tested here --
-- --
select
Keyboard.Cancel_Pressed; -- Entry call initially queued, so
-- abortable part starts.
-- Tasking_Error raised here when
-- Keyboard completes before entry
-- call can be accepted, and before
-- abortable part completes.
raise Transaction_Canceled; -- Should not be executed.
then abort
Validate_Card (Card_Data); -- Keyboard task completes before
-- Keyboard.Cancel_Pressed is
-- accepted, and before this call
-- finishes. Tasking_Error is raised
-- at the point of the entry call,
-- and this call is aborted.
-- Check that the whole of the abortable part is aborted, not just
-- the statement in the abortable part that was executing at
-- the time
Report.Failed ("Abortable part not aborted");
end select;
Perform_Transaction (Card_Data); -- Should not be reached.
exception
when Transaction_Canceled =>
Report.Failed ("Triggering alternative sequence of statements " &
"executed");
when Tasking_Error =>
if Count = 1234 then
Report.Failed ("Abortable part did not execute");
end if;
when others =>
Report.Failed ("Wrong exception raised");
end;
exception
when Tasking_Error =>
Report.Failed ("Correct exception raised at wrong level");
when others =>
Report.Failed ("Wrong exception raised at wrong level");
end;
Report.Result;
end C974005;
|