1-- C974002.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 sequence of statements of the triggering alternative
28--      of an asynchronous select statement is executed if the triggering
29--      statement is a delay_until statement, and the specified time has
30--      already passed. Check that the abortable part is not executed after
31--      the sequence of statements of the triggering alternative is left.
32--
33--      Check that the sequence of statements of the triggering alternative
34--      of an asynchronous select statement is not executed if the abortable
35--      part completes before the triggering statement, and the triggering
36--      statement is a delay_until statement.
37--
38-- TEST DESCRIPTION:
39--      Declare a task with an accept statement containing an asynchronous
40--      select with a delay_until triggering statement. Parameterize
41--      the accept statement with the time to be used in the delay. Simulate
42--      a quick calculation by declaring a procedure which sets a Boolean
43--      flag. Call this procedure in the abortable part.
44--
45--      Make two calls to the task entry: (1) with a time that has already
46--      expired, and (2) with a time that will not expire before the quick
47--      calculation completes.
48--
49--      For (1), the sequence of statements following the triggering statement
50--      is executed, and the abortable part never starts.
51--
52--      For (2), the abortable part completes before the triggering statement,
53--      the delay is canceled, and the sequence of statements following the
54--      triggering statement never starts.
55--
56--
57-- CHANGE HISTORY:
58--      06 Dec 94   SAIC    ACVC 2.0
59--      26 Nov 95   SAIC    Bug fix for ACVC 2.0.1.
60--
61--!
62
63with Report;
64with Ada.Calendar;
65with ImpDef;
66procedure C974002 is
67
68   function "-" (Left: Ada.Calendar.Time; Right: Duration )
69                          return Ada.Calendar.Time renames Ada.Calendar."-";
70   function "+" (Left: Ada.Calendar.Time; Right: Duration )
71                          return Ada.Calendar.Time renames Ada.Calendar."+";
72
73   Abortable_Part_Executed         : Boolean;
74   Triggering_Alternative_Executed : Boolean;
75
76
77          --========================================================--
78
79
80   procedure Quick_Calculation is
81   begin
82      if Report.Equal (1, 1) then
83         Abortable_Part_Executed := True;
84      end if;
85   end Quick_Calculation;
86
87
88          --========================================================--
89
90
91   task type Timed_Calculation_Task is
92      entry Calculation (Time_Out : in Ada.Calendar.Time);
93   end Timed_Calculation_Task;
94
95
96   task body Timed_Calculation_Task is
97   begin
98      loop
99         select
100            accept Calculation (Time_Out : in Ada.Calendar.Time) do
101
102               --                                    --
103               -- Asynchronous select is tested here --
104               --                                    --
105
106               select
107                  delay until Time_Out;                    -- Triggering
108                                                           -- statement.
109
110                  Triggering_Alternative_Executed := True; -- Triggering
111                                                           -- alternative.
112               then abort
113                  Quick_Calculation;                       -- Abortable part.
114               end select;
115            end Calculation;
116         or
117            terminate;
118         end select;
119      end loop;
120   exception
121      when others =>
122         Report.Failed ("Unexpected exception in Timed_Calculation_Task");
123   end Timed_Calculation_Task;
124
125
126          --========================================================--
127
128
129   Start_Time : constant Ada.Calendar.Time :=
130                         Ada.Calendar.Time_of (1901,1,1);
131   Minute     : constant Duration          := 60.0;
132
133
134          --========================================================--
135
136
137begin  -- Main program.
138
139   Report.Test ("C974002", "Asynchronous Select with Delay_Until");
140
141   -- take care of implementations that start the clock at 1/1/01
142   delay ImpDef.Delay_For_Time_Past;
143
144
145   Abortable_Part_Executed         := False;
146   Triggering_Alternative_Executed := False;
147
148   NO_DELAY_SUBTEST:
149
150      declare
151         -- Set Expiry to a time which has already passed
152         Expiry : constant Ada.Calendar.Time := Start_Time;
153         Timed  : Timed_Calculation_Task;
154      begin
155
156         -- Expiry is the time to be specified in the delay_until statement
157         -- of the asynchronous select. Since it has already passed, the
158         -- abortable part should not execute, and the sequence of statements
159         -- of the triggering alternative should be executed.
160
161         Timed.Calculation (Time_Out => Expiry);   -- Asynchronous select
162                                                   -- inside accept block.
163         if Abortable_Part_Executed then
164            Report.Failed ("No delay: Abortable part was executed");
165         end if;
166
167         if not Triggering_Alternative_Executed then
168            Report.Failed ("No delay: triggering alternative sequence " &
169                           "of statements was not executed");
170         end if;
171      end No_Delay_Subtest;
172
173
174   Abortable_Part_Executed         := False;
175   Triggering_Alternative_Executed := False;
176
177   LONG_DELAY_SUBTEST:
178
179      declare
180
181         -- Quick_Calculation should finish before expiry.
182         Expiry : constant Ada.Calendar.Time :=
183                                            Ada.Calendar.Clock + Minute;
184         Timed  : Timed_Calculation_Task;
185
186      begin
187
188         -- Expiry is the time to be specified in the delay_until statement
189         -- of the asynchronous select. It should not pass before the abortable
190         -- part completes, at which time control should return to the caller;
191         -- the sequence of statements of the triggering alternative should
192         -- not be executed.
193
194         Timed.Calculation (Time_Out => Expiry);  -- Asynchronous select.
195
196         if not Abortable_Part_Executed then
197            Report.Failed ("Long delay: Abortable part was not executed");
198         end if;
199
200         if Triggering_Alternative_Executed then
201            Report.Failed ("Long delay: triggering alternative sequence " &
202                           "of statements was executed");
203         end if;
204      end Long_Delay_Subtest;
205
206
207   Report.Result;
208
209end C974002;
210