org.apache.maven.doxia.siterenderer.DefaultSiteRendererTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.maven.doxia.siterenderer.DefaultSiteRendererTest.java

Source

package org.apache.maven.doxia.siterenderer;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
import org.apache.maven.doxia.xsd.AbstractXmlValidator;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
import org.xml.sax.EntityResolver;

/**
 * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
 * @author <a href="mailto:evenisse@codehaus.org">Emmanuel Venisse</a>
 */
public class DefaultSiteRendererTest extends PlexusTestCase {
    /**
     * All output produced by this test will go here.
     */
    private static final String OUTPUT = "target/output";

    /**
     * The renderer used to produce output.
     */
    private Renderer renderer;

    /**
     * The locale before executing tests.
     */
    private Locale oldLocale;

    private File skinJar = new File(getBasedir(), "target/test-classes/skin.jar");

    /**
     * @throws java.lang.Exception if something goes wrong.
     * @see org.codehaus.plexus.PlexusTestCase#setUp()
     */
    @Override
    protected void setUp() throws Exception {
        super.setUp();

        renderer = (Renderer) lookup(Renderer.ROLE);

        // copy the default-site.vm and default-site-macros.vm
        copyVm("default-site.vm", "\n\n\n\r\n\r\n\r\n");
        copyVm("default-site-macros.vm", "");

        InputStream skinIS = this.getResourceAsStream("velocity-toolmanager.vm");
        JarOutputStream jarOS = new JarOutputStream(new FileOutputStream(skinJar));
        try {
            jarOS.putNextEntry(new ZipEntry("META-INF/maven/site.vm"));
            IOUtil.copy(skinIS, jarOS);
            jarOS.closeEntry();
        } finally {
            IOUtil.close(skinIS);
            IOUtil.close(jarOS);
        }

        oldLocale = Locale.getDefault();
        Locale.setDefault(Locale.ENGLISH);
    }

    private void copyVm(String filename, String append) throws IOException {
        InputStream is = this.getResourceAsStream("/org/apache/maven/doxia/siterenderer/resources/" + filename);
        assertNotNull(is);
        OutputStream os = new FileOutputStream(new File(getBasedir(), "target/test-classes/" + filename));
        try {
            IOUtil.copy(is, os);
            os.write(append.getBytes("ISO-8859-1"));
        } finally {
            IOUtil.close(is);
            IOUtil.close(os);
        }
    }

    /**
     * @throws java.lang.Exception if something goes wrong.
     * @see org.codehaus.plexus.PlexusTestCase#tearDown()
     */
    @Override
    protected void tearDown() throws Exception {
        release(renderer);
        super.tearDown();

        Locale.setDefault(oldLocale);
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void testRender() throws Exception {
        // Safety
        FileUtils.deleteDirectory(getTestFile(OUTPUT));

        // ----------------------------------------------------------------------
        // Render the site from src/test/resources/site to OUTPUT
        // ----------------------------------------------------------------------
        DecorationModel decoration = new DecorationXpp3Reader()
                .read(new FileReader(getTestFile("src/test/resources/site/site.xml")));

        SiteRenderingContext ctxt = getSiteRenderingContext(decoration, "src/test/resources/site", false);
        ctxt.setRootDirectory(getTestFile(""));
        renderer.render(renderer.locateDocumentFiles(ctxt, true).values(), ctxt, getTestFile(OUTPUT));

        ctxt = getSiteRenderingContext(decoration, "src/test/resources/site-validate", true);
        ctxt.setRootDirectory(getTestFile(""));
        renderer.render(renderer.locateDocumentFiles(ctxt, true).values(), ctxt, getTestFile(OUTPUT));

        // ----------------------------------------------------------------------
        // Verify specific pages
        // ----------------------------------------------------------------------
        verifyHeadPage();
        verifyCdcPage();
        verifyNestedItemsPage();
        verifyMultipleBlock();
        verifyMacro();
        verifyEntitiesPage();
        verifyJavascriptPage();
        verifyFaqPage();
        verifyAttributes();
        verifyMisc();
        verifyDocbookPageExists();
        verifyApt();
        verifyExtensionInFilename();
        verifyNewlines();

        // ----------------------------------------------------------------------
        // Validate the rendering pages
        // ----------------------------------------------------------------------
        validatePages();
    }

    public void testExternalReport() throws Exception {
        DocumentRenderer docRenderer = mock(DocumentRenderer.class);
        when(docRenderer.isExternalReport()).thenReturn(true);
        when(docRenderer.getOutputName()).thenReturn("external/index");
        when(docRenderer.getRenderingContext())
                .thenReturn(new RenderingContext(new File(""), "index.html", "generator:external"));

        SiteRenderingContext context = new SiteRenderingContext();

        renderer.render(Collections.singletonList(docRenderer), context, new File("target/output"));

        verify(docRenderer).renderDocument(isNull(Writer.class), eq(renderer), eq(context));
    }

    public void testVelocityToolManager() throws Exception {
        StringWriter writer = new StringWriter();

        SiteRenderingContext siteRenderingContext = new SiteRenderingContext();
        siteRenderingContext.setDecoration(new DecorationModel());

        Map<String, Object> attributes = new HashMap<String, Object>();

        /*
         * We need to add doxiaSiteRendererVersion manually because version property from pom.properties
         * is not available at test time in some cases.
         */
        attributes.put("doxiaSiteRendererVersion", "1.7-bogus");

        siteRenderingContext.setTemplateProperties(attributes);

        siteRenderingContext.setTemplateName("org/apache/maven/doxia/siterenderer/velocity-toolmanager.vm");
        RenderingContext context = new RenderingContext(new File(""), "document.html", "generator");
        SiteRendererSink sink = new SiteRendererSink(context);
        renderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext);

        String renderResult = writer.toString();
        String expectedResult = IOUtils
                .toString(getClass().getResourceAsStream("velocity-toolmanager.expected.txt"));
        expectedResult = StringUtils.unifyLineSeparators(expectedResult);
        assertEquals(expectedResult, renderResult);
    }

    public void testVelocityToolManagerForTemplate() throws Exception {
        StringWriter writer = new StringWriter();

        File templateFile = new File(getBasedir(),
                "target/test-classes/org/apache/maven/doxia/siterenderer/velocity-toolmanager.vm");
        Map<String, Object> attributes = new HashMap<String, Object>();

        /*
         * We need to add doxiaSiteRendererVersion manually because version property from pom.properties
         * is not available at test time in some cases.
         */
        attributes.put("doxiaSiteRendererVersion", "1.7-bogus");

        SiteRenderingContext siteRenderingContext = renderer.createContextForTemplate(templateFile, attributes,
                new DecorationModel(), "defaultWindowTitle", Locale.ENGLISH);
        RenderingContext context = new RenderingContext(new File(""), "document.html", "generator");
        SiteRendererSink sink = new SiteRendererSink(context);
        renderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext);

        String renderResult = writer.toString();
        String expectedResult = IOUtils
                .toString(getClass().getResourceAsStream("velocity-toolmanager.expected.txt"));
        expectedResult = StringUtils.unifyLineSeparators(expectedResult);
        assertEquals(expectedResult, renderResult);
    }

    public void testVelocityToolManagerForSkin() throws Exception {
        StringWriter writer = new StringWriter();

        File skinFile = skinJar;

        Map<String, Object> attributes = new HashMap<String, Object>();

        /*
         * We need to add doxiaSiteRendererVersion manually because version property from pom.properties
         * is not available at test time in some cases.
         */
        attributes.put("doxiaSiteRendererVersion", "1.7-bogus");

        Artifact skin = new DefaultArtifact("org.group", "artifact", "1.1", null, "jar", "", null);
        skin.setFile(skinFile);
        SiteRenderingContext siteRenderingContext = renderer.createContextForSkin(skin, attributes,
                new DecorationModel(), "defaultWindowTitle", Locale.ENGLISH);
        RenderingContext context = new RenderingContext(new File(""), "document.html", "generator");
        SiteRendererSink sink = new SiteRendererSink(context);
        renderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext);
        String renderResult = writer.toString();
        String expectedResult = IOUtils
                .toString(getClass().getResourceAsStream("velocity-toolmanager.expected.txt"));
        expectedResult = StringUtils.unifyLineSeparators(expectedResult);
        assertEquals(expectedResult, renderResult);
    }

    public void testMatchVersion() throws Exception {
        DefaultSiteRenderer r = (DefaultSiteRenderer) renderer;
        assertTrue(r.matchVersion("1.7", "1.7"));
        assertFalse(r.matchVersion("1.7", "1.8"));
    }

    private SiteRenderingContext getSiteRenderingContext(DecorationModel decoration, String siteDir,
            boolean validate) {
        SiteRenderingContext ctxt = new SiteRenderingContext();
        ctxt.setTemplateName("default-site.vm");
        ctxt.setTemplateClassLoader(getClassLoader());
        ctxt.setUsingDefaultTemplate(true);
        final Map<String, String> templateProp = new HashMap<String, String>();
        templateProp.put("outputEncoding", "UTF-8");
        ctxt.setTemplateProperties(templateProp);
        ctxt.setDecoration(decoration);
        ctxt.addSiteDirectory(getTestFile(siteDir));
        ctxt.setValidate(validate);

        return ctxt;
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyHeadPage() throws Exception {
        new HeadVerifier().verify("target/output/head.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyCdcPage() throws Exception {
        File nestedItems = getTestFile("target/output/cdc.html");
        assertNotNull(nestedItems);
        assertTrue(nestedItems.exists());
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyNestedItemsPage() throws Exception {
        NestedItemsVerifier verifier = new NestedItemsVerifier();
        verifier.verify("target/output/nestedItems.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyMultipleBlock() throws Exception {
        MultipleBlockVerifier verifier = new MultipleBlockVerifier();
        verifier.verify("target/output/multipleblock.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyMacro() throws Exception {
        File macro = getTestFile("target/output/macro.html");
        assertNotNull(macro);
        assertTrue(macro.exists());

        Reader reader = null;
        try {
            reader = ReaderFactory.newXmlReader(macro);
            String content = IOUtil.toString(reader);
            assertEquals(content.indexOf("</macro>"), -1);
        } finally {
            IOUtil.close(reader);
        }
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyEntitiesPage() throws Exception {
        EntitiesVerifier verifier = new EntitiesVerifier();
        verifier.verify("target/output/entityTest.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyJavascriptPage() throws Exception {
        JavascriptVerifier verifier = new JavascriptVerifier();
        verifier.verify("target/output/javascript.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyFaqPage() throws Exception {
        FaqVerifier verifier = new FaqVerifier();
        verifier.verify("target/output/faq.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyAttributes() throws Exception {
        AttributesVerifier verifier = new AttributesVerifier();
        verifier.verify("target/output/attributes.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyMisc() throws Exception {
        AbstractVerifier verifier = new MiscVerifier();
        verifier.verify("target/output/misc.html");

        verifier = new CommentsVerifier();
        verifier.verify("target/output/misc.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyDocbookPageExists() throws Exception {
        File output = getTestFile("target/output/docbook.html");
        assertNotNull(output);
        assertTrue(output.exists());
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyApt() throws Exception {
        AbstractVerifier verifier = new AptVerifier();
        verifier.verify("target/output/apt.html");

        verifier = new CommentsVerifier();
        verifier.verify("target/output/apt.html");
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyExtensionInFilename() throws Exception {
        File output = getTestFile("target/output/extension.apt.not.at.end.html");
        assertNotNull(output);
        assertTrue(output.exists());
    }

    /**
     * @throws Exception if something goes wrong.
     */
    public void verifyNewlines() throws Exception {
        /* apt */
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/apt.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/cdc.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/interpolation.html"), "ISO-8859-1"));
        /* confluence */
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/confluence/anchor.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/confluence/code.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/confluence/table.html"), "ISO-8859-1"));
        /* docbook */
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/docbook.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/sdocbook_full.html"), "ISO-8859-1"));
        /* fml */
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/faq.html"), "ISO-8859-1"));
        /* xdoc */
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/attributes.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/javascript.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/head.html"), "ISO-8859-1"));
        checkNewlines(FileUtils.fileRead(getTestFile("target/output/macro.html"), "ISO-8859-1"));
    }

    private void checkNewlines(String content) {
        int cr = StringUtils.countMatches(content, "\r");
        int lf = StringUtils.countMatches(content, "\n");
        assertTrue("Should contain only Windows or Unix newlines: cr = " + cr + ", lf = " + lf,
                (cr == 0) || (cr == lf));
    }

    /**
     * Validate the generated pages.
     *
     * @throws Exception if something goes wrong.
     * @since 1.1.1
     */
    public void validatePages() throws Exception {
        new XhtmlValidatorTest().validateGeneratedPages();
    }

    protected static class XhtmlValidatorTest extends AbstractXmlValidator {
        /**
         * Validate the generated documents.
         *
         * @throws Exception
         */
        public void validateGeneratedPages() throws Exception {
            setUp();
            testValidateFiles();
            tearDown();
        }

        private static String[] getIncludes() {
            return new String[] { "**/*.html" };
        }

        /** {@inheritDoc} */
        protected String addNamespaces(String content) {
            return content;
        }

        /** {@inheritDoc} */
        protected EntityResolver getEntityResolver() {
            return new XhtmlEntityResolver();
        }

        /** {@inheritDoc} */
        protected Map<String, String> getTestDocuments() throws IOException {
            Map<String, String> testDocs = new HashMap<String, String>();

            File dir = new File(getBasedir(), "target/output");

            List<String> l = FileUtils.getFileNames(dir, getIncludes()[0], FileUtils.getDefaultExcludesAsString(),
                    true);

            for (String file : l) {
                file = StringUtils.replace(file, "\\", "/");

                Reader reader = ReaderFactory.newXmlReader(new File(file));
                try {
                    testDocs.put(file, IOUtil.toString(reader));
                } finally {
                    IOUtil.close(reader);
                }
            }

            return testDocs;
        }

        /** {@inheritDoc} */
        @Override
        protected boolean isFailErrorMessage(String message) {
            return true;
        }
    }
}