Test4218609.java revision 16009:5445b9413d9d
1/*
2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.awt.Button;
25import java.awt.Dialog;
26import java.awt.Frame;
27import java.awt.Panel;
28import java.awt.TextArea;
29import java.awt.event.ActionEvent;
30import java.awt.event.ActionListener;
31
32/**
33 * @test
34 * @bug 4218609
35 * @summary A soft audio click is heard when playing some audio file
36 * @build ClickInPlay
37 * @run main/manual Test4218609
38 */
39public class Test4218609 {
40
41   private static void init() throws Exception {
42        //*** Create instructions for the user here ***
43
44        String[] instructions =
45        {
46         "To run the test follow these instructions:",
47         "1. Open a terminal window.",
48         "2. Type \"cd " + System.getProperty("test.classes") + "\".",
49         "3. Type \"" + System.getProperty("java.home") + "/bin/java ClickInPlay\".",
50         "4. Follow the instructions shown in the terminal window.",
51         "If no error occured during the test, and the java application ",
52         "in the termial exited successfully, press PASS, else press FAIL."
53       };
54
55      Sysout.createDialog( );
56      Sysout.printInstructions( instructions );
57
58    }
59
60 /*****************************************************
61     Standard Test Machinery Section
62      DO NOT modify anything in this section -- it's a
63      standard chunk of code which has all of the
64      synchronisation necessary for the test harness.
65      By keeping it the same in all tests, it is easier
66      to read and understand someone else's test, as
67      well as insuring that all tests behave correctly
68      with the test harness.
69     There is a section following this for test-defined
70      classes
71   ******************************************************/
72   private static boolean theTestPassed = false;
73   private static boolean testGeneratedInterrupt = false;
74   private static String failureMessage = "";
75
76   private static Thread mainThread = null;
77
78   private static int sleepTime = 300000;
79
80   public static void main( String args[] ) throws Exception
81    {
82      mainThread = Thread.currentThread();
83      try
84       {
85         init();
86       }
87      catch( TestPassedException e )
88       {
89         //The test passed, so just return from main and harness will
90         // interepret this return as a pass
91         return;
92       }
93      //At this point, neither test passed nor test failed has been
94      // called -- either would have thrown an exception and ended the
95      // test, so we know we have multiple threads.
96
97      //Test involves other threads, so sleep and wait for them to
98      // called pass() or fail()
99      try
100       {
101         Thread.sleep( sleepTime );
102         //Timed out, so fail the test
103         throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
104       }
105      catch (InterruptedException e)
106       {
107         if( ! testGeneratedInterrupt ) throw e;
108
109         //reset flag in case hit this code more than once for some reason (just safety)
110         testGeneratedInterrupt = false;
111         if ( theTestPassed == false )
112          {
113            throw new RuntimeException( failureMessage );
114          }
115       }
116
117    }//main
118
119   public static synchronized void setTimeoutTo( int seconds )
120    {
121      sleepTime = seconds * 1000;
122    }
123
124   public static synchronized void pass()
125    {
126      Sysout.println( "The test passed." );
127      Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
128      //first check if this is executing in main thread
129      if ( mainThread == Thread.currentThread() )
130       {
131         //Still in the main thread, so set the flag just for kicks,
132         // and throw a test passed exception which will be caught
133         // and end the test.
134         theTestPassed = true;
135         throw new TestPassedException();
136       }
137      //pass was called from a different thread, so set the flag and interrupt
138      // the main thead.
139      theTestPassed = true;
140      testGeneratedInterrupt = true;
141      mainThread.interrupt();
142    }//pass()
143
144   public static synchronized void fail()
145    {
146      //test writer didn't specify why test failed, so give generic
147      fail( "it just plain failed! :-)" );
148    }
149
150   public static synchronized void fail( String whyFailed )
151    {
152      Sysout.println( "The test failed: " + whyFailed );
153      Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
154      //check if this called from main thread
155      if ( mainThread == Thread.currentThread() )
156       {
157         //If main thread, fail now 'cause not sleeping
158         throw new RuntimeException( whyFailed );
159       }
160      theTestPassed = false;
161      testGeneratedInterrupt = true;
162      failureMessage = whyFailed;
163      mainThread.interrupt();
164    }//fail()
165
166 }// class Orient
167
168//This exception is used to exit from any level of call nesting
169// when it's determined that the test has passed, and immediately
170// end the test.
171class TestPassedException extends RuntimeException
172 {
173 }
174
175//*********** End Standard Test Machinery Section **********
176
177
178//************ Begin classes defined for the test ****************
179
180// make listeners in a class defined here, and instantiate them in init()
181
182/* Example of a class which may be written as part of a test
183class NewClass implements anInterface
184 {
185   static int newVar = 0;
186
187   public void eventDispatched(AWTEvent e)
188    {
189      //Counting events to see if we get enough
190      eventCount++;
191
192      if( eventCount == 20 )
193       {
194         //got enough events, so pass
195
196         Orient.pass();
197       }
198      else if( tries == 20 )
199       {
200         //tried too many times without getting enough events so fail
201
202         Orient.fail();
203       }
204
205    }// eventDispatched()
206
207 }// NewClass class
208
209*/
210
211
212//************** End classes defined for the test *******************
213
214
215
216
217/****************************************************
218 Standard Test Machinery
219 DO NOT modify anything below -- it's a standard
220  chunk of code whose purpose is to make user
221  interaction uniform, and thereby make it simpler
222  to read and understand someone else's test.
223 ****************************************************/
224
225/**
226 This is part of the standard test machinery.
227 It creates a dialog (with the instructions), and is the interface
228  for sending text messages to the user.
229 To print the instructions, send an array of strings to Sysout.createDialog
230  WithInstructions method.  Put one line of instructions per array entry.
231 To display a message for the tester to see, simply call Sysout.println
232  with the string to be displayed.
233 This mimics System.out.println but works within the test harness as well
234  as standalone.
235 */
236
237class Sysout
238 {
239   private static TestDialog dialog;
240
241   public static void createDialogWithInstructions( String[] instructions )
242    {
243      dialog = new TestDialog( new Frame(), "Instructions" );
244      dialog.printInstructions( instructions );
245      dialog.show();
246      println( "Any messages for the tester will display here." );
247    }
248
249   public static void createDialog( )
250    {
251      dialog = new TestDialog( new Frame(), "Instructions" );
252      String[] defInstr = { "Instructions will appear here. ", "" } ;
253      dialog.printInstructions( defInstr );
254      dialog.show();
255      println( "Any messages for the tester will display here." );
256    }
257
258
259   public static void printInstructions( String[] instructions )
260    {
261      dialog.printInstructions( instructions );
262    }
263
264
265   public static void println( String messageIn )
266    {
267      dialog.displayMessage( messageIn );
268    }
269
270 }// Sysout  class
271
272/**
273  This is part of the standard test machinery.  It provides a place for the
274   test instructions to be displayed, and a place for interactive messages
275   to the user to be displayed.
276  To have the test instructions displayed, see Sysout.
277  To have a message to the user be displayed, see Sysout.
278  Do not call anything in this dialog directly.
279  */
280class TestDialog extends Dialog implements ActionListener
281 {
282
283   TextArea instructionsText;
284   TextArea messageText;
285   int maxStringLength = 80;
286   Panel  buttonP = new Panel();
287   Button passB = new Button( "pass" );
288   Button failB = new Button( "fail" );
289
290   //DO NOT call this directly, go through Sysout
291   public TestDialog( Frame frame, String name )
292    {
293      super( frame, name );
294      int scrollBoth = TextArea.SCROLLBARS_BOTH;
295      instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
296      add( "North", instructionsText );
297
298      messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
299      add("Center", messageText);
300
301      passB = new Button( "pass" );
302      passB.setActionCommand( "pass" );
303      passB.addActionListener( this );
304      buttonP.add( "East", passB );
305
306      failB = new Button( "fail" );
307      failB.setActionCommand( "fail" );
308      failB.addActionListener( this );
309      buttonP.add( "West", failB );
310
311      add( "South", buttonP );
312      pack();
313
314      show();
315    }// TestDialog()
316
317   //DO NOT call this directly, go through Sysout
318   public void printInstructions( String[] instructions )
319    {
320      //Clear out any current instructions
321      instructionsText.setText( "" );
322
323      //Go down array of instruction strings
324
325      String printStr, remainingStr;
326      for( int i=0; i < instructions.length; i++ )
327       {
328         //chop up each into pieces maxSringLength long
329         remainingStr = instructions[ i ];
330         while( remainingStr.length() > 0 )
331          {
332            //if longer than max then chop off first max chars to print
333            if( remainingStr.length() >= maxStringLength )
334             {
335               //Try to chop on a word boundary
336               int posOfSpace = remainingStr.
337                  lastIndexOf( ' ', maxStringLength - 1 );
338
339               if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
340
341               printStr = remainingStr.substring( 0, posOfSpace + 1 );
342               remainingStr = remainingStr.substring( posOfSpace + 1 );
343             }
344            //else just print
345            else
346             {
347               printStr = remainingStr;
348               remainingStr = "";
349             }
350
351            instructionsText.append( printStr + "\n" );
352
353          }// while
354
355       }// for
356
357    }//printInstructions()
358
359   //DO NOT call this directly, go through Sysout
360   public void displayMessage( String messageIn )
361    {
362      messageText.append( messageIn + "\n" );
363    }
364
365   //catch presses of the passed and failed buttons.
366   //simply call the standard pass() or fail() static methods of
367   //DialogOrient
368   public void actionPerformed( ActionEvent e )
369    {
370      if( e.getActionCommand() == "pass" )
371       {
372         Test4218609.pass();
373       }
374      else
375       {
376         Test4218609.fail();
377       }
378    }
379
380 }// TestDialog  class
381