blob: 419f2a3e9ad6772cc5c9e49dc7a64a4ec924338f [file] [log] [blame]
-- C974009.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,
-- the entry call is not queued and the entry call completes by
-- propagating an exception.
--
-- Check that the exception 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 the exception propagated by the entry call 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. Force the task to be waiting at
-- the accept statement so that the call is not queued and the rendezvous
-- is executed immediately. Simulate an unexpected exception in the
-- rendezvous. Use stripped down versions of called procedures to check
-- the correct path in the test.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package C974009_0 is -- Automated teller machine abstraction.
Propagated_From_Task : exception;
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 C974009_0;
--==================================================================--
with Report;
package body C974009_0 is
-- One of these gets created as "Keyboard" for each transaction
--
task body ATM_Keyboard_Task is
Key_Pressed : Key_Enum := None;
begin
accept Cancel_Pressed do -- queued entry call.
null; --:::: stub, user code for cancel
-- Now simulate an unexpected exception arising in the
-- user code
raise Propagated_From_Task; -- Propagate an exception.
end Cancel_Pressed;
Report.Failed ("Exception not propagated in ATM_Keyboard_Task");
exception
when Propagated_From_Task =>
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 C974009_0;
--==================================================================--
with Report;
with ImpDef;
with C974009_0; -- Automated teller machine abstraction.
use C974009_0;
procedure C974009 is
Card_Data : ATM_Card_Type;
begin -- Main program.
Report.Test ("C974009", "Asynchronous Select: Trigger is a call to a " &
"task entry, is not queued and is completed " &
"first by an exception");
begin
declare
-- Create the task for this transaction
Keyboard : C974009_0.ATM_Keyboard_Task;
begin
-- Ensure task is waiting a the accept so the call is not queued
-- This is the time required to activate another task and allow it
-- to run to its first accept statement
--
delay ImpDef.Switch_To_New_Task;
-- --
-- Asynchronous select is tested here --
-- --
select
Keyboard.Cancel_Pressed;
raise Transaction_Canceled; -- Should not be executed.
then abort
Validate_Card (Card_Data); -- Keyboard.Cancel_Pressed is accepted
-- and propagates an exception before
-- this call is executed
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 Propagated_From_Task =>
null; -- This is the expected test path
when others =>
Report.Failed ("Wrong exception raised");
end;
exception
when others =>
Report.Failed ("Unexpected exception raised");
end;
Report.Result;
end C974009;