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