Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimeon Andreev2018-11-15 15:49:39 +0000
committerAndrey Loskutov2018-11-21 10:26:18 +0000
commite806c1bd197e74293615d1ceb885b332b0a30e13 (patch)
tree2d67bae1fd79c375a0939d249d3dd47733374845
parent2694f7535100af1572684864d4c954a7360151ab (diff)
downloadeclipse.jdt.core-e806c1bd197e74293615d1ceb885b332b0a30e13.tar.gz
eclipse.jdt.core-e806c1bd197e74293615d1ceb885b332b0a30e13.tar.xz
eclipse.jdt.core-e806c1bd197e74293615d1ceb885b332b0a30e13.zip
Bug 413114 - added more outputs when test fails and an extra testS4_10_0_M3I20181121-1800I20181121-0910I20181121-0600
This change adds more outputs if JavaSearchBugTests2.testBug376673e is about to fail. In particular, the outputs will contain: 1. The classpath entries of the test project. 2. The IJavaElement children of the test project, such as jars and types in the jar. 3. The entire contents of the test jar, including de-compiled class files. Change-Id: I318ee0678988438cc8f4c698db5297a8a4763ac0 Signed-off-by: Simeon Andreev <simeon.danailov.andreev@gmail.com>
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/Bug376673Test.java93
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java103
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java1
3 files changed, 196 insertions, 1 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/Bug376673Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/Bug376673Test.java
new file mode 100644
index 0000000000..010f0dea69
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/Bug376673Test.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Simeon Andreev and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Simeon Andreev - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.IJavaProject;
+
+import junit.framework.Test;
+
+public class Bug376673Test extends ModifyingResourceTests {
+
+ public Bug376673Test(String name) {
+ super(name);
+ this.endChar = "";
+ }
+
+ public static Test suite() {
+ return buildModelTestSuite(Bug376673Test.class);
+ }
+
+ /**
+ * An extra test for bug 413114 in the context of bug 376673.
+ * We want to know whether we can compile with when using a class from a jar as created in
+ * {@link org.eclipse.jdt.core.tests.model.JavaSearchBugsTests2#testBug376673e()}.
+ */
+ public void testBug376673() throws Exception {
+ try {
+ if ("macosx".equals(System.getProperty("osgi.os"))) {
+ return;
+ }
+ IJavaProject p = createJavaProject("P", new String[] { "src" }, new String[] { "/P/lib376673.jar", "JCL17_LIB" }, "bin", "1.7");
+
+ org.eclipse.jdt.core.tests.util.Util.createJar(
+ new String[] { "p\uD842\uDF9F/i\uD842\uDF9F/Test.java",
+ "package p\uD842\uDF9F.i\uD842\uDF9F;\n" + "public class Test{}\n" },
+ p.getProject().getLocation().append("lib376673.jar").toOSString(), "1.7");
+
+ createFolder("/P/src/pkg");
+ String[] classFileContent = new String[] {
+ "package pkg;",
+ "class UseJarClass {",
+ " public p\uD842\uDF9F.i\uD842\uDF9F.Test test;",
+ "}",
+ };
+ IFile file = createFile("/P/src/pkg/UseJarClass.java", String.join(System.lineSeparator(), classFileContent), "UTF-8");
+ file.setCharset("UTF-8", null);
+ refresh(p);
+ waitForAutoBuild();
+ waitUntilIndexesReady();
+ IMarker[] markers = p.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
+ List<String> errors = new ArrayList<>();
+ StringBuilder markersToString = new StringBuilder();
+ for (IMarker marker : markers) {
+
+ Integer severity = (Integer) marker.getAttribute(IMarker.SEVERITY);
+ String message = (String) marker.getAttribute(IMarker.MESSAGE);
+ if (severity.intValue() == IMarker.SEVERITY_ERROR) {
+ errors.add(message);
+ }
+
+ markersToString.append("Marker with severity: ");
+ markersToString.append(severity);
+ markersToString.append(", and message: ");
+ markersToString.append(message);
+ markersToString.append(", at location: ");
+ markersToString.append(marker.getAttribute(IMarker.LOCATION));
+ markersToString.append(", at line: ");
+ markersToString.append(marker.getAttribute(IMarker.LINE_NUMBER));
+ }
+ assertEquals("expected no markers on test project, all markers are:" + System.lineSeparator() + markersToString,
+ Collections.emptyList(), errors);
+ } finally {
+ deleteProject("P");
+ }
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
index d08d5a1fda..a4fe9ca797 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
@@ -16,22 +16,38 @@
package org.eclipse.jdt.core.tests.model;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Scanner;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IAccessRule;
+import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IParent;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.MethodNameMatch;
@@ -42,6 +58,7 @@ import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.TypeNameMatch;
import org.eclipse.jdt.core.search.TypeNameMatchRequestor;
+import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.internal.core.search.matching.MatchLocator;
import org.eclipse.jdt.internal.core.search.matching.MethodPattern;
@@ -785,19 +802,48 @@ public class JavaSearchBugsTests2 extends AbstractJavaSearchTests {
return;
}
IJavaProject p = createJavaProject("P", new String[] {}, new String[] { "/P/lib376673.jar", "JCL17_LIB" }, "", "1.7");
+ IPath jarPath = p.getProject().getLocation().append("lib376673.jar");
org.eclipse.jdt.core.tests.util.Util.createJar(
new String[] {
"p\uD842\uDF9F/i\uD842\uDF9F/Test.java",
"package p\uD842\uDF9F.i\uD842\uDF9F;\n" +
"public class Test{}\n" },
- p.getProject().getLocation().append("lib376673.jar").toOSString(),
+ jarPath.toOSString(),
"1.7");
refresh(p);
+ waitForAutoBuild();
waitUntilIndexesReady();
int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES;
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { p }, mask);
search("Test", TYPE, DECLARATIONS, scope, this.resultCollector);
+
+ try {
+ if (this.resultCollector.count == 0) {
+ System.out.println("Test " + getName() + " about to fail, listing extra debug info");
+ System.out.println("LANG env variable: " + System.getenv("LANG"));
+ System.out.println("Listing markers of test project");
+ IMarker[] markers = p.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
+ for (IMarker marker : markers) {
+ System.out.println(marker.getAttribute(IMarker.SEVERITY) + ":" + marker.getAttribute(IMarker.MESSAGE));
+ }
+ System.out.println("Resolved classpath entries for test project:");
+ for (IClasspathEntry e : p.getResolvedClasspath(false)) {
+ System.out.println(e);
+ }
+ System.out.println("All classpath entries for test project:");
+ for (IClasspathEntry e : p.getResolvedClasspath(true)) {
+ System.out.println(e);
+ }
+ printJavaElements(p, System.out);
+ String jarFilePath = jarPath.toOSString();
+ printZipContents(new File(jarFilePath), System.out);
+ }
+ } catch (Throwable t) {
+ System.out.println("Exception occurred while printing extra infos for test " + getName());
+ t.printStackTrace(System.out);
+ }
+
assertSearchResults("lib376673.jar p\uD842\uDF9F.i\uD842\uDF9F.Test [No source] EXACT_MATCH");
} finally {
deleteProject("P");
@@ -2772,4 +2818,59 @@ public class JavaSearchBugsTests2 extends AbstractJavaSearchTests {
deleteProject("P");
}
}
+
+ private static void printJavaElements(IJavaProject javaProject, PrintStream output) throws Exception {
+ output.println("Printing Java elements of Java project: " + javaProject);
+ List<IJavaElement> queue = new LinkedList<>();
+ while (!queue.isEmpty()) {
+ IJavaElement element = queue.remove(queue.size() - 1);
+ output.println(element);
+ output.print(element);
+ if (element instanceof IParent) {
+ IParent parent = (IParent) element;
+ queue.addAll(Arrays.asList(parent.getChildren()));
+ }
+ }
+ }
+
+ private static void printZipContents(File jarFile, PrintStream output) throws Exception {
+ if (jarFile.exists()) {
+ output.println("Listing contents of jar file: " + jarFile);
+ try (ZipFile zipFile = new ZipFile(jarFile)) {
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry zipEntry = entries.nextElement();
+ String zipEntryName = zipEntry.getName();
+ output.println("Listing contents of zip entry: " + zipEntryName);
+ InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry);
+ if (zipEntryName.endsWith(".class")) {
+ byte[] classFileBytes = toByteArray(zipEntryInputStream);
+ ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+ String classContents = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
+ output.println(classContents);
+ } else {
+ @SuppressWarnings("resource") // the zip file resource-try will close the stream
+ Scanner scanner = new Scanner(zipEntryInputStream);
+ while (scanner.hasNextLine()) {
+ output.println(scanner.nextLine());
+ }
+ }
+ }
+ }
+ } else {
+ output.println("File does not exist: " + jarFile);
+ }
+ }
+
+ private static byte[] toByteArray(InputStream inputStream) throws IOException {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ byte[] data = new byte[8192];
+
+ int nRead;
+ while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
+ buffer.write(data, 0, nRead);
+ }
+
+ return buffer.toByteArray();
+ }
} \ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
index 3695005bf6..1333386839 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
@@ -71,6 +71,7 @@ public class RunJavaSearchTests extends junit.framework.TestCase {
allClasses.add(JavaSearchScopeTests.class);
allClasses.add(MatchingRegionsTest.class);
allClasses.add(JavaIndexTests.class);
+ allClasses.add(Bug376673Test.class);
// Reset forgotten subsets of tests
TestCase.TESTS_PREFIX = null;

Back to the top