update all dependencies (maven artifacts)

- PDF dependency was missing in the pom file the JDK8
  * We should think about creating a parent pom - in that case all plantuml dependencies could be in the parent pom and we would only the mantain one pom file.
    (It is also possible to drop the Java 8 support.)
  * Why do we not have any PDF tests?
- add rule to ignore version update hint with `-dev` followed by a dot and date (e.g. `0.37.0-dev.20230308`)
- migration from JUnit4 to JUnit5
This commit is contained in:
Florian 2023-05-05 17:50:02 +02:00 committed by PlantUML
parent e6566b58bd
commit e5d11fb89a
20 changed files with 435 additions and 359 deletions

View File

@ -8,7 +8,7 @@ RUN mvn --batch-mode --define java.net.useSystemProxies=true package
########################################################################################
FROM jetty:11.0.7-jre11-slim
FROM jetty:11.0.15-jre11-slim
# Proxy and OldProxy need empty path segments support in URIs
# Hence: allow AMBIGUOUS_EMPTY_SEGMENT
@ -65,7 +65,7 @@ COPY ROOT.jetty.xml $WEBAPP_PATH/ROOT.xml
ENTRYPOINT ["/entrypoint.sh"]
# Openshift https://docs.openshift.com/container-platform/4.9/openshift_images/create-images.html#images-create-guide-openshift_create-images
USER root
USER root
RUN chgrp -R 0 $JETTY_BASE && chmod -R g=u $JETTY_BASE
RUN chgrp -R 0 /tmp && chmod -R g=u /tmp
USER jetty

View File

@ -55,7 +55,7 @@
<!-- main versions -->
<plantuml.version>1.2023.6</plantuml.version>
<!-- Please keep the jetty version identical with the docker image -->
<jetty.version>11.0.7</jetty.version>
<jetty.version>11.0.15</jetty.version>
<monaco-editor.version>0.36.1</monaco-editor.version>
<!-- dependencies -->
@ -63,41 +63,44 @@
<apache-jsp.version>${jetty.version}</apache-jsp.version>
<jetty-annotations.version>${jetty.version}</jetty-annotations.version>
<glassfish-jstl.version>${jetty.version}</glassfish-jstl.version>
<batik-all.version>1.14</batik-all.version>
<!-- jlatexmath -->
<jlatexmath.version>1.0.7</jlatexmath.version>
<jlatexmath-font-greek.version>${jlatexmath.version}</jlatexmath-font-greek.version>
<jlatexmath-font-cyrillic.version>${jlatexmath.version}</jlatexmath-font-cyrillic.version>
<!-- PDF -->
<batik-all.version>1.16</batik-all.version>
<fop.version>2.8</fop.version>
<!-- Testing -->
<junit.version>4.13.2</junit.version>
<selenium.version>4.8.3</selenium.version>
<junit.version>5.9.3</junit.version>
<junit-suite.version>1.9.3</junit-suite.version>
<selenium.version>4.9.0</selenium.version>
<selenium-webdrivermanager.version>5.3.2</selenium-webdrivermanager.version>
<commons-io.version>2.11.0</commons-io.version>
<jetty-server.version>${jetty.version}</jetty-server.version>
<!-- build plugin management -->
<!-- lock down plugins versions to avoid using Maven defaults -->
<maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
<maven-dependency-plugin.version>3.2.0</maven-dependency-plugin.version>
<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<versions-maven-plugin.version>2.8.1</versions-maven-plugin.version>
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<maven-clean-plugin.version>3.2.0</maven-clean-plugin.version>
<maven-dependency-plugin.version>3.5.0</maven-dependency-plugin.version>
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<versions-maven-plugin.version>2.15.0</versions-maven-plugin.version>
<maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
<maven-war-plugin.version>3.3.2</maven-war-plugin.version>
<maven-install-plugin.version>2.5.2</maven-install-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<maven-site-plugin.version>3.9.1</maven-site-plugin.version>
<maven-project-info-reports-plugin.version>3.1.2</maven-project-info-reports-plugin.version>
<maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
<checkstyle.version>9.0.1</checkstyle.version>
<maven-install-plugin.version>3.1.1</maven-install-plugin.version>
<maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version>
<maven-site-plugin.version>3.12.1</maven-site-plugin.version>
<maven-project-info-reports-plugin.version>3.4.3</maven-project-info-reports-plugin.version>
<maven-checkstyle-plugin.version>3.2.2</maven-checkstyle-plugin.version>
<checkstyle.version>10.10.0</checkstyle.version>
<!-- plugins -->
<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
<jetty-runner.version>${jetty.version}</jetty-runner.version>
<jetty-maven-plugin.version>${jetty.version}</jetty-maven-plugin.version>
<duplicate-finder-maven-plugin.version>1.5.0</duplicate-finder-maven-plugin.version>
<maven-javadoc-plugin.version>3.3.1</maven-javadoc-plugin.version>
<duplicate-finder-maven-plugin.version>1.5.1</duplicate-finder-maven-plugin.version>
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version>
</properties>
<dependencies>
@ -145,13 +148,6 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- batik-all generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-all</artifactId>
<version>${batik-all.version}</version>
<type>pom</type>
</dependency>
<!-- jlatexmath -->
<dependency>
<groupId>org.scilab.forge</groupId>
@ -168,14 +164,35 @@
<artifactId>jlatexmath-font-cyrillic</artifactId>
<version>${jlatexmath-font-cyrillic.version}</version>
</dependency>
<!-- PDF -->
<dependency>
<!-- batik-all generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-all</artifactId>
<version>${batik-all.version}</version>
<type>pom</type>
</dependency>
<dependency>
<!-- fop generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>${fop.version}</version>
<type>pom</type>
</dependency>
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<version>${junit-suite.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
@ -220,7 +237,7 @@
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven-dependency-plugin.version}</version>
</plugin>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>

84
pom.xml
View File

@ -55,7 +55,7 @@
<!-- main versions -->
<plantuml.version>1.2023.6</plantuml.version>
<!-- Please keep the jetty version identical with the docker image -->
<jetty.version>11.0.7</jetty.version>
<jetty.version>11.0.15</jetty.version>
<monaco-editor.version>0.36.1</monaco-editor.version>
<!-- dependencies -->
@ -63,41 +63,44 @@
<apache-jsp.version>${jetty.version}</apache-jsp.version>
<jetty-annotations.version>${jetty.version}</jetty-annotations.version>
<glassfish-jstl.version>${jetty.version}</glassfish-jstl.version>
<batik-all.version>1.14</batik-all.version>
<!-- jlatexmath -->
<jlatexmath.version>1.0.7</jlatexmath.version>
<jlatexmath-font-greek.version>${jlatexmath.version}</jlatexmath-font-greek.version>
<jlatexmath-font-cyrillic.version>${jlatexmath.version}</jlatexmath-font-cyrillic.version>
<!-- PDF -->
<batik-all.version>1.16</batik-all.version>
<fop.version>2.8</fop.version>
<!-- Testing -->
<junit.version>4.13.2</junit.version>
<selenium.version>4.8.3</selenium.version>
<junit.version>5.9.3</junit.version>
<junit-suite.version>1.9.3</junit-suite.version>
<selenium.version>4.9.0</selenium.version>
<selenium-webdrivermanager.version>5.3.2</selenium-webdrivermanager.version>
<commons-io.version>2.11.0</commons-io.version>
<jetty-server.version>${jetty.version}</jetty-server.version>
<!-- build plugin management -->
<!-- lock down plugins versions to avoid using Maven defaults -->
<maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
<maven-dependency-plugin.version>3.2.0</maven-dependency-plugin.version>
<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<versions-maven-plugin.version>2.8.1</versions-maven-plugin.version>
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<maven-clean-plugin.version>3.2.0</maven-clean-plugin.version>
<maven-dependency-plugin.version>3.5.0</maven-dependency-plugin.version>
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<versions-maven-plugin.version>2.15.0</versions-maven-plugin.version>
<maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
<maven-war-plugin.version>3.3.2</maven-war-plugin.version>
<maven-install-plugin.version>2.5.2</maven-install-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<maven-site-plugin.version>3.9.1</maven-site-plugin.version>
<maven-project-info-reports-plugin.version>3.1.2</maven-project-info-reports-plugin.version>
<maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
<checkstyle.version>9.0.1</checkstyle.version>
<maven-install-plugin.version>3.1.1</maven-install-plugin.version>
<maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version>
<maven-site-plugin.version>3.12.1</maven-site-plugin.version>
<maven-project-info-reports-plugin.version>3.4.3</maven-project-info-reports-plugin.version>
<maven-checkstyle-plugin.version>3.2.2</maven-checkstyle-plugin.version>
<checkstyle.version>10.10.0</checkstyle.version>
<!-- plugins -->
<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
<jetty-runner.version>${jetty.version}</jetty-runner.version>
<jetty-maven-plugin.version>${jetty.version}</jetty-maven-plugin.version>
<duplicate-finder-maven-plugin.version>1.5.0</duplicate-finder-maven-plugin.version>
<maven-javadoc-plugin.version>3.3.1</maven-javadoc-plugin.version>
<duplicate-finder-maven-plugin.version>1.5.1</duplicate-finder-maven-plugin.version>
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version>
</properties>
<dependencies>
@ -123,13 +126,6 @@
<version>${jetty-annotations.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- batik-all generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-all</artifactId>
<version>${batik-all.version}</version>
<type>pom</type>
</dependency>
<!-- jlatexmath -->
<dependency>
<groupId>org.scilab.forge</groupId>
@ -146,14 +142,35 @@
<artifactId>jlatexmath-font-cyrillic</artifactId>
<version>${jlatexmath-font-cyrillic.version}</version>
</dependency>
<!-- PDF -->
<dependency>
<!-- batik-all generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-all</artifactId>
<version>${batik-all.version}</version>
<type>pom</type>
</dependency>
<dependency>
<!-- fop generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>${fop.version}</version>
<type>pom</type>
</dependency>
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<version>${junit-suite.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
@ -178,15 +195,6 @@
<version>${jetty-server.version}</version>
<scope>test</scope>
</dependency>
<!-- PDF Dependencies -->
<dependency>
<!-- fop generally tends to provide duplicate resources on the classpath -->
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>2.7</version>
<type>pom</type>
</dependency>
</dependencies>
<build>
@ -201,7 +209,7 @@
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven-dependency-plugin.version}</version>
</plugin>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>

View File

@ -14,6 +14,7 @@
<ignoreVersion type="regex">(?i).*RC(?:-?\d+)?</ignoreVersion>
<ignoreVersion type="regex">(?i).*CR(?:-?\d+)?</ignoreVersion>
<ignoreVersion type="regex">(?i).*M(?:-?\d+)?</ignoreVersion>
<ignoreVersion type="regex">(?i).*-dev((?:-?\d+)|(?:\.20\d{6}))?</ignoreVersion>
</ignoreVersions>
<rules>
<rule groupId="net.sourceforge.plantuml" artifactId="plantuml" comparisonMethod="maven">

View File

@ -1,28 +1,22 @@
package net.sourceforge.plantuml.servlet;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
public class AllTests extends TestSuite {
public static Test suite() {
TestSuite suite = new TestSuite(AllTests.class.getName());
// $JUnit-BEGIN$
suite.addTestSuite(TestAsciiArt.class);
suite.addTestSuite(TestAsciiCoder.class);
suite.addTestSuite(TestCharset.class);
suite.addTestSuite(TestCheck.class);
suite.addTestSuite(TestEPS.class);
suite.addTestSuite(TestImage.class);
suite.addTestSuite(TestLanguage.class);
suite.addTestSuite(TestMap.class);
suite.addTestSuite(TestMultipageUml.class);
suite.addTestSuite(TestOldProxy.class);
suite.addTestSuite(TestProxy.class);
suite.addTestSuite(TestSVG.class);
suite.addTestSuite(TestWebUI.class);
// $JUnit-END$
return suite;
}
}
@Suite
@SelectClasses({
TestAsciiArt.class,
TestAsciiCoder.class,
TestCharset.class,
TestCheck.class,
TestEPS.class,
TestImage.class,
TestLanguage.class,
TestMap.class,
TestMultipageUml.class,
TestOldProxy.class,
TestProxy.class,
TestSVG.class,
TestWebUI.class
})
public class AllTests {}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -13,21 +16,22 @@ public class TestAsciiArt extends WebappTestCase {
/**
* Verifies the generation of the ascii art for the Bob -> Alice sample
*/
@Test
public void testSimpleSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/txt/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 200);
assertTrue(diagramLen < 250);
Assertions.assertTrue(diagramLen > 200);
Assertions.assertTrue(diagramLen < 250);
}
}

View File

@ -6,6 +6,9 @@ import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -15,24 +18,26 @@ public class TestAsciiCoder extends WebappTestCase {
/**
* Verifies the decoding for the Bob -> Alice sample
*/
@Test
public void testBobAliceSampleDiagramDecoding() throws IOException {
final URL url = new URL(getServerUrl() + "/coder/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get and verify the content
final String diagram = getContentText(conn);
assertEquals(TestUtils.SEQBOBCODE, diagram);
Assertions.assertEquals(TestUtils.SEQBOBCODE, diagram);
}
/**
* Verifies the encoding for the Bob -> Alice sample
*/
@Test
public void testBobAliceSampleDiagramEncoding() throws IOException {
final URL url = new URL(getServerUrl() + "/coder");
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
@ -45,20 +50,16 @@ public class TestAsciiCoder extends WebappTestCase {
}
// Analyze response
// HTTP response 200
assertEquals(
"Bad HTTP status received",
200,
conn.getResponseCode()
);
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify its size
final String diagram = getContentText(conn.getInputStream());
assertEquals(TestUtils.SEQBOB, diagram);
Assertions.assertEquals(TestUtils.SEQBOB, diagram);
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -12,25 +15,27 @@ public class TestCharset extends WebappTestCase {
/**
* Verifies the preservation of unicode characters for the "Bob -> Alice : hell‽" sample
*/
@Test
public void testUnicodeSupport() throws IOException {
final URL url = new URL(getServerUrl() + "/txt/SyfFKj2rKt3CoKnELR1Io4ZDoNdKi1S0");
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify that the interrobang unicode character is present
String diagram = getContentText(conn);
assertTrue("Interrobang unicode character is not preserved", diagram.contains(""));
Assertions.assertTrue(diagram.contains(""), "Interrobang unicode character is not preserved");
}
/**
* Verifies the preservation of unicode characters for the
* "participant Bob [[http://www.snow.com/❄]]\nBob -> Alice" sample
*/
@Test
public void testUnicodeInCMap() throws IOException {
final URL url = new URL(
getServerUrl() +
@ -39,14 +44,14 @@ public class TestCharset extends WebappTestCase {
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify that the snow unicode character is present
String map = getContentText(conn);
assertTrue("Snow unicode character is not preserved", map.contains(""));
Assertions.assertTrue(map.contains(""), "Snow unicode character is not preserved");
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -14,36 +17,38 @@ public class TestCheck extends WebappTestCase {
* Verifies the generation of a syntax check for the following sample:
* Bob -> Alice : hello
*/
@Test
public void testCorrectSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/check/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content, check its first characters and verify its size
String checkResult = getContentText(conn);
assertTrue(
"Response content is not starting with (2 participants)",
checkResult.startsWith("(2 participants)")
Assertions.assertTrue(
checkResult.startsWith("(2 participants)"),
"Response content is not starting with (2 participants)"
);
int checkLen = checkResult.length();
assertTrue(checkLen > 1);
assertTrue(checkLen < 100);
Assertions.assertTrue(checkLen > 1);
Assertions.assertTrue(checkLen < 100);
}
/**
* Check the syntax of an invalid sequence diagram :
* Bob -
*/
@Test
public void testWrongDiagramSyntax() throws IOException {
final URL url = new URL(getServerUrl() + "/check/SyfFKj050000");
// Analyze response
String checkResult = getContentText(url);
assertTrue("Response is not an error", checkResult.startsWith("(Error)"));
Assertions.assertTrue(checkResult.startsWith("(Error)"), "Response is not an error");
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -13,21 +16,22 @@ public class TestEPS extends WebappTestCase {
/**
* Verifies the generation of the EPS for the Bob -> Alice sample
*/
@Test
public void testSimpleSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/eps/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not EPS",
Assertions.assertEquals(
"application/postscript",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not EPS"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 7000);
assertTrue(diagramLen < 10000);
Assertions.assertTrue(diagramLen > 7000);
Assertions.assertTrue(diagramLen < 10000);
}
}

View File

@ -8,6 +8,9 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -17,44 +20,46 @@ public class TestImage extends WebappTestCase {
/**
* Verifies the generation of the version image from an encoded URL
*/
@Test
public void testVersionImage() throws IOException {
final URL url = new URL(getServerUrl() + "/png/" + TestUtils.VERSION);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Get the image and verify its size
byte[] inMemoryImage = getContentAsBytes(conn);
int diagramLen = inMemoryImage.length;
assertTrue(diagramLen > 10000);
assertTrue(diagramLen < 20000);
Assertions.assertTrue(diagramLen > 10000);
Assertions.assertTrue(diagramLen < 20000);
}
/**
* Verifies that the HTTP header of a diagram incites the browser to cache it.
*/
@Test
public void testDiagramHttpHeader() throws IOException, ParseException {
final URL url = new URL(getServerUrl() + "/png/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Verifies the availability of the Expires entry in the response header
assertNotNull(conn.getHeaderField("Expires"));
Assertions.assertNotNull(conn.getHeaderField("Expires"));
// Verifies the availability of the Last-Modified entry in the response header
assertNotNull(conn.getHeaderField("Last-Modified"));
Assertions.assertNotNull(conn.getHeaderField("Last-Modified"));
// Verifies the Last-Modified value is in the past
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss ZZZ", Locale.ENGLISH);
Date lastModified = format.parse(conn.getHeaderField("Last-Modified"));
assertTrue("Last-Modified is not in the past", lastModified.before(new Date()));
Assertions.assertTrue(lastModified.before(new Date()), "Last-Modified is not in the past");
// Consume the response but do nothing with it
getContentAsBytes(conn);
}
@ -62,15 +67,16 @@ public class TestImage extends WebappTestCase {
/**
* Verifies that the HTTP header of a diagram incites the browser to cache it.
*/
@Test
public void testOldImgURL() throws IOException {
final URL url = new URL(getServerUrl() + "/img/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Consume the response but do nothing with it
getContentAsBytes(conn);

View File

@ -3,6 +3,9 @@ package net.sourceforge.plantuml.servlet;
import java.io.IOException;
import java.net.URL;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -11,10 +14,11 @@ public class TestLanguage extends WebappTestCase {
/**
* Tests that the language for the current PlantUML server can be obtained through HTTP
*/
@Test
public void testRetrieveLanguage() throws IOException {
final URL url = new URL(getServerUrl() + "/language");
String languageText = getContentText(url);
assertTrue("Language contains @startuml", languageText.indexOf("@startuml") > 0);
Assertions.assertTrue(languageText.indexOf("@startuml") > 0, "Language contains @startuml");
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -16,6 +19,7 @@ public class TestMap extends WebappTestCase {
* participant Bob [[http://www.yahoo.com]]
* Bob -> Alice : [[http://www.google.com]] hello
*/
@Test
public void testSimpleSequenceDiagram() throws IOException {
final URL url = new URL(
getServerUrl() +
@ -24,30 +28,31 @@ public class TestMap extends WebappTestCase {
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content, check its first characters and verify its size
String diagram = getContentText(conn);
assertTrue(
"Response content is not starting with <map",
diagram.startsWith("<map")
Assertions.assertTrue(
diagram.startsWith("<map"),
"Response content is not starting with <map"
);
assertTrue(
"Response content (2. line) is not starting with <area",
diagram.split("\\n", 2)[1].startsWith("<area")
Assertions.assertTrue(
diagram.split("\\n", 2)[1].startsWith("<area"),
"Response content (2. line) is not starting with <area"
);
int diagramLen = diagram.length();
assertTrue(diagramLen > 200);
assertTrue(diagramLen < 300);
Assertions.assertTrue(diagramLen > 200);
Assertions.assertTrue(diagramLen < 300);
}
/**
* Check the content of the MAP for the sequence diagram sample
* Verify structure of the area tags
*/
@Test
public void testSequenceDiagramContent() throws IOException {
final URL url = new URL(
getServerUrl() +
@ -61,9 +66,9 @@ public class TestMap extends WebappTestCase {
// <area shape="..." id="..." href="..." ... />
// <area shape="..." id="..." href="..." ... />
// </map>
assertTrue(
"Response doesn't match shape",
map.matches("^<map id=\".+\" name=\".+\">\n(<area shape=\".+\" id=\".+\" href=\".+\".*/>\n){2}</map>\n*$")
Assertions.assertTrue(
map.matches("^<map id=\".+\" name=\".+\">\n(<area shape=\".+\" id=\".+\" href=\".+\".*/>\n){2}</map>\n*$"),
"Response doesn't match shape"
);
}
@ -71,20 +76,21 @@ public class TestMap extends WebappTestCase {
* Check the empty MAP of a sequence diagram without link
* This test uses the simple Bob -> Alice
*/
@Test
public void testSequenceDiagramWithoutLink() throws IOException {
final URL url = new URL(getServerUrl() + "/map/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the data contained in the XML
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertEquals(0, diagramLen);
Assertions.assertEquals(0, diagramLen);
}
}

View File

@ -1,11 +1,12 @@
package net.sourceforge.plantuml.servlet;
import static org.junit.Assert.assertNotEquals;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -15,182 +16,190 @@ public class TestMultipageUml extends WebappTestCase {
/**
* Verifies that an multipage diagram renders correct given index (PNG).
*/
@Test
public void testPngIndexPage() throws IOException {
final URL url = new URL(getServerUrl() + "/png/1/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Get the image and verify its size
byte[] inMemoryImage = getContentAsBytes(conn);
int diagramLen = inMemoryImage.length; // 7525
assertTrue(diagramLen > 6000);
assertTrue(diagramLen < 9000);
Assertions.assertTrue(diagramLen > 6000);
Assertions.assertTrue(diagramLen < 9000);
}
/**
* Verifies that an multipage diagram renders correct even if no index is specified (PNG).
*/
@Test
public void testPngIndexPageNoIndex() throws IOException {
final URL url = new URL(getServerUrl() + "/png/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Get the image and verify its size
byte[] inMemoryImage = getContentAsBytes(conn);
int diagramLen = inMemoryImage.length; // 4196
assertTrue(diagramLen > 3000);
assertTrue(diagramLen < 5000);
Assertions.assertTrue(diagramLen > 3000);
Assertions.assertTrue(diagramLen < 5000);
}
/**
* Verifies that an multipage diagram renders correct given index (SVG).
*/
@Test
public void testSvgIndexPage() throws IOException {
final URL url = new URL(getServerUrl() + "/svg/1/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 4500);
assertTrue(diagramLen < 6000);
Assertions.assertTrue(diagramLen > 4500);
Assertions.assertTrue(diagramLen < 6000);
}
/**
* Verifies that an multipage diagram renders correct even if no index is specified (SVG).
*/
@Test
public void testSvgIndexPageNoIndex() throws IOException {
final URL url = new URL(getServerUrl() + "/svg/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 1500);
assertTrue(diagramLen < 4000);
Assertions.assertTrue(diagramLen > 1500);
Assertions.assertTrue(diagramLen < 4000);
}
/**
* Verifies that an multipage diagram renders correct given index (AsciiArt).
*/
@Test
public void testAsciiArtIndexPage() throws IOException {
final URL url = new URL(getServerUrl() + "/txt/1/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertNotEquals(0, diagramLen);
Assertions.assertNotEquals(0, diagramLen);
// BUG/Missing Feature: plantuml renders always whole AsciiArt diagram
//assertTrue(diagramLen > ??);
//assertTrue(diagramLen < ??);
//Assertions.assertTrue(diagramLen > ??);
//Assertions.assertTrue(diagramLen < ??);
}
/**
* Verifies that an multipage diagram renders correct even if no index is specified (AsciiArt).
*/
@Test
public void testAsciiArtIndexPageNoIndex() throws IOException {
final URL url = new URL(getServerUrl() + "/txt/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertNotEquals(0, diagramLen);
Assertions.assertNotEquals(0, diagramLen);
// BUG/Missing Feature: plantuml renders always whole AsciiArt diagram
//assertTrue(diagramLen > ??);
//assertTrue(diagramLen < ??);
//Assertions.assertTrue(diagramLen > ??);
//Assertions.assertTrue(diagramLen < ??);
}
/**
* Verifies that an multipage diagram renders correct given index (Map).
*/
@Test
public void testMapIndexPage() throws IOException {
final URL url = new URL(getServerUrl() + "/map/1/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the data contained in the XML
String map = getContentText(url);
// map contains "tel:0123456789"
assertTrue(
"Response does not contain 'tel:0123456789'",
map.contains("tel:0123456789")
Assertions.assertTrue(
map.contains("tel:0123456789"),
"Response does not contain 'tel:0123456789'"
);
// Verify shape:
// <map id="..." name="...">
// <area shape="..." id="..." href="..." ... />
// </map>
assertTrue(
"Response doesn't match shape",
map.matches("^<map id=\".+\" name=\".+\">\n(<area shape=\".+\" id=\".+\" href=\".+\".*/>\n)</map>\n*$")
Assertions.assertTrue(
map.matches("^<map id=\".+\" name=\".+\">\n(<area shape=\".+\" id=\".+\" href=\".+\".*/>\n)</map>\n*$"),
"Response doesn't match shape"
);
}
/**
* Verifies that an multipage diagram renders correct even if no index is specified (Map).
*/
@Test
public void testMapIndexPageNoIndex() throws IOException {
final URL url = new URL(getServerUrl() + "/map/" + TestUtils.SEQMULTIPAGE);
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not TEXT PLAIN or UTF-8",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"text/plain;charset=utf-8",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not TEXT PLAIN or UTF-8"
);
// Get the data contained in the XML
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertEquals(0, diagramLen);
Assertions.assertEquals(0, diagramLen);
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -12,59 +15,61 @@ public class TestOldProxy extends WebappTestCase {
/**
* Verifies the proxified reception of the default Bob and Alice diagram
*/
@Test
public void testDefaultProxy() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy/" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Get the image and verify its size (~2000 bytes)
byte[] inMemoryImage = getContentAsBytes(conn);
int diagramLen = inMemoryImage.length;
assertTrue(diagramLen > 2000);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 2000);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the proxified reception of the default Bob and Alice diagram in a specific format (SVG)
*/
@Test
public void testProxyWithFormat() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy/svg/" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 1000);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 1000);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies that the HTTP header of a diagram incites the browser to cache it.
*/
@Test
public void testInvalidUrl() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy/invalidURL");
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Check if status code is 400
assertEquals(
"Bad HTTP status received",
400,
conn.getResponseCode()
);
Assertions.assertEquals(400, conn.getResponseCode(), "Bad HTTP status received");
// Check error message
assertTrue(
"Response is not malformed URL",
getContentText(conn.getErrorStream()).contains("URL malformed.")
Assertions.assertTrue(
getContentText(conn.getErrorStream()).contains("URL malformed."),
"Response is not malformed URL"
);
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -12,103 +15,104 @@ public class TestProxy extends WebappTestCase {
/**
* Verifies the proxified reception of the default Bob and Alice diagram
*/
@Test
public void testDefaultProxy() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy?src=" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not PNG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/png",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not PNG"
);
// Get the image and verify its size (~2000 bytes)
byte[] inMemoryImage = getContentAsBytes(conn);
int diagramLen = inMemoryImage.length;
assertTrue(diagramLen > 2000);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 2000);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the proxified reception of the default Bob and Alice diagram with defined format.
*/
@Test
public void testProxyWithFormat() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy?fmt=svg&src=" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 1500);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 1500);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the proxified reception of the default Bob and Alice diagram with defined format and format (idx=0).
*/
@Test
public void testProxyWithFormatIdx0() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy?fmt=svg&idx=0&src=" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 1500);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 1500);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the proxified reception of the default Bob and Alice diagram with defined format and format (idx=1).
*/
@Test
public void testProxyWithFormatIdx1() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy?fmt=svg&idx=1&src=" + getTestDiagramUrl());
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response
// Verifies HTTP status code and the Content-Type
assertEquals("Bad HTTP status received", 200, conn.getResponseCode());
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 5000);
assertTrue(diagramLen < 6000);
Assertions.assertTrue(diagramLen > 5000);
Assertions.assertTrue(diagramLen < 6000);
}
/**
* Verifies that the HTTP header of a diagram incites the browser to cache it.
*/
@Test
public void testInvalidUrl() throws IOException {
final URL url = new URL(getServerUrl() + "/proxy?src=invalidURL");
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// Analyze response, it must be HTTP error 400
assertEquals(
"Bad HTTP status received",
400,
conn.getResponseCode()
);
Assertions.assertEquals(400, conn.getResponseCode(), "Bad HTTP status received");
// Check error message
assertTrue(
"Response is not malformed URL",
getContentText(conn.getErrorStream()).contains("URL malformed.")
Assertions.assertTrue(
getContentText(conn.getErrorStream()).contains("URL malformed."),
"Response is not malformed URL"
);
}

View File

@ -8,6 +8,9 @@ import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.servlet.utils.TestUtils;
import net.sourceforge.plantuml.servlet.utils.WebappTestCase;
@ -17,26 +20,28 @@ public class TestSVG extends WebappTestCase {
/**
* Verifies the generation of the SVG for the Bob -> Alice sample
*/
@Test
public void testSimpleSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/svg/" + TestUtils.SEQBOB);
final URLConnection conn = url.openConnection();
// Analyze response
// Verifies the Content-Type header
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn);
int diagramLen = diagram.length();
assertTrue(diagramLen > 1000);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 1000);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the generation of the SVG for the Bob -> Alice sample
*/
@Test
public void testPostedSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/svg");
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
@ -49,27 +54,24 @@ public class TestSVG extends WebappTestCase {
}
// Analyze response
// HTTP response 200
assertEquals(
"Bad HTTP status received",
200,
conn.getResponseCode()
);
Assertions.assertEquals(200, conn.getResponseCode(), "Bad HTTP status received");
// Verifies the Content-Type header
assertEquals(
"Response content type is not SVG",
Assertions.assertEquals(
"image/svg+xml",
conn.getContentType().toLowerCase()
conn.getContentType().toLowerCase(),
"Response content type is not SVG"
);
// Get the content and verify its size
String diagram = getContentText(conn.getInputStream());
int diagramLen = diagram.length();
assertTrue(diagramLen > 1000);
assertTrue(diagramLen < 3000);
Assertions.assertTrue(diagramLen > 1000);
Assertions.assertTrue(diagramLen < 3000);
}
/**
* Verifies the generation of the SVG for the Bob -> Alice sample
*/
@Test
public void testPostedInvalidSequenceDiagram() throws IOException {
final URL url = new URL(getServerUrl() + "/svg");
final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
@ -82,16 +84,13 @@ public class TestSVG extends WebappTestCase {
}
// Analyze response
// HTTP response 400
assertEquals(
"Bad HTTP status received",
400,
conn.getResponseCode()
);
Assertions.assertEquals(400, conn.getResponseCode(), "Bad HTTP status received");
}
/**
* Check the content of the SVG
*/
@Test
public void testSequenceDiagramContent() throws IOException {
final URL url = new URL(getServerUrl() + "/svg/" + TestUtils.SEQBOB);
// Analyze response
@ -112,8 +111,8 @@ public class TestSVG extends WebappTestCase {
aliceCounter++;
}
}
assertTrue(bobCounter == 2);
assertTrue(aliceCounter == 2);
Assertions.assertTrue(bobCounter == 2);
Assertions.assertTrue(aliceCounter == 2);
}
}

View File

@ -1,7 +1,7 @@
package net.sourceforge.plantuml.servlet;
import static org.junit.Assert.assertNotEquals;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
@ -15,46 +15,49 @@ public class TestWebUI extends WebappUITestCase {
/**
* Verifies that the welcome page has exactly two form with the Bob --> Alice sample
*/
@Test
public void testWelcomePage() {
driver.get(getServerUrl());
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals(TestUtils.SEQBOBCODE, text);
Assertions.assertEquals(TestUtils.SEQBOBCODE, text);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/" + TestUtils.SEQBOB));
Assertions.assertTrue(url.endsWith("/png/" + TestUtils.SEQBOB));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight()); // 145
assertNotEquals(0, dim.getWidth()); // 134
Assertions.assertNotEquals(0, dim.getHeight()); // 145
Assertions.assertNotEquals(0, dim.getWidth()); // 134
}
/**
* Verifies that the version image is generated
*/
@Test
public void testVersion() {
driver.get(getServerUrl());
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// change code and observe result
setEditorValue(TestUtils.VERSIONCODE);
assertTrue("Auto update done", waitUntilAutoRefreshCompleted());
Assertions.assertTrue(waitUntilAutoRefreshCompleted(), "Auto update done");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals(TestUtils.VERSIONCODE, text);
Assertions.assertEquals(TestUtils.VERSIONCODE, text);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/" + TestUtils.VERSION));
Assertions.assertTrue(url.endsWith("/png/" + TestUtils.VERSION));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight()); // 242
assertNotEquals(0, dim.getWidth()); // 472
Assertions.assertNotEquals(0, dim.getHeight()); // 242
Assertions.assertNotEquals(0, dim.getWidth()); // 472
}
// /**
// * Verifies that when the UML text is empty, ...
// * old behavior: default page and image is generated
// */
// @Test
// public void testEmptyText() {
// // ...
// }
@ -63,6 +66,7 @@ public class TestWebUI extends WebappUITestCase {
// * Verifies that when the encoded URL is empty, ...
// * old behavior: default page and image is generated
// */
// @Test
// public void testEmptyUrl() {
// // ...
// }
@ -70,69 +74,72 @@ public class TestWebUI extends WebappUITestCase {
/**
* Verifies that a ditaa diagram is generated
*/
@Test
public void testDitaaText() {
driver.get(getServerUrl());
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// change code and observe result
setEditorValue("@startditaa \n*--> \n@endditaa");
assertTrue("Auto update done", waitUntilAutoRefreshCompleted());
Assertions.assertTrue(waitUntilAutoRefreshCompleted(), "Auto update done");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals("@startditaa \n*--> \n@endditaa", text);
Assertions.assertEquals("@startditaa \n*--> \n@endditaa", text);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/SoWkIImgISaiIKnKuDBIrRLJu798pKi12m00"));
Assertions.assertTrue(url.endsWith("/png/SoWkIImgISaiIKnKuDBIrRLJu798pKi12m00"));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight());
assertNotEquals(0, dim.getWidth());
Assertions.assertNotEquals(0, dim.getHeight());
Assertions.assertNotEquals(0, dim.getWidth());
}
/**
* Verifies that an image map is produced if the diagram contains a link
*/
@Test
public void testImageMap() {
driver.get(getServerUrl());
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// change code and observe result
setEditorValue("@startuml\nBob -> Alice : [[http://yahoo.com]] Hello\n@enduml");
assertTrue("Auto update done", waitUntilAutoRefreshCompleted());
Assertions.assertTrue(waitUntilAutoRefreshCompleted(), "Auto update done");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals("@startuml\nBob -> Alice : [[http://yahoo.com]] Hello\n@enduml", text);
Assertions.assertEquals("@startuml\nBob -> Alice : [[http://yahoo.com]] Hello\n@enduml", text);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/SyfFKj2rKt3CoKnELR1IY8xEA2afiDBNhqpCoC_NIyxFZOrLy4ZDoSa70000"));
Assertions.assertTrue(url.endsWith("/png/SyfFKj2rKt3CoKnELR1IY8xEA2afiDBNhqpCoC_NIyxFZOrLy4ZDoSa70000"));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight());
assertNotEquals(0, dim.getWidth());
Assertions.assertNotEquals(0, dim.getHeight());
Assertions.assertNotEquals(0, dim.getWidth());
// ensure the image map is present
WebElement map = getImageMap();
assertNotNull(map);
assertEquals(1, Integer.parseInt(map.getAttribute("childElementCount")));
Assertions.assertNotNull(map);
Assertions.assertEquals(1, Integer.parseInt(map.getAttribute("childElementCount")));
// ensure the map button is visible
WebElement btnMap = driver.findElement(By.id("map-diagram-link"));
assertTrue(btnMap.isDisplayed());
Assertions.assertTrue(btnMap.isDisplayed());
}
/**
* Verifies that when the encoded source is specified as an URL parameter
* the diagram is displayed and the source is decoded
*/
@Test
public void testUrlParameter() {
driver.get(getServerUrl() + "/form?url=" + TestUtils.SEQBOB);
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals(TestUtils.SEQBOBCODE, text);
Assertions.assertEquals(TestUtils.SEQBOBCODE, text);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/" + TestUtils.SEQBOB));
Assertions.assertTrue(url.endsWith("/png/" + TestUtils.SEQBOB));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight());
assertNotEquals(0, dim.getWidth());
Assertions.assertNotEquals(0, dim.getHeight());
Assertions.assertNotEquals(0, dim.getWidth());
}
/**
@ -147,28 +154,29 @@ public class TestWebUI extends WebappUITestCase {
* newpage
* Bob <- Alice : bye
*/
@Test
public void testIndexPage() {
driver.get(
getServerUrl() + "/uml/1/" +
"SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"
);
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals(
Assertions.assertEquals(
"@startuml\nBob -> Alice : hello\nnewpage\nBob <- Alice : hello\nBob -> Alice : let's talk\nBob <- Alice : better not\nBob -> Alice : <&rain> bye\nnewpage\nBob <- Alice : bye\n@enduml",
text
);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/1/SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"));
Assertions.assertTrue(url.endsWith("/png/1/SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight());
assertNotEquals(0, dim.getWidth());
Assertions.assertNotEquals(0, dim.getHeight());
Assertions.assertNotEquals(0, dim.getWidth());
// ensure the correct index was generated
assertTrue(dim.getHeight() > 200); // 222
assertTrue(dim.getHeight() < 250); // 222
Assertions.assertTrue(dim.getHeight() > 200); // 222
Assertions.assertTrue(dim.getHeight() < 250); // 222
}
/**
@ -183,27 +191,28 @@ public class TestWebUI extends WebappUITestCase {
* newpage
* Bob <- Alice : bye
*/
@Test
public void testIndexPageWithNoDefinedIndex() {
driver.get(
getServerUrl() + "/uml/" +
"SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"
);
assertTrue("UI loading completed", waitUntilUIIsLoaded());
Assertions.assertTrue(waitUntilUIIsLoaded(), "UI loading completed");
// ensure the editor text is correct
String text = getEditorValue();
assertEquals(
Assertions.assertEquals(
"@startuml\nBob -> Alice : hello\nnewpage\nBob <- Alice : hello\nBob -> Alice : let's talk\nBob <- Alice : better not\nBob -> Alice : <&rain> bye\nnewpage\nBob <- Alice : bye\n@enduml",
text
);
// ensure the URL field is correct
String url = getURLValue();
assertTrue(url.endsWith("/png/SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"));
Assertions.assertTrue(url.endsWith("/png/SyfFKj2rKt3CoKnELR1Io4ZDoSddoaijBqXCJ-Lo0ahQwA99Eg7go4ajKIzMA4dCoKPNdfHQKf9Qf92NNuAknqQjA34ppquXgJ8Lbrr0AG00"));
// ensure the generated image is present
Dimension dim = getImageSize();
assertNotEquals(0, dim.getHeight());
assertNotEquals(0, dim.getWidth());
Assertions.assertNotEquals(0, dim.getHeight());
Assertions.assertNotEquals(0, dim.getWidth());
// ensure the correct index was generated
assertTrue(dim.getHeight() > 100); // 132
assertTrue(dim.getHeight() < 150); // 132
Assertions.assertTrue(dim.getHeight() > 100); // 132
Assertions.assertTrue(dim.getHeight() < 150); // 132
}
}

View File

@ -7,15 +7,17 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.stream.Collectors;
import junit.framework.TestCase;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import net.sourceforge.plantuml.servlet.server.EmbeddedJettyServer;
import net.sourceforge.plantuml.servlet.server.ExternalServer;
import net.sourceforge.plantuml.servlet.server.ServerUtils;
public abstract class WebappTestCase extends TestCase {
public abstract class WebappTestCase {
private final ServerUtils serverUtils;
@ -34,12 +36,12 @@ public abstract class WebappTestCase extends TestCase {
serverUtils = new EmbeddedJettyServer();
}
@Override
@BeforeEach
public void setUp() throws Exception {
serverUtils.startServer();
}
@Override
@AfterEach
public void tearDown() throws Exception {
serverUtils.stopServer();
}
@ -67,17 +69,8 @@ public abstract class WebappTestCase extends TestCase {
}
public String getContentText(final InputStream stream) throws IOException {
try (
final InputStreamReader isr = new InputStreamReader(stream);
final BufferedReader br = new BufferedReader(isr);
) {
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
return sb.toString().trim();
try (final BufferedReader br = new BufferedReader(new InputStreamReader(stream))) {
return br.lines().collect(Collectors.joining("\n"));
}
}

View File

@ -2,6 +2,8 @@ package net.sourceforge.plantuml.servlet.utils;
import java.time.Duration;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
@ -16,14 +18,14 @@ public abstract class WebappUITestCase extends WebappTestCase {
public WebDriver driver;
public JavascriptExecutor js;
@Override
@BeforeEach
public void setUp() throws Exception {
super.setUp();
driver = JUnitWebDriver.getDriver();
js = (JavascriptExecutor)driver;
}
@Override
@AfterEach
public void tearDown() throws Exception {
driver.close();
super.tearDown();