1 /*
2  * Copyright (c) 2013, 2018, 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 
24 
25 import jdk.test.lib.process.OutputAnalyzer;
26 import jdk.test.lib.process.ProcessTools;
27 import jdk.test.lib.Utils;
28 
29 import java.util.UUID;
30 
31 
32 /**
33  * This class will try to find an unused port and run a JdpTestCase using it.
34  * The unused port is needed for jmxremote.port.
35  * The problem with busy ports arises when running many automated tests on the same host.
36  * Note that jdp.port is a multicast port and thus it can be binded by different processes at the same time.
37  */
38 public abstract class DynamicLauncher {
39 
40     final String jdpName = UUID.randomUUID().toString();
41     OutputAnalyzer output;
42     int jmxPort;
43 
run()44     protected void run() throws Exception {
45         int retries = 1;
46         boolean tryAgain;
47 
48         do {
49             tryAgain = false;
50             jmxPort = Utils.getFreePort();
51             output = runVM();
52             try {
53                 output.shouldNotContain("Port already in use");
54             } catch (RuntimeException e) {
55                 if (retries < 3) {
56                     retries++;
57                     tryAgain = true;
58                 }
59             }
60         } while (tryAgain);
61         output.shouldHaveExitValue(0);
62         // java.lang.Exception is thrown by JdpTestCase if something goes wrong
63         // for instance - see JdpTestCase::shutdown()
64         output.shouldNotContain("java.lang.Exception:");
65         output.shouldNotContain("Error: Could not find or load main class");
66     }
67 
runVM()68     protected OutputAnalyzer runVM() throws Exception {
69         String[] options = this.options();
70         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(options);
71         OutputAnalyzer out = ProcessTools.executeProcess(pb);
72         System.out.println(out.getStdout());
73         System.err.println(out.getStderr());
74         return out;
75     }
76 
options()77     protected abstract String[] options();
78 
getProcessOutpoutAnalyzer()79     protected OutputAnalyzer getProcessOutpoutAnalyzer() {
80         return output;
81     }
82 }
83