test/jdk/java/lang/ProcessHandle/InfoTest.java
author erikj
Tue, 12 Sep 2017 19:03:39 +0200
changeset 47216 71c04702a3d5
parent 45466 jdk/test/java/lang/ProcessHandle/InfoTest.java@faf1c55d2046
permissions -rw-r--r--
8187443: Forest Consolidation: Move files to unified layout Reviewed-by: darcy, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     1
/*
36004
91d5f006921d 8149920: Remove intermittent key from jdk_core tests
amlu
parents: 34891
diff changeset
     2
 * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     4
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     8
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    13
 * accompanied this code).
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    14
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    18
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    21
 * questions.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    22
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    23
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 34775
diff changeset
    24
import java.io.BufferedReader;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    25
import java.io.File;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    26
import java.io.IOException;
30955
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    27
import java.io.UncheckedIOException;
30903
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
    28
import java.nio.file.Files;
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
    29
import java.nio.file.Path;
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
    30
import java.nio.file.Paths;
30955
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    31
import java.nio.file.attribute.UserPrincipal;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    32
import java.time.Duration;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    33
import java.time.Instant;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    34
import java.util.ArrayList;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    35
import java.util.Arrays;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    36
import java.util.List;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    37
import java.util.Objects;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    38
import java.util.Optional;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    39
import java.util.Random;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    40
import java.util.concurrent.TimeUnit;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    41
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 34775
diff changeset
    42
import jdk.test.lib.Platform;
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 34775
diff changeset
    43
import jdk.test.lib.Utils;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    44
import org.testng.Assert;
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 34775
diff changeset
    45
import org.testng.TestNG;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    46
import org.testng.annotations.Test;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    47
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    48
/*
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    49
 * @test
34775
311773a49782 8136597: java/lang/ProcessHandle/InfoTest.java fails
rriggs
parents: 32517
diff changeset
    50
 * @bug 8077350 8081566 8081567 8098852 8136597
40686
1b855fa5c9c5 8157957: ClassNotFoundException: jdk.test.lib.JDKToolFinder
ctornqvi
parents: 36966
diff changeset
    51
 * @library /test/lib
36966
4209c9e19c45 8153737: Unsupported Module
chegar
parents: 36237
diff changeset
    52
 * @modules java.base/jdk.internal.misc
4209c9e19c45 8153737: Unsupported Module
chegar
parents: 36237
diff changeset
    53
 *          jdk.management
45466
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    54
 * @build jdk.test.lib.Utils
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    55
 *        jdk.test.lib.Asserts
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    56
 *        jdk.test.lib.JDKToolFinder
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    57
 *        jdk.test.lib.JDKToolLauncher
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    58
 *        jdk.test.lib.Platform
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 40686
diff changeset
    59
 *        jdk.test.lib.process.*
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 34775
diff changeset
    60
 * @run testng InfoTest
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    61
 * @summary Functions of ProcessHandle.Info
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    62
 * @author Roger Riggs
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    63
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    64
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    65
public class InfoTest {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    66
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    67
    static String whoami;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    68
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    69
    static {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    70
        try {
30955
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    71
            // Create a file and take the username from the file
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    72
            Path p = Paths.get("OwnerName.tmp");
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    73
            Files.createFile(p);
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    74
            UserPrincipal owner = Files.getOwner(p);
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    75
            whoami = owner.getName();
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    76
            Files.delete(p);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    77
        } catch (IOException ex) {
30955
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    78
            ex.printStackTrace();
9f660470002c 8081567: java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"
rriggs
parents: 30903
diff changeset
    79
            throw new UncheckedIOException("tmp file", ex);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    80
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    81
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    82
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    83
    // Main can be used to run the tests from the command line with only testng.jar.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    84
    @SuppressWarnings("raw_types")
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    85
    public static void main(String[] args) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    86
        Class<?>[] testclass = {InfoTest.class};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    87
        TestNG testng = new TestNG();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    88
        testng.setTestClasses(testclass);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    89
        testng.run();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    90
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    91
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    92
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    93
     * Test that cputime used shows up in ProcessHandle.info
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    94
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    95
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    96
    public static void test1() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    97
        System.out.println("Note: when run in samevm mode the cputime of the " +
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    98
                "test runner is included.");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    99
        ProcessHandle self = ProcessHandle.current();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   100
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   101
        Duration someCPU = Duration.ofMillis(200L);
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   102
        Instant end = Instant.now().plus(someCPU);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   103
        while (Instant.now().isBefore(end)) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   104
            // waste the cpu
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   105
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   106
        ProcessHandle.Info info = self.info();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   107
        System.out.printf(" info: %s%n", info);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   108
        Optional<Duration> totalCpu = info.totalCpuDuration();
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   109
        if (totalCpu.isPresent() && (totalCpu.get().compareTo(someCPU) < 0)) {
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   110
            Assert.fail("reported cputime less than expected: " + someCPU + ", " +
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   111
                    "actual: " + info.totalCpuDuration());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   112
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   113
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   114
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   115
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   116
     * Spawn a child with arguments and check they are visible via the ProcessHandle.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   117
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   118
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   119
    public static void test2() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   120
        try {
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   121
            long cpuLoopTime = 100;             // 100 ms
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   122
            String[] extraArgs = {"pid", "parent", "stdin"};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   123
            JavaChild p1 = JavaChild.spawnJavaChild((Object[])extraArgs);
36213
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   124
            Instant afterStart = null;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   125
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   126
            try (BufferedReader lines = p1.outputReader()) {
36213
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   127
                // Read the args line to know the subprocess has started
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   128
                lines.readLine();
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   129
                afterStart = Instant.now();
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   130
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   131
                Duration lastCpu = Duration.ofMillis(0L);
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   132
                for (int j = 0; j < 10; j++) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   133
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   134
                    p1.sendAction("cpuloop", cpuLoopTime);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   135
                    p1.sendAction("cputime", "");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   136
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   137
                    // Read cputime from child
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   138
                    Duration childCpuTime = null;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   139
                    // Read lines from the child until the result from cputime is returned
36213
a15d59022b65 8150346: java/lang/ProcessHandle/InfoTest.java failed - startTime after process spawn completed
rriggs
parents: 36004
diff changeset
   140
                    for (String s; (s = lines.readLine()) != null;) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   141
                        String[] split = s.trim().split(" ");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   142
                        if (split.length == 3 && split[1].equals("cputime")) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   143
                            long nanos = Long.valueOf(split[2]);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   144
                            childCpuTime = Duration.ofNanos(nanos);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   145
                            break;      // found the result we're looking for
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   146
                        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   147
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   148
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   149
                    if (Platform.isAix()) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   150
                        // Unfortunately, on AIX the usr/sys times reported through
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   151
                        // /proc/<pid>/psinfo which are used by ProcessHandle.Info
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   152
                        // are running slow compared to the corresponding times reported
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   153
                        // by the times()/getrusage() system calls which are used by
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   154
                        // OperatingSystemMXBean.getProcessCpuTime() and returned by
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   155
                        // the JavaChild for the "cputime" command.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   156
                        // This is because /proc/<pid>/status is only updated once a second.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   157
                        // So we better wait a little bit to get plausible values here.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   158
                        Thread.sleep(1000);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   159
                    }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   160
                    ProcessHandle.Info info = p1.info();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   161
                    System.out.printf(" info: %s%n", info);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   162
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   163
                    if (info.user().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   164
                        String user = info.user().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   165
                        Assert.assertNotNull(user, "User name");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   166
                        Assert.assertEquals(user, whoami, "User name");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   167
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   168
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   169
                    Optional<String> command = info.command();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   170
                    if (command.isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   171
                        String javaExe = System.getProperty("test.jdk") +
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   172
                                File.separator + "bin" + File.separator + "java";
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   173
                        String expected = Platform.isWindows() ? javaExe + ".exe" : javaExe;
30903
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
   174
                        Path expectedPath = Paths.get(expected);
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
   175
                        Path actualPath = Paths.get(command.get());
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
   176
                        Assert.assertTrue(Files.isSameFile(expectedPath, actualPath),
0c7d705209c6 8081566: java/lang/ProcessHandle/InfoTest.java failed on case sensitive command
rriggs
parents: 30899
diff changeset
   177
                                "Command: expected: " + javaExe + ", actual: " + command.get());
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   178
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   179
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   180
                    if (info.arguments().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   181
                        String[] args = info.arguments().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   182
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   183
                        int offset = args.length - extraArgs.length;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   184
                        for (int i = 0; i < extraArgs.length; i++) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   185
                            Assert.assertEquals(args[offset + i], extraArgs[i],
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   186
                                                "Actual argument mismatch, index: " + i);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   187
                        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   188
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   189
                        // Now check that the first argument is not the same as the executed command
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   190
                        if (args.length > 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   191
                            Assert.assertNotEquals(args[0], command,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   192
                                    "First argument should not be the executable: args[0]: "
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   193
                                            + args[0] + ", command: " + command);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   194
                        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   195
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   196
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   197
                    if (command.isPresent() && info.arguments().isPresent()) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   198
                        // If both, 'command' and 'arguments' are present,
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   199
                        // 'commandLine' is just the concatenation of the two.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   200
                        Assert.assertTrue(info.commandLine().isPresent(),
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   201
                                          "commandLine() must be available");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   202
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   203
                        String javaExe = System.getProperty("test.jdk") +
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   204
                                File.separator + "bin" + File.separator + "java";
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   205
                        String expected = Platform.isWindows() ? javaExe + ".exe" : javaExe;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   206
                        Path expectedPath = Paths.get(expected);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   207
                        String commandLine = info.commandLine().get();
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   208
                        String commandLineCmd = commandLine.split(" ")[0];
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   209
                        Path commandLineCmdPath = Paths.get(commandLineCmd);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   210
                        Assert.assertTrue(Files.isSameFile(commandLineCmdPath, expectedPath),
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   211
                                          "commandLine() should start with: " + expectedPath +
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   212
                                          " but starts with " + commandLineCmdPath);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   213
32508
b669acfaeb65 8135094: (process) java/lang/ProcessHandle/InfoTest fails testing commandLine()
rriggs
parents: 32228
diff changeset
   214
                        Assert.assertTrue(commandLine.contains(command.get()),
b669acfaeb65 8135094: (process) java/lang/ProcessHandle/InfoTest fails testing commandLine()
rriggs
parents: 32228
diff changeset
   215
                                "commandLine() must contain the command: " + command.get());
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   216
                        List<String> allArgs = p1.getArgs();
32508
b669acfaeb65 8135094: (process) java/lang/ProcessHandle/InfoTest fails testing commandLine()
rriggs
parents: 32228
diff changeset
   217
                        for (int i = 1; i < allArgs.size(); i++) {
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   218
                            Assert.assertTrue(commandLine.contains(allArgs.get(i)),
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   219
                                              "commandLine() must contain argument: " + allArgs.get(i));
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   220
                        }
34775
311773a49782 8136597: java/lang/ProcessHandle/InfoTest.java fails
rriggs
parents: 32517
diff changeset
   221
                    } else if (info.commandLine().isPresent() &&
311773a49782 8136597: java/lang/ProcessHandle/InfoTest.java fails
rriggs
parents: 32517
diff changeset
   222
                            command.isPresent() &&
311773a49782 8136597: java/lang/ProcessHandle/InfoTest.java fails
rriggs
parents: 32517
diff changeset
   223
                            command.get().length() < info.commandLine().get().length()) {
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   224
                        // If we only have the commandLine() we can only do some basic checks...
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   225
                        String commandLine = info.commandLine().get();
34775
311773a49782 8136597: java/lang/ProcessHandle/InfoTest.java fails
rriggs
parents: 32517
diff changeset
   226
                        String javaExe = "java" + (Platform.isWindows() ? ".exe" : "");
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   227
                        int pos = commandLine.indexOf(javaExe);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   228
                        Assert.assertTrue(pos > 0, "commandLine() should at least contain 'java'");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   229
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   230
                        pos += javaExe.length() + 1; // +1 for the space after the command
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   231
                        List<String> allArgs = p1.getArgs();
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   232
                        // First argument is the command - skip it here as we've already checked that.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   233
                        for (int i = 1; (i < allArgs.size()) &&
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   234
                                        (pos + allArgs.get(i).length() < commandLine.length()); i++) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   235
                            Assert.assertTrue(commandLine.contains(allArgs.get(i)),
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   236
                                              "commandLine() must contain argument: " + allArgs.get(i));
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   237
                            pos += allArgs.get(i).length() + 1;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   238
                        }
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   239
                    }
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   240
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   241
                    if (info.totalCpuDuration().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   242
                        Duration totalCPU = info.totalCpuDuration().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   243
                        Duration epsilon = Duration.ofMillis(200L);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   244
                        if (childCpuTime != null) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   245
                            System.out.printf(" info.totalCPU: %s, childCpuTime: %s, diff: %s%n",
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   246
                                    totalCPU.toNanos(), childCpuTime.toNanos(),
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   247
                                    childCpuTime.toNanos() - totalCPU.toNanos());
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   248
                            Assert.assertTrue(checkEpsilon(childCpuTime, totalCPU, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   249
                                    childCpuTime + " should be within " +
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   250
                                            epsilon + " of " + totalCPU);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   251
                        }
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   252
                        Assert.assertTrue(totalCPU.toNanos() > 0L,
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   253
                                "total cpu time expected > 0ms, actual: " + totalCPU);
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   254
                        long t = Utils.adjustTimeout(10L);  // Adjusted timeout seconds
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   255
                        Assert.assertTrue(totalCPU.toNanos() < lastCpu.toNanos() + t * 1_000_000_000L,
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   256
                                "total cpu time expected < " + t
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   257
                                        + " seconds more than previous iteration, actual: "
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   258
                                        + (totalCPU.toNanos() - lastCpu.toNanos()));
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   259
                        lastCpu = totalCPU;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   260
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   261
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   262
                    if (info.startInstant().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   263
                        Instant startTime = info.startInstant().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   264
                        Assert.assertTrue(startTime.isBefore(afterStart),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   265
                                "startTime after process spawn completed"
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   266
                                        + startTime + " + > " + afterStart);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   267
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   268
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   269
            }
32517
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   270
            p1.sendAction("exit");
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   271
            Assert.assertTrue(p1.waitFor(Utils.adjustTimeout(30L), TimeUnit.SECONDS),
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   272
                    "timeout waiting for process to terminate");
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   273
        } catch (IOException | InterruptedException ie) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   274
            ie.printStackTrace(System.out);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   275
            Assert.fail("unexpected exception", ie);
32517
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   276
        } finally {
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   277
            // Destroy any children that still exist
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   278
            ProcessUtil.destroyProcessTree(ProcessHandle.current());
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   279
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   280
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   281
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   282
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   283
     * Spawn a child with arguments and check they are visible via the ProcessHandle.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   284
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   285
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   286
    public static void test3() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   287
        try {
32517
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   288
            for (long sleepTime : Arrays.asList(Utils.adjustTimeout(30), Utils.adjustTimeout(32))) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   289
                Process p = spawn("sleep", String.valueOf(sleepTime));
32517
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   290
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   291
                ProcessHandle.Info info = p.info();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   292
                System.out.printf(" info: %s%n", info);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   293
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   294
                if (info.user().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   295
                    String user = info.user().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   296
                    Assert.assertNotNull(user);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   297
                    Assert.assertEquals(user, whoami);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   298
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   299
                if (info.command().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   300
                    String command = info.command().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   301
                    String expected = Platform.isWindows() ? "sleep.exe" : "sleep";
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   302
                    Assert.assertTrue(command.endsWith(expected), "Command: expected: \'" +
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   303
                            expected + "\', actual: " + command);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   304
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   305
                    // Verify the command exists and is executable
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   306
                    File exe = new File(command);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   307
                    Assert.assertTrue(exe.exists(), "command must exist: " + exe);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   308
                    Assert.assertTrue(exe.canExecute(), "command must be executable: " + exe);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   309
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   310
                if (info.arguments().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   311
                    String[] args = info.arguments().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   312
                    if (args.length > 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   313
                        Assert.assertEquals(args[0], String.valueOf(sleepTime));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   314
                    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   315
                }
32517
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   316
                p.destroy();
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   317
                Assert.assertTrue(p.waitFor(Utils.adjustTimeout(30), TimeUnit.SECONDS),
47fa336854c3 8133552: java/lang/ProcessHandle/InfoTest.java fails intermittently - incorrect user
rriggs
parents: 32508
diff changeset
   318
                        "timeout waiting for process to terminate");
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   319
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   320
        } catch (IOException | InterruptedException ex) {
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   321
            ex.printStackTrace(System.out);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   322
        } finally {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   323
            // Destroy any children that still exist
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   324
            ProcessUtil.destroyProcessTree(ProcessHandle.current());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   325
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   326
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   327
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   328
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   329
     * Cross check the cputime reported from java.management with that for the current process.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   330
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   331
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   332
    public static void test4() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   333
        Duration myCputime1 = ProcessUtil.MXBeanCpuTime();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   334
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   335
        if (Platform.isAix()) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   336
            // Unfortunately, on AIX the usr/sys times reported through
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   337
            // /proc/<pid>/psinfo which are used by ProcessHandle.Info
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   338
            // are running slow compared to the corresponding times reported
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   339
            // by the times()/getrusage() system calls which are used by
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   340
            // OperatingSystemMXBean.getProcessCpuTime() and returned by
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   341
            // the JavaChild for the "cputime" command.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   342
            // So we better wait a little bit to get plausible values here.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   343
            try {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   344
                Thread.sleep(1000);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   345
            } catch (InterruptedException ex) {}
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   346
        }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   347
        Optional<Duration> dur1 = ProcessHandle.current().info().totalCpuDuration();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   348
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   349
        Duration myCputime2 = ProcessUtil.MXBeanCpuTime();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   350
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   351
        if (Platform.isAix()) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   352
            try {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   353
                Thread.sleep(1000);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   354
            } catch (InterruptedException ex) {}
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31539
diff changeset
   355
        }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   356
        Optional<Duration> dur2 = ProcessHandle.current().info().totalCpuDuration();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   357
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   358
        if (dur1.isPresent() && dur2.isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   359
            Duration total1 = dur1.get();
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   360
            Duration total2 = dur2.get();
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   361
            System.out.printf(" total1 vs. mbean: %s, getProcessCpuTime: %s, diff: %s%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   362
                    Objects.toString(total1), myCputime1, myCputime1.minus(total1));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   363
            System.out.printf(" total2 vs. mbean: %s, getProcessCpuTime: %s, diff: %s%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   364
                    Objects.toString(total2), myCputime2, myCputime2.minus(total2));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   365
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   366
            Duration epsilon = Duration.ofMillis(200L);      // Epsilon is 200ms.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   367
            Assert.assertTrue(checkEpsilon(myCputime1, myCputime2, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   368
                    myCputime1.toNanos() + " should be within " + epsilon
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   369
                            + " of " + myCputime2.toNanos());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   370
            Assert.assertTrue(checkEpsilon(total1, total2, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   371
                    total1.toNanos() + " should be within " + epsilon
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   372
                            + " of " + total2.toNanos());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   373
            Assert.assertTrue(checkEpsilon(myCputime1, total1, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   374
                    myCputime1.toNanos() + " should be within " + epsilon
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   375
                            + " of " + total1.toNanos());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   376
            Assert.assertTrue(checkEpsilon(total1, myCputime2, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   377
                    total1.toNanos() + " should be within " + epsilon
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   378
                            + " of " + myCputime2.toNanos());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   379
            Assert.assertTrue(checkEpsilon(myCputime2, total2, epsilon),
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   380
                    myCputime2.toNanos() + " should be within " + epsilon
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   381
                            + " of " + total2.toNanos());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   382
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   383
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   384
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   385
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   386
    public static void test5() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   387
        ProcessHandle self = ProcessHandle.current();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   388
        Random r = new Random();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   389
        for (int i = 0; i < 30; i++) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   390
            Instant end = Instant.now().plusMillis(500L);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   391
            while (end.isBefore(Instant.now())) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   392
                // burn the cpu time checking the time
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   393
                long x = r.nextLong();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   394
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   395
            if (self.info().totalCpuDuration().isPresent()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   396
                Duration totalCpu = self.info().totalCpuDuration().get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   397
                long infoTotalCputime = totalCpu.toNanos();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   398
                long beanCputime = ProcessUtil.MXBeanCpuTime().toNanos();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   399
                System.out.printf(" infoTotal: %12d, beanCpu: %12d, diff: %12d%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   400
                        infoTotalCputime, beanCputime, beanCputime - infoTotalCputime);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   401
            } else {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   402
                break;  // nothing to compare; continue
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   403
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   404
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   405
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   406
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   407
     * Check two Durations, the second should be greater than the first or
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   408
     * within the supplied Epsilon.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   409
     * @param d1 a Duration - presumed to be shorter
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   410
     * @param d2 a 2nd Duration - presumed to be greater (or within Epsilon)
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   411
     * @param epsilon Epsilon the amount of overlap allowed
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   412
     * @return true if d2 is greater than d1 or within epsilon, false otherwise
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   413
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   414
    static boolean checkEpsilon(Duration d1, Duration d2, Duration epsilon) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   415
        if (d1.toNanos() <= d2.toNanos()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   416
            return true;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   417
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   418
        Duration diff = d1.minus(d2).abs();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   419
        return diff.compareTo(epsilon) <= 0;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   420
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   421
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   422
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   423
     * Spawn a native process with the provided arguments.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   424
     * @param command the executable of native process
31539
f850b9d09c91 8098852: java/lang/ProcessHandle/InfoTest.java failed: total cpu time expected < 10s more
rriggs
parents: 30955
diff changeset
   425
     * @param args to start a new process
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   426
     * @return the Process that was started
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   427
     * @throws IOException thrown by ProcessBuilder.start
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   428
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   429
    static Process spawn(String command, String... args) throws IOException {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   430
        ProcessBuilder pb = new ProcessBuilder();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   431
        pb.inheritIO();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   432
        List<String> list = new ArrayList<>();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   433
        list.add(command);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   434
        for (String arg : args)
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   435
            list.add(arg);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   436
        pb.command(list);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   437
        return pb.start();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   438
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   439
}