[foreign] RFR 8216284: Make sure test jars are deleted before/after tests
Sundararajan Athijegannathan
sundararajan.athijegannathan at oracle.com
Wed Jan 9 02:28:26 UTC 2019
This change looks good.
PS. I guess the issue of deleting jar file-in-use is Windows specific.
That's why it was never seen on other platforms.
-Sundar
On 08/01/19, 9:28 PM, Jorn Vernee wrote:
> Hi,
>
> I was seeing some errors while running the JextractToolProviderTest
> test, but the test still passed. The errors were from the test jars
> not being able to be deleted because some process was using the file.
> It turns out this was due to JextractToolRunner::loadClass creating a
> URLClassLoader to load classes from the jar, but the classloader never
> being closed causing the file to still be in use when trying to delete
> it. This was throwing IOExceptions which were being printed, but
> otherwise ignored.
>
> With all the errors being thrown and ignored I wasn't sure whether I
> could trust the outcome of the test. Different tests could also
> possibly interfere with each other if they use the same jar file name
> and the jar doesn't get deleted after each test.
>
> I've solved the problem by replacing the loadClass method with a
> classLoader method which returns an AutoCloseable Loader through which
> the classes can be loaded. The close() method on Loader closes the
> class loader. I have also turned the errors I was seeing into hard
> errors to make sure that the tests fail if an IOException occurs
> unexpectedly. To make that possible I switched
> JextractToolRunner::deleteFile to using Files.deleteIfExtists instead
> of delete so that an error will not occur when it is called at the
> start of a test but there's nothing to delete.
>
> JextractToolRunner::classLoader is called with a list of Paths to use
> as class path entries e.g.:
>
> Path helloJar = getOutputFilePath("hello.jar");
> deleteFile(helloJar); // make sure jar does not exist at start of
> test
> Path helloH = getInputFilePath("hello.h");
> run("-o", helloJar.toString(), helloH.toString()).checkSuccess();
> // create the jar
> try(Loader loader = classLoader(helloJar)) {
> // ... do tests
> } finally { // class loader is closed after try-block
> deleteFile(helloJar); // now succeeds to delete jar
> }
>
> I've replaced calls to loadClass with calls to Loader::loadClass, also
> adding a call to JextractToolRunner::classLoader to the enclosing
> try-blocks. I've also made sure jars are being deleted before /after a
> test in some places where that was not being done.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8216284
> Webrev:
> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8216284/webrev.03/
>
> Thanks,
> Jorn
More information about the panama-dev
mailing list