Merge branch 'stable-2.11'

* stable-2.11:
  Add correct license for asciidoctor

Change-Id: Ib2f7625c5fc28e8c6cb45effc5e290ea45750442
diff --git a/BUCK b/BUCK
index 3cca9ac..46cc0f6 100644
--- a/BUCK
+++ b/BUCK
@@ -6,10 +6,12 @@
   ASCIIDOCTOR = '//lib/asciidoctor:asciidoc_lib'
   DAISYDIFF = '//lib/daisydiff:daisydiff_lib'
   DOCX4J = '//lib/docx4j:docx4j_lib'
+  COMMONS_IO = '//lib/commons:io'
 else:
   ASCIIDOCTOR = '//plugins/x-docs/lib/asciidoctor:asciidoc_lib'
   DAISYDIFF = '//plugins/x-docs/lib/daisydiff:daisydiff_lib'
   DOCX4J = '//plugins/x-docs/lib/docx4j:docx4j_lib'
+  COMMONS_IO = '//plugins/x-docs/lib/commons:io'
 
 gerrit_plugin(
   name = 'x-docs',
@@ -17,9 +19,7 @@
   resources = glob(['src/main/**/*']),
   gwt_module = MODULE,
   manifest_entries = [
-    'Gerrit-PluginName: xdocs',
     'Gerrit-ApiType: plugin',
-    'Gerrit-ApiVersion: 2.11',
     'Gerrit-HttpModule: com.googlesource.gerrit.plugins.xdocs.HttpModule',
     'Gerrit-Module: com.googlesource.gerrit.plugins.xdocs.Module',
     'Gerrit-InitStep: com.googlesource.gerrit.plugins.xdocs.XDocInit',
@@ -28,6 +28,7 @@
     ASCIIDOCTOR,
     DAISYDIFF,
     DOCX4J,
+    COMMONS_IO,
   ],
 )
 
@@ -37,3 +38,12 @@
   deps = [':x-docs__plugin'],
 )
 
+java_test(
+  name = 'x-docs_tests',
+  srcs = glob(['src/test/java/**/*.java']),
+  labels = ['xdocs'],
+  source_under_test = [':x-docs__plugin'],
+  deps = GERRIT_PLUGIN_API + GERRIT_TESTS + [
+    ':x-docs__plugin',
+  ],
+)
diff --git a/VERSION b/VERSION
index 920fe49..9df7bf7 100644
--- a/VERSION
+++ b/VERSION
@@ -1,5 +1,5 @@
 # Used by BUCK to include "Implementation-Version" in plugin Manifest.
 # If this file doesn't exist the output of 'git describe' is used
 # instead.
-PLUGIN_VERSION = '2.11'
+PLUGIN_VERSION = '2.12-SNAPSHOT'
 
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
index e48e352..f1ab768 100644
--- a/lib/gerrit/BUCK
+++ b/lib/gerrit/BUCK
@@ -1,12 +1,12 @@
 include_defs('//bucklets/maven_jar.bucklet')
 
-VER = '2.11.7'
+VER = '2.12'
 REPO = MAVEN_CENTRAL
 
 maven_jar(
   name = 'plugin-api',
   id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
-  sha1 = 'e49e930c5c4ce74fc2c4c1cde1ddfb3ff77d0d63',
+  sha1 = '8ce1f6e65078bbcf03a1758f96b3ebca19b7fe3c',
   attach_source = False,
   repository = REPO,
   license = 'Apache2.0',
@@ -15,7 +15,7 @@
 maven_jar(
   name = 'gwtui-api',
   id = 'com.google.gerrit:gerrit-plugin-gwtui:' + VER,
-  sha1 = '1dc70f829c0b5310141dd9bd12e1bafcda48724f',
+  sha1 = 'a7e7d82746b847678022242ec9eb44d1f16e8639',
   attach_source = False,
   repository = REPO,
   license = 'Apache2.0',
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index f3eb9e2..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,355 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.googlesource.gerrit.plugins.xdocs</groupId>
-  <artifactId>xdocs</artifactId>
-  <packaging>jar</packaging>
-  <version>2.11.7</version>
-  <name>xdocs</name>
-
-  <properties>
-    <Gerrit-ApiType>plugin</Gerrit-ApiType>
-    <Gerrit-ApiVersion>${project.version}</Gerrit-ApiVersion>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <version>2.4</version>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Gerrit-PluginName>xdocs</Gerrit-PluginName>
-              <Gerrit-HttpModule>com.googlesource.gerrit.plugins.xdocs.HttpModule</Gerrit-HttpModule>
-              <Gerrit-Module>com.googlesource.gerrit.plugins.xdocs.Module</Gerrit-Module>
-              <Gerrit-InitStep>com.googlesource.gerrit.plugins.xdocs.XDocInit</Gerrit-InitStep>
-
-              <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
-              <Implementation-URL>http://code.google.com/p/gerrit/</Implementation-URL>
-
-              <Implementation-Title>${Gerrit-ApiType} ${project.artifactId}</Implementation-Title>
-              <Implementation-Version>${project.version}</Implementation-Version>
-
-              <Gerrit-ApiType>${Gerrit-ApiType}</Gerrit-ApiType>
-              <Gerrit-ApiVersion>${Gerrit-ApiVersion}</Gerrit-ApiVersion>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.3.2</version>
-        <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
-          <encoding>UTF-8</encoding>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>gwt-maven-plugin</artifactId>
-        <version>2.7.0</version>
-        <configuration>
-          <module>com.googlesource.gerrit.plugins.xdocs.XDocs</module>
-          <disableClassMetadata>true</disableClassMetadata>
-          <disableCastChecking>true</disableCastChecking>
-          <webappDirectory>${project.build.directory}/classes/static</webappDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.3</version>
-        <configuration>
-          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-          <createDependencyReducedPom>false</createDependencyReducedPom>
-        </configuration>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.google.gerrit</groupId>
-      <artifactId>gerrit-${Gerrit-ApiType}-api</artifactId>
-      <version>${Gerrit-ApiVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.gerrit</groupId>
-      <artifactId>gerrit-plugin-gwtui</artifactId>
-      <version>${Gerrit-ApiVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.gwt</groupId>
-      <artifactId>gwt-user</artifactId>
-      <version>2.7.0</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.asciidoctor</groupId>
-      <artifactId>asciidoctorj</artifactId>
-      <version>1.5.1</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.outerj.daisy</groupId>
-      <artifactId>daisydiff</artifactId>
-      <version>1.1</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.docx4j</groupId>
-      <artifactId>docx4j</artifactId>
-      <version>3.2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>antlr</artifactId>
-      <version>3.2</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>antlr-runtime</artifactId>
-      <version>3.2</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>stringtemplate</artifactId>
-      <version>3.2</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.framework</groupId>
-      <artifactId>avalon-framework-api</artifactId>
-      <version>4.3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.framework</groupId>
-      <artifactId>avalon-framework-impl</artifactId>
-      <version>4.3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-anim</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-awt-util</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-bridge</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-css</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-dom</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-ext</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-extension</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-gvt</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-js</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-parser</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-script</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-svg-dom</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-svggen</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-transcoder</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-util</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>batik-xml</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>fop</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xmlgraphics</groupId>
-      <artifactId>xmlgraphics-commons</artifactId>
-      <version>1.5</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.poi</groupId>
-      <artifactId>poi</artifactId>
-      <version>3.10.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.poi</groupId>
-      <artifactId>poi-scratchpad</artifactId>
-      <version>3.10.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>1.4</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>1.4</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>2.5</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>18.0</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.plutext</groupId>
-      <artifactId>jaxb-svg11</artifactId>
-      <version>1.0.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.plutext</groupId>
-      <artifactId>jaxb-xmldsig-core</artifactId>
-      <version>1.0.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.plutext</groupId>
-      <artifactId>jaxb-xslfo</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>net.engio</groupId>
-      <artifactId>mbassador</artifactId>
-      <version>1.2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>1.7.7</version>
-    </dependency>
-    <dependency>
-      <groupId>net.arnx</groupId>
-      <artifactId>wmf2svg</artifactId>
-      <version>0.9.7</version>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>xalan</artifactId>
-      <version>2.7.2</version>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>serializer</artifactId>
-      <version>2.7.2</version>
-    </dependency>
-    <dependency>
-      <groupId>xml-apis</groupId>
-      <artifactId>xml-apis</artifactId>
-      <version>1.3.04</version>
-    </dependency>
-  </dependencies>
-
-  <repositories>
-    <repository>
-      <id>snapshot-repository</id>
-      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-    </repository>
-    <repository>
-      <id>atlassian</id>
-      <url>https://maven.atlassian.com/content/repositories/atlassian-3rdparty</url>
-    </repository>
-  </repositories>
-</project>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
index 70506c5..b90db61 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.extensions.annotations.Exports;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.client.GerritTopMenu;
+import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.webui.BranchWebLink;
@@ -25,7 +26,6 @@
 import com.google.gerrit.extensions.webui.FileWebLink;
 import com.google.gerrit.extensions.webui.ProjectWebLink;
 import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.gerrit.server.config.FactoryModule;
 import com.google.inject.Inject;
 
 import com.googlesource.gerrit.plugins.xdocs.formatter.AsciidoctorFormatter;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocInit.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocInit.java
index 0a3323b..d916d1d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocInit.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocInit.java
@@ -44,7 +44,8 @@
 
   @Override
   public void run() throws Exception {
-    File pluginConfig = new File(sitePaths.etc_dir, pluginName + ".config");
+    File pluginConfig = new File(
+        sitePaths.etc_dir.toFile(), pluginName + ".config");
     if (!pluginConfig.exists()) {
       ui.message("\n");
       ui.header("%s plugin", pluginName);
@@ -57,11 +58,14 @@
           pluginConfig.getAbsolutePath());
     }
 
-    extract(new File(sitePaths.static_dir, "xdocs/css/unified.css"),
+    extract(new File(sitePaths.static_dir.toFile(),
+        "xdocs/css/unified.css").toPath(),
         XDocInit.class, "diff/unified.css");
-    extract(new File(sitePaths.static_dir, "xdocs/css/sidebyside-a.css"),
+    extract(new File(sitePaths.static_dir.toFile(),
+        "xdocs/css/sidebyside-a.css").toPath(),
         XDocInit.class, "diff/sidebyside-a.css");
-    extract(new File(sitePaths.static_dir, "xdocs/css/sidebyside-b.css"),
+    extract(new File(sitePaths.static_dir.toFile(),
+        "xdocs/css/sidebyside-b.css").toPath(),
         XDocInit.class, "diff/sidebyside-b.css");
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
index d63502d..ebae46c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -141,8 +141,7 @@
           projectControl);
       String revB = getRevision(key.revisionB, projectControl);
 
-      Repository repo = repoManager.openRepository(key.project);
-      try {
+      try (Repository repo = repoManager.openRepository(key.project)) {
         ObjectId revId =
             resolveRevision(repo,
                 key.diffMode == DiffMode.NO_DIFF
@@ -185,8 +184,6 @@
         }
         rsc.send(req, res);
         return;
-      } finally {
-        repo.close();
       }
     } catch (RepositoryNotFoundException | NoSuchProjectException
         | ResourceNotFoundException | AuthException | RevisionSyntaxException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
index 1d7cf4e..5ec6172 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
@@ -113,36 +113,31 @@
     }
 
     Project.NameKey p = new Project.NameKey(projectName);
-    try {
-      Repository repo = repoManager.openRepository(p);
-      try {
-        ObjectId revId = repo.resolve(revision);
-        if (revId == null) {
-          return null;
-        }
-        Resource rsc = docCache.get(formatter, p, fileName, revId, null, null);
-        if (rsc != Resource.NOT_FOUND) {
-          StringBuilder url = new StringBuilder();
-          if (framed) {
-            url.append("#/x/");
-          } else {
-            url.append("plugins/");
-          }
-          url.append(pluginName);
-          url.append(XDocServlet.PATH_PREFIX);
-          url.append(Url.encode(projectName));
-          if (revision != null && !Constants.HEAD.equals(revision)) {
-            url.append("/rev/");
-            url.append(Url.encode(revision));
-          }
-          url.append("/");
-          url.append(fileName);
-          return url.toString();
+    try (Repository repo = repoManager.openRepository(p)) {
+      ObjectId revId = repo.resolve(revision);
+      if (revId == null) {
+        return null;
+      }
+      Resource rsc = docCache.get(formatter, p, fileName, revId, null, null);
+      if (rsc != Resource.NOT_FOUND) {
+        StringBuilder url = new StringBuilder();
+        if (framed) {
+          url.append("#/x/");
         } else {
-          return null;
+          url.append("plugins/");
         }
-      } finally {
-        repo.close();
+        url.append(pluginName);
+        url.append(XDocServlet.PATH_PREFIX);
+        url.append(Url.encode(projectName));
+        if (revision != null && !Constants.HEAD.equals(revision)) {
+          url.append("/rev/");
+          url.append(Url.encode(revision));
+        }
+        url.append("/");
+        url.append(fileName);
+        return url.toString();
+      } else {
+        return null;
       }
     } catch (IOException e) {
       log.error("Failed to check for project documentation", e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
index d95b5f4..a4507a5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
@@ -41,7 +41,6 @@
   public final boolean isOpen() {
     switch (getStatus()) {
       case NEW:
-      case SUBMITTED:
       case DRAFT:
         return true;
       default:
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 4c56ed6..8b5de99 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,10 +1,7 @@
 Build
 =====
 
-This plugin can be built with Buck or Maven.
-
-Buck
-----
+This plugin is built using Buck.
 
 Two build modes are supported: Standalone and in Gerrit tree.
 The standalone build mode is recommended, as this mode doesn't require
@@ -62,16 +59,3 @@
 ```
   ./tools/eclipse/project.py
 ```
-
-Maven
------
-
-Note that the Maven build is provided for compatibility reasons, but
-it is considered to be deprecated and will be removed in a future
-version of this plugin.
-
-To build with Maven, run
-
-```
-mvn clean package
-```
diff --git a/src/test/java/com/googlesource/gerrit/plugins/x-docs/AsciidoctorFormatterTest.java b/src/test/java/com/googlesource/gerrit/plugins/x-docs/AsciidoctorFormatterTest.java
new file mode 100644
index 0000000..648e42c
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/x-docs/AsciidoctorFormatterTest.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.xdocs.formatter;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertEquals;
+
+import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.lang.StringUtils;
+import org.easymock.IAnswer;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AsciidoctorFormatterTest {
+
+  private ConfigSection cfg;
+  private AsciidoctorFormatter formatter;
+
+  @Before
+  public void setUp() throws IOException {
+    FormatterUtil util = createNiceMock(FormatterUtil.class);
+
+    // To simplify things, make applyCss() a no-op and return the HTML code as-is.
+    expect(util.applyCss(anyString(), anyString(), anyString())).andAnswer(
+      new IAnswer<String>() {
+        @Override
+        public String answer() throws Throwable {
+          // The first argument is the HTML code.
+          return (String) getCurrentArguments()[0];
+        }
+      }
+    );
+
+    replay(util);
+
+    cfg = createNiceMock(ConfigSection.class);
+
+    // Do not expect any behavior from the ConfigSection itself.
+    replay(cfg);
+
+    Formatters formatters = createNiceMock(Formatters.class);
+
+    // Avoid a NPE by just returning the ConfigSection mock object.
+    expect(formatters.getFormatterConfig(anyString(), anyString())).andReturn(cfg);
+
+    replay(formatters);
+
+    formatter = new AsciidoctorFormatter(util, formatters);
+  }
+
+  @Test
+  public void basicTextFormattingWorks() throws IOException {
+    String raw = "_italic_ *bold* `monospace`";
+    String formatted = "<em>italic</em> <strong>bold</strong> <code>monospace</code>";
+    assertEquals(1, StringUtils.countMatches(formatter.format(null, null, null, null, cfg, raw), formatted));
+  }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/x-docs/MarkdownFormatterTest.java b/src/test/java/com/googlesource/gerrit/plugins/x-docs/MarkdownFormatterTest.java
new file mode 100644
index 0000000..0ddb58d
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/x-docs/MarkdownFormatterTest.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.xdocs.formatter;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertEquals;
+
+import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class MarkdownFormatterTest {
+
+  private static final String PROLOG = "<html><head><style type=\"text/css\">\n\n</style></head><body>\n<p>";
+  private static final String EPILOG = "</p>\n</body></html>";
+
+  private ConfigSection cfg;
+  private MarkdownFormatter formatter;
+
+  @Before
+  public void setUp() throws IOException {
+    FormatterUtil util = createNiceMock(FormatterUtil.class);
+
+    // For easier result comparison, avoid the internal MarkdownFormatter to apply the default CSS.
+    expect(util.getInheritedCss(anyString(), anyString(), anyString(), anyString())).andReturn("");
+
+    replay(util);
+
+    cfg = createNiceMock(ConfigSection.class);
+
+    // Do not expect any behavior from the ConfigSection itself.
+    replay(cfg);
+
+    Formatters formatters = createNiceMock(Formatters.class);
+
+    // Avoid a NPE by just returning the ConfigSection mock object.
+    expect(formatters.getFormatterConfig(anyString(), anyString())).andReturn(cfg);
+
+    replay(formatters);
+
+    formatter = new MarkdownFormatter(util, formatters);
+  }
+
+  @Test
+  public void basicTextFormattingWorks() throws IOException {
+    String raw = "*italic* **bold** `monospace`";
+    String formatted = PROLOG + "<em>italic</em> <strong>bold</strong> <code>monospace</code>" + EPILOG;
+    assertEquals(formatted, formatter.format(null, null, null, null, cfg, raw));
+  }
+}