RFR(S): 8181592: [TESTBUG] Docker test utils and docker jdk basic test

mikhailo mikhailo.seledtsov at oracle.com
Thu Oct 5 00:27:46 UTC 2017


Hi Igor,

   Thank you for review. Please see my comments in line.


On 10/03/2017 04:29 PM, Igor Ignatyev wrote:
> Hi Misha,
>
> 1st of all, thank you for working on this very important piece. it 
> generally looks great, although I have a number of mostly stylistic 
> comments.
>
> http://cr.openjdk.java.net/~mseledtsov/8181592.02/test/hotspot/jtreg/runtime/containers/docker/DockerBasicTest.java.html 
> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.02/test/hotspot/jtreg/runtime/containers/docker/DockerBasicTest.java.html>
>>    29  * @requires (docker.support == "true")
> 1. although all properties in requires context are strings, jtreg does 
> support boolean, so this line can be simplified to '@requires 
> (docker.support'
Fixed
>>    31  * @modules java.base/jdk.internal.misc
>>    32  * @modules java.management
>>    33  *          jdk.jartool/sun.tools.jar
> 2. could you please use one style? either add @modules to all lines or 
> leave it only at L#31
Fixed
>
>>    35  * @run main DockerBasicTest
> 3. do we have to run DockerBasicTest in JDK under test? can't it be 
> run as @run driver?
Fixed
>>    46         if (!DockerTestUtils.canTestDocker())
>>    47             return;
> 4. it's been proven to be less error prone to have { } even for 
> one-line blocks, could you please add them here?
OK, updated the changes. Will also use this style from now on.
>
>>    72             .addDockerOpts("--volume", System.getProperty("test.classes") + ":/test-classes/");
> 5. as you already depend on jdk.test.lib, it might be better to 
> reuse Utils::TEST_CLASSES
Fixed

>>    74         DockerTestUtils.dockerRunJava(opts).
>>    75             shouldHaveExitValue(0).shouldContain("Hello Docker");
> 6. lines shouldn't end w/ '.', it should be moved to next line and 
> preferable be alined w/ 1st '.' in prev line. I have seen in other 
> files as well.
> I'd also like to see exact one method call per line.
OK. Updated this and other similar lines to have one statement per line.
>
>
> http://cr.openjdk.java.net/~mseledtsov/8181592.02/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java.html 
> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.02/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java.html>
>>    47     // Diagnostics: set to true to enable more diagnostic info
>>    48     private static final boolean DEBUG = false;
> 1. I'd prefer to always have all available diagnostic info. is there 
> any problem w/ having DEBUG=true?
OK, I have removed the DEBUG, and make sure I always output the 
diagnostic info that was conditional on this DEBUG flag.
This also lead to removal of "printChildOutput" parameter for execute(), 
which further simplified the code.
>>   129         Files.createDirectories(jdkDstDir);
>> ...
>>   133         Files.walkFileTree(jdkSrcDir, new CopyFileVisitor(jdkSrcDir, jdkDstDir));
> 2. since jdkDstDir is supposed to be empty, you can use Files::copy 
> method to copy the dir.
Looks like files.copy does not copy the full tree recursively, so I 
still need a CopyFileVisitor.
>
>>   126         Path jdkSrcDir = Paths.get(System.getProperty("test.jdk"));
> 3. again, as you already depend on jdk.test.lib, it might be better to 
> reuse Utils::TEST_JDK
Fixed
>
>>   149     public static void
>>   150         buildDockerImage(String imageName, Path dockerfile, Path buildDir) throws Exception {
>>   213     public static OutputAnalyzer execute(boolean retainChildStdout, String... command)
>>   214         throws Exception {
>>   230     public static OutputAnalyzer execute(boolean retainChildStdout, List<String> command)
>>   231         throws Exception {
> 4. when you wrap a line, you should use double indentation, otherwise 
> one can misread it, in last two examples I read throws Exception as 
> 1st statement of a method.
Fixed
>
> 5. your 'execute(boolean, String...)' creates a list from 'command' 
> array and calls 'execute(boolean, List<String>)', which create an 
> array from 'command' list and pass it to ProcessBuilder::new. should 
> we make 'execute(boolean, List<String>)' call 'execute(boolean, 
> String...)' and move all the logic to the latter?
>
> also, there are easier ways to get a list from an arrays -- 
> j.u.Arrays.asList(T...) or j.u.List.of(T...)
>
Fixed.

I have also corrected/updated JavaDoc comments.

I will post the updated webrev once I address comments from Leonid.


Thank you,
Misha

> Thanks,
> -- Igor
>
>
>> On Sep 28, 2017, at 3:11 PM, Mikhailo Seledtsov 
>> <mikhailo.seledtsov at oracle.com 
>> <mailto:mikhailo.seledtsov at oracle.com>> wrote:
>>
>> Here is the updated webrev:
>> http://cr.openjdk.java.net/~mseledtsov/8181592.02/ 
>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.02/>
>>
>>
>> Leonid, George - thank you for your comments.
>> In addition to addressing your feedback, I also did:
>>  - implemented @requires docker.support
>>  - added dockerRunJava() method and associated data structure 
>> DockerRunOptions, for running Java tests inside
>>     docker environment, and to account for java opts, test java opts, 
>> docker opts, classes and class params
>>  - added a simple HelloWorld test case that runs HelloWorld inside a 
>> container
>>  - ran jtreg with extra Java options, make sure they are added 
>> correctly to the docker run command
>>  - added docker image cleanup after testing is done
>>
>>
>> Please review.
>>
>> Misha
>>
>>
>> On 9/27/17, 11:00 AM, mikhailo wrote:
>>> Leonid,
>>>
>>> Thank you for review and constructive feedback. See my comment in line.
>>>
>>>
>>> On 09/26/2017 11:19 AM, Leonid Mesnik wrote:
>>>> Misha
>>>>
>>>> http://cr.openjdk.java.net/~mseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/DockerBasicTest.java.html 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/DockerBasicTest.java.html> 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/DockerBasicTest.java.html> 
>>>>
>>>> Copyright is incorrect, need to updated it for GPL.
>>> Fixed
>>>>
>>>> The Hotspot is Oracle VM name only so test might fail for OpenJDK. 
>>>> I think you need to fix this check.
>>> I see. I fixed this by using Platform.vmName which should be correct 
>>> in all cases. I double-checked with OpenJDK also.
>>>>
>>>> The requires checks only that test is executed only on the 64-bit 
>>>> linux. Does it make a sense to introduce more docker-specific check?
>>> I agree this is a better way. I will do some prototyping; if such 
>>> check is feasible and efficient in at requires then I will add it.
>>>>
>>>>
>>>> http://cr.openjdk.java.net/~mseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/Dockerfile-BasicTest.html 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/Dockerfile-BasicTest.html> 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/hotspot/jtreg/runtime/containers/docker/Dockerfile-BasicTest.html> 
>>>>
>>>> Could you please explain why oraclelinux 7.0 is used as a base 
>>>> image for test.
>>> I have upgraded to Oracle Linux 7.2. If we have specific requirement 
>>> I will change it to that. If we have requirements in the future to 
>>> support multiple OS, I can add Dockerfile generation.
>>> For this basic sanity tests I think this should suffice.
>>>>
>>>> http://cr.openjdk.java.net/~mseledtsov/8181592.00/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java.html 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java.html> 
>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java.html> 
>>>>
>>>> The content looks fine.
>>>>
>>>> I don’t see anything to clean up docker images on the system. Could 
>>>> you please explain how tests are going to cleanup images.
>>> To clean up containers I will add "--rm" to the 'docker run' 
>>> command. This should ensure that container data is removed after 
>>> container stops.
>>> As for the image - I use the same image name. The image will stay in 
>>> the local registry unless manually removed. I should probably do 
>>> 'docker rmi' at the end of the test to clean this up.
>>>
>>>
>>> Once I implement these changes I will send the updated webrev.
>>>
>>> Thank you,
>>> Misha
>>>>
>>>> Leonid
>>>>
>>>>
>>>>> On Sep 21, 2017, at 5:58 PM, mikhailo 
>>>>> <mikhailo.seledtsov at oracle.com 
>>>>> <mailto:mikhailo.seledtsov at oracle.com> 
>>>>> <mailto:mikhailo.seledtsov at oracle.com>> wrote:
>>>>>
>>>>> Please review this initial drop of Docker test utils and a sanity 
>>>>> test. This change lays ground
>>>>> for further test development and test utils improvement in this area.
>>>>>
>>>>>    JBS: https://bugs.openjdk.java.net/browse/JDK-8181592
>>>>>    Webrev: http://cr.openjdk.java.net/~mseledtsov/8181592.00/ 
>>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/> 
>>>>> <http://cr.openjdk.java.net/%7Emseledtsov/8181592.00/>
>>>>>    Testing:
>>>>>       - run this test on machine with Docker enabled - works
>>>>>       - run this test on Linux-x64 with no Docker engine or Docker 
>>>>> disabled - test skipped (as expected)
>>>>>       - run this test on automated system - in progress
>>>>>
>>>>>
>>>>> Thank you,
>>>>> Misha
>>>>>
>>>>
>>>
>



More information about the hotspot-runtime-dev mailing list