Fix relative and absolute markdown links within repo

[link](/a) should resolve relative to the top of the
repository, not the top of the host.

[link](../../C) from within A/B/ should correctly
resolve to /C and not a broken link.

Update DocServletTest to fix tests previously broken by anchor
hyperlink widgets (263d674ee88311b3b).

Change-Id: I036c47f22a52d82919f7472c751db766b88d23f7
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
index dffe4f2..56b7227 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
@@ -69,7 +69,7 @@
 
     String html = buildHtml("/repo/+doc/master/README.md");
     assertTrue(html.contains("<title>" + title + "</title>"));
-    assertTrue(html.contains("<h1>" + title + "</h1>"));
+    assertTrue(html.contains(title + "</h1>"));
     assertTrue(html.contains("<a href=\"" + url + "\">Markdown</a>"));
   }
 
@@ -91,7 +91,9 @@
     assertTrue(html.contains("<h2>page</h2>"));
     assertTrue(html.contains("<li><a href=\"index.md\">Home</a></li>"));
     assertTrue(html.contains("<li><a href=\"README.md\">README</a></li>"));
-    assertTrue(html.contains("<h1>page</h1>"));
+    assertTrue(html.contains("<h1>"
+        + "<a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>"
+        + "page</h1>"));
   }
 
   @Test
@@ -106,7 +108,7 @@
         .create();
 
     String html = buildHtml("/repo/+doc/master/");
-    assertTrue(html.contains("<h1>B. Ad</h1>"));
+    assertTrue(html.contains("B. Ad</h1>"));
     assertTrue(html.contains("Non-HTML is fine."));
 
     assertFalse(html.contains("window.alert"));
@@ -121,8 +123,12 @@
       .add("index.md", markdown)
       .create();
     String html = buildHtml("/repo/+doc/master/");
-    assertTrue(html.contains("<a name=\"debug\"><h1>Section</h1></a>"));
-    assertTrue(html.contains("<a name=\"old-school\"><h1>Other</h1></a>"));
+    assertTrue(html.contains("<h1>"
+        + "<a class=\"h\" name=\"debug\" href=\"#debug\"><span></span></a>"
+        + "Section</h1>"));
+    assertTrue(html.contains("<h1>"
+        + "<a class=\"h\" name=\"old-school\" href=\"#old-school\"><span></span></a>"
+        + "Other</h1>"));
   }
 
   @Test
@@ -136,6 +142,26 @@
     assertTrue(html.contains("Incomplete &lt;html is literal."));
   }
 
+  @Test
+  public void relativeLink() throws Exception {
+    repo.branch("master").commit()
+        .add("A/B/README.md", "[c](../../C)")
+        .create();
+
+    String html = buildHtml("/repo/+doc/master/A/B/README.md");
+    assertTrue(html.contains("<a href=\"/b/repo/+show/master/C\">c</a>"));
+  }
+
+  @Test
+  public void absoluteLink() throws Exception {
+    repo.branch("master").commit()
+        .add("README.md", "[c](/x)")
+        .create();
+
+    String html = buildHtml("/repo/+doc/master/README.md");
+    assertTrue(html.contains("<a href=\"/b/repo/+show/master/x\">c</a>"));
+  }
+
   private String buildHtml(String pathAndQuery) throws Exception {
     TestViewFilter.Result res = service(pathAndQuery);
     FakeHttpServletResponse http = res.getResponse();