Hi Alan,
I've attached the diff with minor changes:
* multipleOpenTest - check on second call of JIMAGE_Open
* removed corrupted data files from patch and create them in @BeforeTest
block
Should I create new webrev or could I contact Jim or Jean-Francois directly?
Answers on your question:
Yes, the tests could be used in jdk9/dev as well with minor tuning.
Thanks,
Sergi
On 24.11.2015 11:29, Alan Bateman wrote:
On 24/11/2015 00:37, Sergei Pikalev wrote:
Hi All,
http://cr.openjdk.java.net/~jlaskey/8135972/webrev.01/index.html
There are a minimal set of passing cleanly tests which does not explore
bad values touching memory addresses.
Please review.
I assume Jim or Jean-Francois will sponsor this for you. Is
JImagePackageToModuleTest the only test that is unique to jake? I'm
just wondering if we can get these tests into via jdk9/dev.
One thing that isn't clear to me is the multipleOpenTest, I would have
expected a second call to JIMAGE_Open to return a unique handle.
A small comment on JImageOpenCloseTest - I assume this should create
the 0-length or bad-magic jimage file rather than checking in binary
files.
-Alan
diff -r f1fff0daf868 test/jdk/internal/jimage/JImageFindResourceTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/jimage/JImageFindResourceTest.java Wed Nov 25 07:38:39 2015 +0300
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @modules java.base/jdk.internal.jimage
+ * @summary Additional test scenarios for JIMAGE_FindResource method
+ * @modules java.base/jdk.internal.jimage
+ */
+
+import java.io.File;
+
+import jdk.internal.jimage.BasicImageReader;
+import jdk.internal.jimage.ImageNativeSubstrate;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+import org.testng.annotations.Test;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+@Test
+public class JImageFindResourceTest {
+
+ static String JAVA_HOME = System.getProperty("java.home");
+
+ static String imageFile = JAVA_HOME + File.separator + "lib" + File.separator
+ + "modules" + File.separator + "bootmodules.jimage";
+
+ @DataProvider(name="modules")
+ static Object[][] loadModules() {
+ return new Object[][] {
+ { "bad.module" }
+ };
+ }
+
+ @DataProvider(name="classes")
+ static Object[][] loadClasses() {
+ return new Object[][] {
+ { "no/such/Class.class" }
+ };
+ }
+
+ @DataProvider(name="versions")
+ static Object[][] loadVersions() {
+ return new Object[][] {
+ { "noversion" },
+ { "8.0" }
+ };
+ }
+
+ @Test(dataProvider="modules")
+ static void badModuleNameTest(String badModule) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long[] size = new long[1];
+ long result = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, badModule, "9.0", "java/lang/String.class", size);
+
+ System.out.println("FindResource with bad module " + badModule + " returns " + result);
+ Assert.assertTrue(result == 0, "FindResource returns " + result + " instead of 0");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ @Test(dataProvider="classes")
+ static void badClassNameTest(String badClass) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long[] size = new long[1];
+ long result = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, "java.base", "9.0", badClass, size);
+
+ System.out.println("FindResource with bad class " + badClass + " returns " + result);
+ Assert.assertTrue(result == 0, "FindResource returns " + result + " instead of 0");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ @Test(dataProvider="versions")
+ static void badVersionTest(String badVersion) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long[] size = new long[1];
+ long result = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, "java.base", badVersion, "java/lang/String.class", size);
+
+ System.out.println("FindResource with bad version " + badVersion + " returns " + result);
+ Assert.assertFalse(result == 0, "FindResource returns " + result + " instead of 0");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ // main method to run standalone from jtreg
+
+ @Test(enabled=false)
+ @Parameters({"x"})
+ @SuppressWarnings("raw_types")
+ public static void main(@Optional String[] args) {
+ Class<?>[] testclass = { JImageFindResourceTest.class };
+ TestNG testng = new TestNG();
+ testng.setTestClasses(testclass);
+ testng.run();
+ }
+}
diff -r f1fff0daf868 test/jdk/internal/jimage/JImageGetResourceTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/jimage/JImageGetResourceTest.java Wed Nov 25 07:38:39 2015 +0300
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @modules java.base/jdk.internal.jimage
+ * @summary Additional test scenarios for JIMAGE_GetResource method
+ * @modules java.base/jdk.internal.jimage
+ */
+
+import java.io.File;
+
+import jdk.internal.jimage.BasicImageReader;
+import jdk.internal.jimage.ImageNativeSubstrate;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+import org.testng.annotations.Test;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+@Test
+public class JImageGetResourceTest {
+
+ static String JAVA_HOME = System.getProperty("java.home");
+
+ static String imageFile = JAVA_HOME + File.separator + "lib" + File.separator
+ + "modules" + File.separator + "bootmodules.jimage";
+
+ static long maxCount = max();
+ static long resSize = size();
+
+ @DataProvider(name="buffers")
+ static Object[][] loadBuffers() {
+ return new Object[][] {
+ { "zero size" },
+ { "half size" }
+ };
+ }
+
+ @DataProvider(name="sizes")
+ static Object[][] loadSizes() {
+ return new Object[][] {
+ { new Long(0) }
+ };
+ }
+
+ @Test(dataProvider="buffers")
+ static void badBufferTest(String badBuffer) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long[] size = new long[1];
+ long location = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, "java.base", "9.0", "java/lang/String.class", size);
+
+ long desiredSize = size[0];
+ byte[] buffer = null;
+ switch (badBuffer) {
+ case "zero size":
+ buffer = new byte[] {};
+ break;
+ case "half size":
+ buffer = new byte[(int)desiredSize / 2];
+ break;
+ }
+
+ long actualSize = ImageNativeSubstrate.JIMAGE_GetResource(
+ jimageHandle, location, buffer, desiredSize);
+
+ System.out.println("GetResource with bad buffer " + badBuffer + " returns " + actualSize);
+ Assert.assertTrue(actualSize == 0, "GetResource returns " + actualSize + " instead of 0");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ @Test(dataProvider="sizes")
+ static void badSizeTest(Long badSize) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long[] size = new long[1];
+ long location = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, "java.base", "9.0", "java/lang/String.class", size);
+
+ long desiredBadSize = badSize.longValue();
+ byte[] buffer = new byte[(int)desiredBadSize];
+ long actualSize = ImageNativeSubstrate.JIMAGE_GetResource(
+ jimageHandle, location, buffer, desiredBadSize);
+
+ System.out.println("GetResource with bad size " + desiredBadSize
+ + " and real size " + size[0] + " returns " + actualSize);
+ long refSize = (desiredBadSize <= 0) ? 0 : desiredBadSize;
+ Assert.assertTrue(actualSize == refSize, "GetResource returns " + desiredBadSize + " instead of 0");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ static long max() {
+ try {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+ String[] names = new String[1];
+ int max = ImageNativeSubstrate.JIMAGE_Resources(jimageHandle, names);
+ return (long)max;
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ static long size() {
+ try {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+ long[] size = new long[1];
+ long location = ImageNativeSubstrate.JIMAGE_FindResource(
+ jimageHandle, "java.base", "9.0", "java/lang/String.class", size);
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ return size[0];
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ // main method to run standalone from jtreg
+
+ @Test(enabled=false)
+ @Parameters({"x"})
+ @SuppressWarnings("raw_types")
+ public static void main(@Optional String[] args) {
+ Class<?>[] testclass = { JImageGetResourceTest.class };
+ TestNG testng = new TestNG();
+ testng.setTestClasses(testclass);
+ testng.run();
+ }
+}
diff -r f1fff0daf868 test/jdk/internal/jimage/JImageOpenCloseTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/jimage/JImageOpenCloseTest.java Wed Nov 25 07:38:39 2015 +0300
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @modules java.base/jdk.internal.jimage
+ * @summary Additional test scenarios for JIMAGE_Open/JIMAGE_Close methods
+ * @modules java.base/jdk.internal.jimage
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import jdk.internal.jimage.BasicImageReader;
+import jdk.internal.jimage.ImageNativeSubstrate;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeTest;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+@Test
+public class JImageOpenCloseTest {
+
+ static String JAVA_HOME = System.getProperty("java.home");
+ static String TEST_SRC = System.getProperty("test.src");
+ static String TEST_DATA;
+
+ static String imageFile = JAVA_HOME + File.separator + "lib" + File.separator
+ + "modules" + File.separator + "bootmodules.jimage";
+
+ @BeforeTest
+ public void createTestData() throws Exception {
+ File dataDir = new File("data");
+ if (!dataDir.exists())
+ dataDir.mkdir();
+
+ TEST_DATA = dataDir.getCanonicalPath();
+
+ // create empty
+ File empty = new File(dataDir, "empty.jimage");
+ boolean created = empty.createNewFile();
+ if (!created)
+ throw new RuntimeException("Cannot create data file " + empty.getCanonicalPath());
+
+ // create wrong magic
+ byte[] magic = new byte[] { (byte)0xb1, (byte)0xb1, (byte)0xfe, (byte)0xca };
+ File wrong = new File(dataDir, "wrongmagic.jimage");
+ created = wrong.createNewFile();
+ if (!created)
+ throw new RuntimeException("Cannot create data file " + wrong.getCanonicalPath());
+ try (FileOutputStream out = new FileOutputStream(wrong)) {
+ out.write(magic);
+ out.flush();
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot write data to file " + wrong.getCanonicalPath());
+ }
+ }
+
+ @DataProvider(name="badimages")
+ static Object[][] getImages() {
+ return new Object[][] {
+ { TEST_DATA + File.separator + "nonexisting.jimage" },
+ { TEST_DATA + File.separator + "empty.jimage" },
+ { TEST_DATA + File.separator + "wrongmagic.jimage" }
+ };
+ }
+
+ @Test
+ static void multipleOpenTest() throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ long jimageHandle1 = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ System.out.println("Multiple open ids first = " + jimageHandle + "; last = " + jimageHandle1);
+ Assert.assertTrue(jimageHandle == jimageHandle1, "multiple open should have same handle");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ @Test(dataProvider="badimages")
+ public static void badJImagesTest(String jimageName) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(jimageName);
+
+ System.out.println("Open bad image: " + jimageName + " returns " + jimageHandle);
+ Assert.assertTrue(jimageHandle == 0, "bad jimage should not be opened");
+ }
+
+ @Test
+ static void multipleCloseTest() throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ System.out.println("Close the same jimage several times");
+ for (int i = 0; i < 10; i++) {
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+ }
+
+ // main method to run standalone from jtreg
+
+ @Test(enabled=false)
+ @Parameters({"x"})
+ @SuppressWarnings("raw_types")
+ public static void main(@Optional String[] args) {
+ Class<?>[] testclass = { JImageOpenCloseTest.class };
+ TestNG testng = new TestNG();
+ testng.setTestClasses(testclass);
+ testng.run();
+ }
+}
diff -r f1fff0daf868 test/jdk/internal/jimage/JImagePackageToModuleTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/jimage/JImagePackageToModuleTest.java Wed Nov 25 07:38:39 2015 +0300
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @modules java.base/jdk.internal.jimage
+ * @summary Additional test scenarios for JIMAGE_PackageToModule method
+ * @modules java.base/jdk.internal.jimage
+ */
+
+import java.io.File;
+
+import jdk.internal.jimage.BasicImageReader;
+import jdk.internal.jimage.ImageNativeSubstrate;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+import org.testng.annotations.Test;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+@Test
+public class JImagePackageToModuleTest {
+
+ static String JAVA_HOME = System.getProperty("java.home");
+
+ static String imageFile = JAVA_HOME + File.separator + "lib" + File.separator
+ + "modules" + File.separator + "bootmodules.jimage";
+
+ @DataProvider(name="packages")
+ static Object[][] loadPackages() {
+ return new Object[][] {
+ { "does/not/exist" }
+ };
+ }
+
+ @Test(dataProvider="packages")
+ static void incorrectPackageValueTest(String packageName) throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ String modName = ImageNativeSubstrate.JIMAGE_PackageToModule(jimageHandle, packageName);
+
+ System.out.println("PackageToModule with package " + packageName + " returns " + modName);
+ Assert.assertTrue(modName == null, "PackageToModule with package " + packageName
+ + " returns " + modName + " instead of null");
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ // main method to run standalone from jtreg
+
+ @Test(enabled=false)
+ @Parameters({"x"})
+ @SuppressWarnings("raw_types")
+ public static void main(@Optional String[] args) {
+ Class<?>[] testclass = { JImagePackageToModuleTest.class };
+ TestNG testng = new TestNG();
+ testng.setTestClasses(testclass);
+ testng.run();
+ }
+}
diff -r f1fff0daf868 test/jdk/internal/jimage/JImageResourcesTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/jimage/JImageResourcesTest.java Wed Nov 25 07:38:39 2015 +0300
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @modules java.base/jdk.internal.jimage
+ * @summary Additional test scenarios for JIMAGE_Resources method
+ * @modules java.base/jdk.internal.jimage
+ */
+
+import java.io.File;
+
+import jdk.internal.jimage.BasicImageReader;
+import jdk.internal.jimage.ImageNativeSubstrate;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+import org.testng.annotations.Test;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+@Test
+public class JImageResourcesTest {
+
+ static String JAVA_HOME = System.getProperty("java.home");
+
+ static String imageFile = JAVA_HOME + File.separator + "lib" + File.separator
+ + "modules" + File.separator + "bootmodules.jimage";
+
+ @Test
+ static void badNamesArrayTest() throws Exception {
+ long jimageHandle = ImageNativeSubstrate.JIMAGE_Open(imageFile);
+
+ String[] names = new String[1024];
+ int max1 = ImageNativeSubstrate.JIMAGE_Resources(jimageHandle, names);
+ int max2 = ImageNativeSubstrate.JIMAGE_Resources(jimageHandle, null);
+
+ System.out.println("Resources with null array returns " + max2);
+ Assert.assertTrue(max1 == max2, "GetResource returns " + max2 + " instead of " + max1);
+
+ ImageNativeSubstrate.JIMAGE_Close(jimageHandle);
+ }
+
+ // main method to run standalone from jtreg
+
+ @Test(enabled=false)
+ @Parameters({"x"})
+ @SuppressWarnings("raw_types")
+ public static void main(@Optional String[] args) {
+ Class<?>[] testclass = { JImageResourcesTest.class };
+ TestNG testng = new TestNG();
+ testng.setTestClasses(testclass);
+ testng.run();
+ }
+}