RFR: 8262195: Harden tests that use the HostsFileNameService (jdk.net.hosts.file property)
Conor Cleary
ccleary at openjdk.java.net
Wed Feb 24 16:16:43 UTC 2021
On Wed, 24 Feb 2021 15:57:49 GMT, Aleksei Efimov <aefimov at openjdk.org> wrote:
>> A number of net tests use a **[HostsFileNameService](https://github.com/openjdk/jdk/blob/382e38dd246596ec94a1f1ce0e0f9e87f53366c7/src/java.base/share/classes/java/net/InetAddress.java#L955)** to verify either the functionality of this type of Name Service or as a complement to other tests (such as Caching, Address Format etc.).
>>
>> Intermittent failures of these tests can be caused by tools used during JVM start-up accessing/initialising classes sooner than may be expected which can cause unexpected behaviour. Most commonly, this unexpected behaviour takes the form of the **[PlatformNameService](https://github.com/openjdk/jdk/blob/382e38dd246596ec94a1f1ce0e0f9e87f53366c7/src/java.base/share/classes/java/net/InetAddress.java#L927)** being used despite a call to `System.setProperty("jdk.net.hosts.file", ...)` in the test file. Due to the fact that **InetAddress** initialises it's Implementation and Name Service fields in a static class initialiser ([see L1132 of InetAddress.java](https://github.com/openjdk/jdk/blob/382e38dd246596ec94a1f1ce0e0f9e87f53366c7/src/java.base/share/classes/java/net/InetAddress.java#L1132)) and that the default mode is to use the **Platform Name Service**, setting a system property in the main method to specify the use of **HostsFileNameService** (with the jdk.net.hosts.file property)
has no affect if the class has been previously accessed during JVM start-up and **InetAddress** will default to the **PlatformNameService** which is unsuitable for this test. This explains the intermittent failures caused by the use of `System.setProperty("jdk.net.hosts.file", ...)`.
>>
>> This fix improves the robustness of this test by specifying the use of the **HostsFileNameService** in the `@run` tag for this test via the previously mentioned system property. This gives certainty that the property will be properly set in time for the actual run of this test after the JVM has booted. An example of one the fixes...
>> * @run main/othervm -Djdk.net.hosts.file=TestToNumericFormatHosts textToNumericFormat
>
> test/jdk/java/net/InetAddress/InternalNameServiceTest.java line 30:
>
>> 28: * a file name that contains address host mappings, similar to those in
>> 29: * /etc/hosts file.
>> 30: * @run main/othervm -Djdk.net.hosts.file=${test.src}/TestHosts -Dsun.net.inetaddr.ttl=0
>
> Maybe the `TestHosts` file can be removed from the repository, and `-Djdk.net.hosts.file` value can be changed to `TestHosts` file:
> With such change the test host file will be generated in `scratch` directory, and in case of test failures it won't modify the file stored in repository.
I was thinking this also, will update that in my next push along with the copyright years (oops!)
-------------
PR: https://git.openjdk.java.net/jdk/pull/2703
More information about the net-dev
mailing list