You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2019/06/21 07:09:39 UTC
[servicecomb-toolkit] 23/49: add unit test code
This is an automated email from the ASF dual-hosted git repository.
ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git
commit d48cd0bbb12f4efc5074261ecec601a4979235ac
Author: kakulisen <18...@163.com>
AuthorDate: Tue May 28 12:03:37 2019 +0800
add unit test code
Signed-off-by: kakulisen <18...@163.com>
---
common/pom.xml | 7 ++
.../toolkit/common/TextCompareTest.java | 116 +++++++++++++++++++++
.../src/test/resources/compare/HelloEndPoint.yaml | 75 +++++++++++++
.../src/test/resources/compare/HelloEndPoint2.yaml | 75 +++++++++++++
.../src/test/java/docgen/DocGeneratorTest.java | 96 +++++++++++++++++
.../src/test/resources/HelloEndPoint.yaml | 38 +++++++
toolkit-maven-plugin/pom.xml | 36 +++++++
.../java/plugin/GenerateContractsDocMojoTest.java | 53 ++++++++++
.../java/plugin/GenerateContractsMojoTest.java | 68 ++++++++++++
.../projects/project-generateContracts/pom.xml | 46 ++++++++
.../projects/project-generateContractsDoc/pom.xml | 46 ++++++++
11 files changed, 656 insertions(+)
diff --git a/common/pom.xml b/common/pom.xml
index 3324cb2..9a718c0 100755
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -71,6 +71,13 @@
<version>4.12</version>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.25.0</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/common/src/test/java/org/apache/servicecomb/toolkit/common/TextCompareTest.java b/common/src/test/java/org/apache/servicecomb/toolkit/common/TextCompareTest.java
new file mode 100644
index 0000000..14df512
--- /dev/null
+++ b/common/src/test/java/org/apache/servicecomb/toolkit/common/TextCompareTest.java
@@ -0,0 +1,116 @@
+package org.apache.servicecomb.toolkit.common;
+
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+public class TextCompareTest {
+
+ Path sourcePath = Paths.get("./src/test/resources/compare/HelloEndPoint.yaml");
+ Path destPath = Paths.get("./src/test/resources/compare/HelloEndPoint2.yaml");
+
+ @Test
+ public void contractCompareText() throws IOException {
+ ContractComparator contractComparator = new ContractComparator(new String(Files.readAllBytes(sourcePath)),
+ new String(Files.readAllBytes(destPath)));
+ assertEquals(MyersAlgorithm.class, contractComparator.getAlgorithm().getClass());
+
+ List<Comparison> comparisonList = contractComparator.compare();
+
+ assertEquals(3, comparisonList.size());
+ }
+
+ @Test
+ public void contractCompareResultPrint() throws IOException {
+ ContractComparator contractComparator = new ContractComparator(new String(Files.readAllBytes(sourcePath)),
+ new String(Files.readAllBytes(destPath)));
+ assertEquals(MyersAlgorithm.class, contractComparator.getAlgorithm().getClass());
+
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ contractComparator.splitPrint(bout);
+
+ assertTrue(0 < bout.toByteArray().length);
+ }
+
+ @Test
+ public void contractCompareAnotherAlgorithm() throws IOException {
+
+ CompareAlgorithm oneLineAlgorithm = mock(CompareAlgorithm.class);
+ when(oneLineAlgorithm.compare(anyString(), anyString())).then(new Answer<Object>() {
+ @Override
+ public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
+ Object[] args = invocationOnMock.getArguments();
+ String source = (String) args[0];
+ String dest = (String) args[1];
+ if ((source == null || "".equals(source.trim())) && dest != null) {
+ Comparison comparison = new Comparison(ComparisionType.INSERT, 0, 0, 1, 0);
+ return Collections.singletonList(comparison);
+ }
+
+ if (source != null && (dest == null || "".equals(dest.trim()))) {
+ Comparison comparison = new Comparison(ComparisionType.DELETE, 0, 0, 0, 0);
+ return Collections.singletonList(comparison);
+ }
+
+ if (hasNewLine(source) || hasNewLine(dest)) {
+ return null;
+ }
+
+ if ((dest).equals(source)) {
+ return Collections.singletonList(new Comparison(ComparisionType.EQUAL, 0, 0, 0, 0));
+ }
+ Comparison comparison = new Comparison(ComparisionType.REPLACE, 0, 1, 0, 1);
+ return Collections.singletonList(comparison);
+ }
+ });
+
+ ContractComparator contractComparator = new ContractComparator("source line",
+ "destination line", oneLineAlgorithm);
+
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ contractComparator.splitPrint(bout);
+ bout.flush();
+ assertTrue(0 < bout.toByteArray().length);
+
+ bout = new ByteArrayOutputStream();
+ contractComparator = new ContractComparator("source line",
+ "source line", oneLineAlgorithm);
+ contractComparator.splitPrint(bout);
+ assertEquals(ComparisionType.EQUAL , contractComparator.compare().get(0).type);
+
+ }
+
+ private boolean hasNewLine(String s) {
+ return Pattern.compile("\\r?\\n").matcher(s).find();
+ }
+
+ @Test
+ public void contractCompareException() throws IOException {
+
+ try (ByteArrayOutputStream bout = new ByteArrayOutputStream()) {
+
+ ContractComparator contractComparator = new ContractComparator(null,
+ new String(Files.readAllBytes(destPath)));
+ assertEquals(MyersAlgorithm.class, contractComparator.getAlgorithm().getClass());
+ contractComparator.splitPrint(bout);
+
+ } catch (RuntimeException e) {
+ assertEquals("source must not be null", e.getMessage());
+ }
+
+ }
+}
diff --git a/common/src/test/resources/compare/HelloEndPoint.yaml b/common/src/test/resources/compare/HelloEndPoint.yaml
new file mode 100644
index 0000000..c67fb51
--- /dev/null
+++ b/common/src/test/resources/compare/HelloEndPoint.yaml
@@ -0,0 +1,75 @@
+
+---
+swagger: "2.0"
+info:
+ version: "1.0.0"
+ title: "swagger definition for org.apache.servicecomb.samples.bmi.HelloEndPoint"
+ x-java-interface: "gen.swagger.HelloEndPointIntf"
+basePath: "/hello"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+ /sayHello:
+ get:
+ operationId: "sayHello"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "result"
+ in: "query"
+ required: false
+ type: "number"
+ format: "double"
+ - name: "instanceId"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "callTime"
+ in: "query"
+ required: false
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
+ /sayHi:
+ get:
+ operationId: "sayHi"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "Authorization"
+ in: "header"
+ description: "aa"
+ required: true
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
+ /sayNo:
+ get:
+ operationId: "sayNo"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "Authorization"
+ in: "header"
+ description: "aa"
+ required: true
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
\ No newline at end of file
diff --git a/common/src/test/resources/compare/HelloEndPoint2.yaml b/common/src/test/resources/compare/HelloEndPoint2.yaml
new file mode 100644
index 0000000..be821f5
--- /dev/null
+++ b/common/src/test/resources/compare/HelloEndPoint2.yaml
@@ -0,0 +1,75 @@
+---
+aaswagfger: "2.066"
+ccc
+info:
+ version: "1.0.02"
+ title: "swagger definition for org.apache.servicecomb.samples.bmi.HelloEndPoint"
+ x-java-interface: "gen.swagger.HelloEndPointIntf"
+basePath: "/hello"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+ /sayHello:
+ get:
+ operationId: "sayHello"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "result"
+ in: "query"
+ required: false
+ type: "number"
+ format: "double"
+ - name: "instanceId"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "callTime"
+ in: "query"
+ required: false
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
+ /sayHi:
+ get:
+ operationId: "sayHi"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "Authorization"
+ in: "header"
+ description: "aa"
+ required: true
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
+ /sayNo:
+ get:
+ operationId: "sayNo"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ - name: "Authorization"
+ in: "header"
+ description: "aa"
+ required: true
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
\ No newline at end of file
diff --git a/doc-generator/src/test/java/docgen/DocGeneratorTest.java b/doc-generator/src/test/java/docgen/DocGeneratorTest.java
new file mode 100644
index 0000000..0ca5bc9
--- /dev/null
+++ b/doc-generator/src/test/java/docgen/DocGeneratorTest.java
@@ -0,0 +1,96 @@
+package docgen;
+
+import io.swagger.models.Swagger;
+import io.swagger.parser.Swagger20Parser;
+import org.apache.commons.io.FileUtils;
+import org.apache.servicecomb.toolkit.docgen.DocGeneratorManager;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class DocGeneratorTest {
+
+
+ @Test
+ public void contractToAsciidoc() throws IOException {
+
+ Swagger20Parser swagger20Parser = new Swagger20Parser();
+ InputStream in = DocGeneratorTest.class.getClassLoader().getResourceAsStream("HelloEndPoint.yaml");
+
+ StringBuilder sb = new StringBuilder();
+ byte[] bytes = new byte[1024];
+ int len = -1;
+ while ((len = in.read(bytes)) != -1){
+ sb.append(new String(bytes,0,len));
+ }
+
+ Swagger swagger = swagger20Parser.parse(sb.toString());
+ Path tempDir = Files.createTempDirectory(null);
+ Path outputPath = Paths.get(tempDir.toFile().getAbsolutePath()
+ + File.separator + "asciidoc.html");
+
+ DocGeneratorManager.generate(swagger,outputPath.toFile().getCanonicalPath() , "asciidoc-html");
+
+ Assert.assertTrue(Files.exists(outputPath));
+ FileUtils.deleteDirectory(tempDir.toFile());
+ }
+
+ @Test
+ public void contractTransferToSwaggerUI() throws IOException {
+
+ Swagger20Parser swagger20Parser = new Swagger20Parser();
+
+ InputStream in = DocGeneratorTest.class.getClassLoader().getResourceAsStream("HelloEndPoint.yaml");
+
+ StringBuilder sb = new StringBuilder();
+ byte[] bytes = new byte[1024];
+ int len = -1;
+ while ((len = in.read(bytes)) != -1) {
+ sb.append(new String(bytes, 0, len));
+ }
+
+ Swagger swagger = swagger20Parser.parse(sb.toString());
+
+ Path tempDir = Files.createTempDirectory(null);
+ Path outputPath = Paths.get(tempDir.toFile().getAbsolutePath()
+ + File.separator + "swagger-ui.html");
+ DocGeneratorManager.generate(swagger,outputPath.toFile().getCanonicalPath() , "swagger-ui");
+
+ Assert.assertTrue(Files.exists(outputPath));
+ FileUtils.deleteDirectory(tempDir.toFile());
+ }
+
+ @Test
+ public void contractTransferToOther() throws IOException {
+
+ Swagger20Parser swagger20Parser = new Swagger20Parser();
+
+ InputStream in = DocGeneratorTest.class.getClassLoader().getResourceAsStream("HelloEndPoint.yaml");
+
+ StringBuilder sb = new StringBuilder();
+ byte[] bytes = new byte[1024];
+ int len = -1;
+ while ((len = in.read(bytes)) != -1) {
+ sb.append(new String(bytes, 0, len));
+ }
+
+ Swagger swagger = swagger20Parser.parse(sb.toString());
+
+ Path tempDir = Files.createTempDirectory(null);
+ Path outputPath = Paths.get(tempDir.toFile().getAbsolutePath()
+ + File.separator + "swagger-ui.html");
+
+ DocGeneratorManager.generate(swagger, outputPath.toFile().getCanonicalPath(), "other");
+
+ Assert.assertFalse(Files.exists(outputPath));
+
+ FileUtils.deleteDirectory(tempDir.toFile());
+ }
+
+}
diff --git a/doc-generator/src/test/resources/HelloEndPoint.yaml b/doc-generator/src/test/resources/HelloEndPoint.yaml
new file mode 100644
index 0000000..a42df27
--- /dev/null
+++ b/doc-generator/src/test/resources/HelloEndPoint.yaml
@@ -0,0 +1,38 @@
+---
+swagger: "2.0"
+info:
+ version: "1.0.0"
+ title: "swagger definition for org.apache.servicecomb.samples.bmi.HelloEndPoint"
+ x-java-interface: "gen.swagger.HelloEndPointIntf"
+basePath: "/hello"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+ /sayHello:
+ get:
+ operationId: "sayHello"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
+ /sayHi:
+ get:
+ operationId: "sayHi"
+ parameters:
+ - name: "name"
+ in: "query"
+ required: false
+ type: "string"
+ responses:
+ 200:
+ description: "response of 200"
+ schema:
+ type: "string"
diff --git a/toolkit-maven-plugin/pom.xml b/toolkit-maven-plugin/pom.xml
index 9574db1..5bb48ef 100755
--- a/toolkit-maven-plugin/pom.xml
+++ b/toolkit-maven-plugin/pom.xml
@@ -64,6 +64,42 @@
<artifactId>toolkit-common</artifactId>
<version>${project.version}</version>
</dependency>
+
+ <!-- for test -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.maven.plugin-testing</groupId>
+ <artifactId>maven-plugin-testing-harness</artifactId>
+ <version>3.3.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-aether-provider</artifactId>
+ <version>3.2.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-compat</artifactId>
+ <version>3.2.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.25.0</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsDocMojoTest.java b/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsDocMojoTest.java
new file mode 100644
index 0000000..1fa05c4
--- /dev/null
+++ b/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsDocMojoTest.java
@@ -0,0 +1,53 @@
+package plugin;
+
+import org.apache.maven.plugin.testing.MojoRule;
+import org.apache.maven.plugin.testing.resources.TestResources;
+import org.apache.maven.project.MavenProject;
+import org.apache.servicecomb.toolkit.plugin.GenerateContractsDocMojo;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+
+
+public class GenerateContractsDocMojoTest {
+
+ private static final String PLUGIN_GOAL = "generateDoc";
+
+ private static final String TEST_PROJECT = "project-generateContractsDoc";
+
+ @Rule
+ public MojoRule rule = new MojoRule();
+
+ @Rule
+ public TestResources resources = new TestResources();
+
+
+ @Test
+ public void testGenerateContractsDoc() throws Exception {
+ File baseDir = this.resources.getBasedir(TEST_PROJECT);
+ GenerateContractsDocMojo generateContractsDocMojo = mock(GenerateContractsDocMojo.class);
+ List<String> runtimeUrlPath = new ArrayList<>();
+ runtimeUrlPath.add(baseDir + "/target/classes");
+ final MavenProject project = mock(MavenProject.class);
+ given(project.getRuntimeClasspathElements()).willReturn(runtimeUrlPath);
+
+ assertNotNull(generateContractsDocMojo);
+ rule.setVariableValueToObject(generateContractsDocMojo, "project", project);
+ rule.setVariableValueToObject(generateContractsDocMojo, "format", ".yaml");
+ assertNotNull(this.rule.getVariableValueFromObject(generateContractsDocMojo, "project"));
+ assertEquals(".yaml", this.rule.getVariableValueFromObject(generateContractsDocMojo, "format"));
+ rule.executeMojo(project, PLUGIN_GOAL);
+ generateContractsDocMojo.execute();
+
+ }
+
+
+}
diff --git a/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsMojoTest.java b/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsMojoTest.java
new file mode 100644
index 0000000..f69c312
--- /dev/null
+++ b/toolkit-maven-plugin/src/test/java/plugin/GenerateContractsMojoTest.java
@@ -0,0 +1,68 @@
+package plugin;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.testing.MojoRule;
+import org.apache.maven.plugin.testing.resources.TestResources;
+import org.apache.maven.project.MavenProject;
+import org.apache.servicecomb.toolkit.plugin.GenerateContractsMojo;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+
+public class GenerateContractsMojoTest {
+
+ private static final String PLUGIN_GOAL = "generateContracts";
+
+ @Rule
+ public MojoRule rule = new MojoRule();
+
+ @Rule
+ public TestResources resources = new TestResources();
+
+ @Test
+ public void testGenerateContracts() throws Exception {
+ executeMojo("project-generateContracts", PLUGIN_GOAL);
+ }
+
+ protected void executeMojo(String projectName, String goalName) throws Exception {
+
+ File baseDir = this.resources.getBasedir(projectName);
+ assertNotNull(baseDir);
+ assertTrue(baseDir.exists());
+ assertTrue(baseDir.isDirectory());
+
+ File pom = new File(baseDir, "pom.xml");
+ AbstractMojo generateContractsMojo = (AbstractMojo) this.rule.lookupMojo(goalName, pom);
+
+ assertNotNull(generateContractsMojo);
+ assertEquals(GenerateContractsMojo.class, generateContractsMojo.getClass());
+
+ final MavenProject project = mock(MavenProject.class);
+ given(project.getFile()).willReturn(pom);
+ List<String> runtimeUrlPath = new ArrayList<>();
+ runtimeUrlPath.add(baseDir + "/target/classes");
+ given(project.getRuntimeClasspathElements()).willReturn(runtimeUrlPath);
+
+ rule.setVariableValueToObject(generateContractsMojo, "project", project);
+ assertNotNull(this.rule.getVariableValueFromObject(generateContractsMojo, "project"));
+
+ assertEquals("target/test_output_contracts", this.rule.getVariableValueFromObject(generateContractsMojo, "outputDir"));
+ assertEquals(".yaml", this.rule.getVariableValueFromObject(generateContractsMojo, "format"));
+
+ generateContractsMojo.execute();
+
+ assertTrue(new File("target/test_output_contracts").exists());
+ }
+
+}
diff --git a/toolkit-maven-plugin/src/test/projects/project-generateContracts/pom.xml b/toolkit-maven-plugin/src/test/projects/project-generateContracts/pom.xml
new file mode 100644
index 0000000..9a71eb5
--- /dev/null
+++ b/toolkit-maven-plugin/src/test/projects/project-generateContracts/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright 2014 Linagora, Université Joseph Fourier
+ 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>
+ <prerequisites>
+ <maven>3.0.3</maven>
+ </prerequisites>
+
+ <groupId>org.apache.servicecomb</groupId>
+ <artifactId>this-is-for-test-only</artifactId>
+ <version>0.1.0-SNAPSHOT</version>
+ <name>This is for Test ONLY</name>
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.servicecomb</groupId>
+ <artifactId>toolkit-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <outputDir>target/test_output_contracts</outputDir>
+ <format>.yaml</format>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/toolkit-maven-plugin/src/test/projects/project-generateContractsDoc/pom.xml b/toolkit-maven-plugin/src/test/projects/project-generateContractsDoc/pom.xml
new file mode 100644
index 0000000..2b05bdf
--- /dev/null
+++ b/toolkit-maven-plugin/src/test/projects/project-generateContractsDoc/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright 2014 Linagora, Université Joseph Fourier
+ 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>
+ <prerequisites>
+ <maven>3.0.3</maven>
+ </prerequisites>
+ <groupId>org.apache.servicecomb</groupId>
+ <artifactId>this-is-for-test-only</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <name>This is for Test ONLY</name>
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.servicecomb</groupId>
+ <artifactId>toolkit-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <outputDir>./target/plugin-test-output</outputDir>
+ <docOutputDir>./target/plugin-test-output</docOutputDir>
+ <format>.yaml</format>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file