Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2017-05-31 10:17:08 +0000
committerMickael Istria2017-07-20 07:05:39 +0000
commitb4d87abfcd5f1fefa2e93356870e88076944b5cb (patch)
tree019dbff60e72badb1b0ce6816fe339daf2ecda57
parent7a70cad4c1327f1672ee7b9435e4a392345665c8 (diff)
downloadeclipse.platform.ua-b4d87abfcd5f1fefa2e93356870e88076944b5cb.tar.gz
eclipse.platform.ua-b4d87abfcd5f1fefa2e93356870e88076944b5cb.tar.xz
eclipse.platform.ua-b4d87abfcd5f1fefa2e93356870e88076944b5cb.zip
Bug 517353 - Automated tests verifying validity of links in Help
Change-Id: I95892358e46b1deb6c1ce1717a24bd4865fa8f43 Signed-off-by: Mickael Istria <mistria@redhat.com>
-rw-r--r--org.eclipse.ua.tests.doc/.classpath2
-rw-r--r--org.eclipse.ua.tests.doc/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.ua.tests.doc/pom.xml2
-rw-r--r--org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/AllTests.java5
-rw-r--r--org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/internal/linkchecker/LinkTest.java109
5 files changed, 115 insertions, 5 deletions
diff --git a/org.eclipse.ua.tests.doc/.classpath b/org.eclipse.ua.tests.doc/.classpath
index eca7bdba8..4f83b2397 100644
--- a/org.eclipse.ua.tests.doc/.classpath
+++ b/org.eclipse.ua.tests.doc/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/org.eclipse.ua.tests.doc/META-INF/MANIFEST.MF b/org.eclipse.ua.tests.doc/META-INF/MANIFEST.MF
index f58be3eb7..5794ba38a 100644
--- a/org.eclipse.ua.tests.doc/META-INF/MANIFEST.MF
+++ b/org.eclipse.ua.tests.doc/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Doc
Bundle-SymbolicName: org.eclipse.ua.tests.doc;singleton:=true
-Bundle-Version: 1.0.300.qualifier
+Bundle-Version: 1.0.400.qualifier
Bundle-Activator: org.eclipse.ua.tests.doc.internal.Activator
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
diff --git a/org.eclipse.ua.tests.doc/pom.xml b/org.eclipse.ua.tests.doc/pom.xml
index 329c08d22..cd88de416 100644
--- a/org.eclipse.ua.tests.doc/pom.xml
+++ b/org.eclipse.ua.tests.doc/pom.xml
@@ -19,7 +19,7 @@
</parent>
<groupId>org.eclipse.ua</groupId>
<artifactId>org.eclipse.ua.tests.doc</artifactId>
- <version>1.0.300-SNAPSHOT</version>
+ <version>1.0.400-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
diff --git a/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/AllTests.java b/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/AllTests.java
index a8221fd74..27352a6a4 100644
--- a/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/AllTests.java
+++ b/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/AllTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2016 IBM Corporation and others.
+ * Copyright (c) 2009, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,6 +11,7 @@
package org.eclipse.ua.tests.doc;
import org.eclipse.ua.tests.doc.internal.linkchecker.ApiDocTest;
+import org.eclipse.ua.tests.doc.internal.linkchecker.LinkTest;
import org.eclipse.ua.tests.doc.internal.linkchecker.PrebuiltIndexChecker;
import org.eclipse.ua.tests.doc.internal.linkchecker.TocLinkChecker;
import org.junit.runner.RunWith;
@@ -20,6 +21,6 @@ import org.junit.runners.Suite;
* Tests all user assistance functionality (automated).
*/
@RunWith(Suite.class)
-@Suite.SuiteClasses({ PrebuiltIndexChecker.class, TocLinkChecker.class, ApiDocTest.class })
+@Suite.SuiteClasses({ PrebuiltIndexChecker.class, TocLinkChecker.class, ApiDocTest.class, LinkTest.class })
public class AllTests {
}
diff --git a/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/internal/linkchecker/LinkTest.java b/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/internal/linkchecker/LinkTest.java
new file mode 100644
index 000000000..2f9f05e3c
--- /dev/null
+++ b/org.eclipse.ua.tests.doc/src/org/eclipse/ua/tests/doc/internal/linkchecker/LinkTest.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Red Hat Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mickael Istria (Red Hat Inc.) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ua.tests.doc.internal.linkchecker;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.help.internal.base.BaseHelpSystem;
+import org.eclipse.help.internal.search.ISearchHitCollector;
+import org.eclipse.help.internal.search.ISearchQuery;
+import org.eclipse.help.internal.search.QueryTooComplexException;
+import org.eclipse.help.internal.search.SearchHit;
+import org.eclipse.help.internal.search.SearchQuery;
+import org.eclipse.ui.PlatformUI;
+
+import junit.framework.TestCase;
+
+public class LinkTest extends TestCase {
+
+ public void testAllLinks() {
+ ISearchQuery query = new SearchQuery("*", false, Collections.emptyList(), Platform.getNL());
+ final Set<URI> indexedPagesURIs = new HashSet<>();
+ ISearchHitCollector collector = new ISearchHitCollector() {
+ @Override
+ public void addQTCException(QueryTooComplexException exception) throws QueryTooComplexException {
+ throw exception;
+ }
+
+ @Override
+ public void addHits(List<SearchHit> hits, String wordsSearched) {
+ hits.stream().map(SearchHit::getHref).map(href -> {
+ try {
+ return PlatformUI.getWorkbench().getHelpSystem().resolve(href, false).toURI();
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }).peek(System.err::println).forEach(indexedPagesURIs::add);
+ }
+ };
+ BaseHelpSystem.getSearchManager().search(query, collector, new NullProgressMonitor());
+ Set<String> linkFailures = Collections.synchronizedSet(new HashSet<>());
+ Set<Exception> ex = Collections.synchronizedSet(new HashSet<>());
+ Set<URI> allKnownPageURIs = new HashSet<>(indexedPagesURIs);
+ indexedPagesURIs.parallelStream().forEach(t -> {
+ try (InputStream stream = t.toURL().openStream()) {
+ linkFailures.addAll(checkLinks(stream, t, allKnownPageURIs));
+ } catch (IOException e) {
+ ex.add(e);
+ }
+ });
+ assertEquals(Collections.emptySet(), ex);
+ assertEquals(Collections.emptySet(), linkFailures);
+ }
+
+ private Set<String> checkLinks(InputStream stream, URI currentDoc, Set<URI> knownPagesURIs) throws IOException {
+ Set<String> res = new HashSet<>();
+ BufferedReader in = new BufferedReader(new InputStreamReader(stream));
+ String inputLine;
+ while ((inputLine = in.readLine()) != null) {
+ int index = 0;
+ while ((index = inputLine.indexOf("<a href=\"", index)) > 0) {
+ int closeIndex = inputLine.indexOf('"', index + "<a href=\"".length());
+ URI href = URI.create(inputLine.substring(index + "<a href=\"".length(), closeIndex).replace(" ", "%20"));
+ index = closeIndex;
+ if (href.isAbsolute()) {
+ continue;
+ }
+ URI linkURI = URI.create(currentDoc.toString() + "/../" + href).normalize();
+ if (knownPagesURIs.contains(linkURI)) { //page already indexed or successfully visited
+ // we already know this help page exists as it is indexed
+ continue;
+ } else { // page isn't indexed: can be generated navigation page
+ //check whether it's existing anyway
+ HttpURLConnection connection = (HttpURLConnection) linkURI.toURL().openConnection();
+ connection.setRequestMethod("HEAD");
+ connection.connect();
+ if (connection.getResponseCode() != 200) {
+ res.add("Link from " + currentDoc + " to " + href + " is broken: target URI " + linkURI + " doens't exist.");
+ } else {
+ knownPagesURIs.add(linkURI);
+ }
+ }
+ }
+ }
+ in.close();
+ return res;
+ }
+
+}

Back to the top