| /* | |
| * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /* | |
| * @test | |
| * @bug 6336608 6511738 6367473 | |
| * @summary Basic unit test of OperatingSystemMXBean.getSystemLoadAverage() | |
| * @author Mandy Chung | |
| * | |
| * @library /test/lib | |
| * | |
| * @run testng GetSystemLoadAverage | |
| */ | |
| /* | |
| * This test tests the load average on linux and solaris. On Windows, | |
| * getSystemLoadAverage() returns -1. | |
| * | |
| * Usage: GetSystemLoadAverage ["-1.0"] | |
| * Arguments: | |
| * o If no argument is specified, the test will verify the system load | |
| * average with the /usr/bin/uptime command. | |
| * o Otherwise, the input argument must be "-1.0" indicating the | |
| * expected system load average. This would only be the case when | |
| * running on Windows. | |
| */ | |
| import jdk.test.lib.Platform; | |
| import org.testng.annotations.Test; | |
| import java.io.InputStreamReader; | |
| import java.io.Reader; | |
| import java.lang.management.ManagementFactory; | |
| import java.lang.management.OperatingSystemMXBean; | |
| public class GetSystemLoadAverage { | |
| private static OperatingSystemMXBean mbean = | |
| ManagementFactory.getOperatingSystemMXBean(); | |
| // The system load average may be changing due to other jobs running. | |
| // Allow some delta. | |
| private static final double DELTA = 0.05; | |
| private static final int MAX_RETRIES = 5; | |
| private static final int WAIT_TIME_MS = 5000; | |
| @Test(timeOut = (300 + WAIT_TIME_MS) * MAX_RETRIES) | |
| void testSystemLoadAvg() throws Exception { | |
| for (int i = 1; i <= MAX_RETRIES; i++) { | |
| try { | |
| System.out.println(String.format("Run %d: TestSystemLoadAvg", i)); | |
| if (!Platform.isWindows()) { | |
| // On Linux or Mac | |
| checkLoadAvg(); | |
| } else { | |
| // On Windows, the system load average is expected to be -1.0 | |
| double loadavg = mbean.getSystemLoadAverage(); | |
| if (loadavg != -1.0) { | |
| throw new RuntimeException("Expected load average : -1.0" + | |
| " but getSystemLoadAverage returned: " + loadavg); | |
| } | |
| } | |
| System.out.println(String.format("Run %d: TestSystemLoadAvg test passed", i)); | |
| return; | |
| } catch (Exception e) { | |
| System.out.println( | |
| String.format("TEST FAILED: TestSystemLoadAvg test " + "failed %d runs", | |
| i)); | |
| if (i == MAX_RETRIES) { | |
| throw e; | |
| } | |
| System.out.println("Wait for 5 seconds"); | |
| Thread.sleep(WAIT_TIME_MS); | |
| } | |
| } | |
| } | |
| private static String LOAD_AVERAGE_TEXT | |
| = System.getProperty("os.name").contains("OS X") | |
| ? "load averages:" | |
| : "load average:"; | |
| private static void checkLoadAvg() throws Exception { | |
| // Obtain load average from OS command | |
| ProcessBuilder pb = new ProcessBuilder("/usr/bin/uptime"); | |
| Process p = pb.start(); | |
| String output = commandOutput(p); | |
| // obtain load average from OperatingSystemMXBean | |
| double loadavg = mbean.getSystemLoadAverage(); | |
| // verify if two values are close | |
| output = output.substring(output.lastIndexOf(LOAD_AVERAGE_TEXT) + | |
| LOAD_AVERAGE_TEXT.length() + 1); | |
| System.out.println("Load average returned from uptime = " + output); | |
| System.out.println("getSystemLoadAverage() returned " + loadavg); | |
| String[] lavg = System.getProperty("os.name").contains("OS X") | |
| ? output.split(" ") | |
| : output.split(","); | |
| double expected = Double.parseDouble(lavg[0]); | |
| double lowRange = expected * (1 - DELTA); | |
| double highRange = expected * (1 + DELTA); | |
| if (loadavg < lowRange || loadavg > highRange) { | |
| throw new RuntimeException("Expected load average : " + | |
| expected + | |
| " but getSystemLoadAverage returned: " + | |
| loadavg); | |
| } | |
| } | |
| private static String commandOutput(Reader r) throws Exception { | |
| StringBuilder sb = new StringBuilder(); | |
| int c; | |
| while ((c = r.read()) > 0) { | |
| if (c != '\r') { | |
| sb.append((char) c); | |
| } | |
| } | |
| return sb.toString(); | |
| } | |
| private static String commandOutput(Process p) throws Exception { | |
| Reader r = new InputStreamReader(p.getInputStream(),"UTF-8"); | |
| String output = commandOutput(r); | |
| p.waitFor(); | |
| p.exitValue(); | |
| return output; | |
| } | |
| } |