On Fri, 23 Feb 2024 21:55:15 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:

> PerfMapTest.java issues the Compiler.perfmap jcmd with a filename argument to 
> write the perfmap to. It does this in 3 different modes. 2 of the modes 
> result in a perfmap file being left in the tmp directory that is not removed 
> after the test executes (and should be removed). The 3rd mode creates the 
> perfmap file in the directory specified by the test.dir property, and is ok 
> to leave the file there. I've added code to delete the /tmp files that are 
> created.
> 
> I did a bit of extra testing by hand. I created `/tmp/perf-<pid>.map` as 
> root. As expected the Files.deleteIfExists() call threw an exception due to 
> the lack of permissions to delete the file. However, I then realized the file 
> had a size of 0, which means the test was not even doing a proper job of 
> testing that the perfrmap jcmd was working. In other words, the test should 
> have failed long before getting to the Files.deleteIfExists(), so I added a 
> size check to make sure it fails when the file is not written to.

Ok, so I'm not going insane and really did witness what I described, but I 
don't understand why. I create an empty file with root ownership:


$ ls -lat /tmp/perf-*
-rw-r--r-- 1 root     root       0 Feb 28 19:35 /tmp/perf-<pid>.map


And I get:


test PerfMapTest.specifiedDefaultMapFile(): failure
java.lang.AssertionError: File must not be empty. Possible file permission 
issue: /tmp/perf-<pid>.map expected [true] but found [false]


So my empty file check is being triggered. Also in the log I see:


test PerfMapTest.defaultMapFile(): success
Running DCMD 'Compiler.perfmap /tmp/perf-<pid>.map' through 'JMXExecutor'
[3.000s][warning][codecache] Failed to create /tmp/perf-<pid>.map for perf map
---------------- stdout ----------------

---------------- stderr ----------------

----------------------------------------


But this output is not being detected by:


        OutputAnalyzer output = executor.execute(cmd);
        output.stderrShouldBeEmpty();
        output.stdoutShouldBeEmpty();


It looks like stdout and stderr are empty. To add to the confusion, at the end 
of the test I see:


STDERR:
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file /tmp/perf-<pid>.map 
due to Permission denied


This must be a testng issue. I don't deal with testng often, so I'm not sure 
how it might be handling output differently. But clearly there is output on 
stdout and/or stderr, and it is not detected.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/17992#issuecomment-1969782466

Reply via email to