org.eobjects.analyzer.cli.MainTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eobjects.analyzer.cli.MainTest.java

Source

/**
 * eobjects.org AnalyzerBeans
 * Copyright (C) 2010 eobjects.org
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.eobjects.analyzer.cli;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import junit.framework.TestCase;
import nu.validator.htmlparser.common.XmlViolationPolicy;
import nu.validator.htmlparser.sax.HtmlParser;

import org.apache.commons.lang.SerializationUtils;
import org.apache.log4j.PropertyConfigurator;
import org.eobjects.analyzer.result.AnalysisResult;
import org.eobjects.metamodel.util.FileHelper;
import org.w3c.tidy.Tidy;
import org.xml.sax.Attributes;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

public class MainTest extends TestCase {

    private StringWriter _stringWriter;
    private PrintStream _originalSysOut;

    @Override
    protected void setUp() throws Exception {
        _stringWriter = new StringWriter();
        _originalSysOut = System.out;
        useAsSystemOut(_stringWriter);

        PropertyConfigurator.configure("src/test/resources/log4j.xml");
    }

    private void useAsSystemOut(StringWriter stringWriter) {
        OutputStream out = new OutputStream() {
            @Override
            public void write(int b) throws IOException {
                _stringWriter.write(b);
            }
        };
        System.setOut(new PrintStream(out));
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        System.setOut(_originalSysOut);
    }

    public void testUsage() throws Throwable {
        Main.main("-usage".split(" "));

        String out1 = _stringWriter.toString();

        String[] lines = out1.split("\n");

        assertEquals(11, lines.length);

        assertEquals(
                "-conf (-configuration, --configuration-file) PATH          : Path to an XML file describing the configuration of",
                lines[0].trim());
        assertEquals("AnalyzerBeans", lines[1].trim());
        assertEquals(
                "-ds (-datastore, --datastore-name) VAL                     : Name of datastore when printing a list of schemas, tables",
                lines[2].trim());
        assertEquals("or columns", lines[3].trim());
        assertEquals(
                "-job (--job-file) PATH                                     : Path to an analysis job XML file to execute",
                lines[4].trim());
        assertEquals(
                "-list [ANALYZERS | TRANSFORMERS | FILTERS | DATASTORES |   : Used to print a list of various elements available in the",
                lines[5].trim());
        assertEquals("SCHEMAS | TABLES | COLUMNS]                                : configuration", lines[6].trim());
        assertEquals(
                "-of (--output-file) PATH                                   : Path to file in which to save the result of the job",
                lines[7].trim());
        assertEquals(
                "-ot (--output-type) [TEXT | HTML | SERIALIZED]             : How to represent the result of the job",
                lines[8].trim());
        assertEquals(
                "-s (-schema, --schema-name) VAL                            : Name of schema when printing a list of tables or columns",
                lines[9].trim());
        assertEquals(
                "-t (-table, --table-name) VAL                              : Name of table when printing a list of columns",
                lines[10].trim());

        // again without the -usage flag
        _stringWriter = new StringWriter();
        useAsSystemOut(_stringWriter);
        Main.main(new String[0]);

        String out2 = _stringWriter.toString();
        assertEquals(out1, out2);
    }

    public void testListDatastores() throws Throwable {
        Main.main("-conf examples/conf.xml -list DATASTORES".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        assertEquals("Datastores:\n-----------\nall_datastores\nemployees_csv\norderdb\n", out);
    }

    public void testListSchemas() throws Throwable {
        Main.main("-conf examples/conf.xml -ds orderdb -list SCHEMAS".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        assertEquals("Schemas:\n" + "--------\n" + "INFORMATION_SCHEMA\n" + "PUBLIC\n", out);
    }

    public void testListTables() throws Throwable {
        Main.main("-conf examples/conf.xml -ds orderdb -schema PUBLIC -list TABLES".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        assertEquals(
                "Tables:\n-------\nCUSTOMERS\nCUSTOMER_W_TER\nDEPARTMENT_MANAGERS\nDIM_TIME\nEMPLOYEES\nOFFICES\nORDERDETAILS\nORDERFACT\nORDERS\nPAYMENTS\nPRODUCTS\nQUADRANT_ACTUALS\nTRIAL_BALANCE\n",
                out);
    }

    public void testListColumns() throws Throwable {
        Main.main("-conf examples/conf.xml -ds orderdb -schema PUBLIC -table EMPLOYEES -list COLUMNS".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        assertEquals(
                "Columns:\n--------\nEMPLOYEENUMBER\nLASTNAME\nFIRSTNAME\nEXTENSION\nEMAIL\nOFFICECODE\nREPORTSTO\nJOBTITLE\n",
                out);
    }

    public void testListTransformers() throws Throwable {
        Main.main("-conf examples/conf.xml -list TRANSFORMERS".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        String[] lines = out.split("\n");

        assertEquals("Transformers:", lines[0]);

        assertTrue(out.indexOf("name: Email standardizer") != -1);
        assertTrue(out.indexOf("Output type is: String") != -1);
    }

    public void testListFilters() throws Throwable {
        Main.main("-conf examples/conf.xml -list FILTERS".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        String[] lines = out.split("\n");

        assertEquals("Filters:", lines[0]);

        assertTrue(out.indexOf("name: Null check") != -1);
        assertTrue(out.indexOf("- Outcome category: NOT_NULL") != -1);
    }

    public void testListAnalyzers() throws Throwable {
        Main.main("-conf examples/conf.xml -list ANALYZERS".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        String[] lines = out.split("\n");

        assertEquals("Analyzers:", lines[0]);

        assertTrue(out.indexOf("name: Pattern finder") != -1);
        assertTrue(out.indexOf("name: String analyzer") != -1);
    }

    public void testExampleEmployeesJob() throws Throwable {
        Main.main("-conf examples/conf.xml -job examples/employees_job.xml".split(" "));

        String out = _stringWriter.toString().replaceAll("\r\n", "\n");
        String[] lines = out.split("\n");

        assertTrue(out.indexOf(" - company.com: 4\n" + " - eobjects.org: 2") != -1);

        assertTrue("lines length was: " + lines.length, lines.length > 60);
        assertTrue("lines length was: " + lines.length, lines.length < 90);

        assertEquals("SUCCESS!", lines[0]);
    }

    public void testWriteToFile() throws Throwable {
        String filename = "target/test_write_to_file.txt";
        Main.main(("-conf examples/conf.xml -job examples/employees_job.xml -of " + filename).split(" "));

        File file = new File(filename);
        assertTrue(file.exists());
        String result = FileHelper.readFileAsString(file);
        assertEquals("SUCCESS!", result.split("\n")[0].trim());

        assertEquals("", _stringWriter.toString());
    }

    public void testRunFromUrlJobAndConf() throws Throwable {
        // first check if we have a connection
        try {
            InetAddress.getByName("eobjects.org");
        } catch (UnknownHostException e) {
            System.err.println("Skipping test " + getClass().getSimpleName() + "." + getName()
                    + " since we don't seem to be able to reach eobjects.org");
            e.printStackTrace();
            return;
        }

        String filename = "target/test_run_from_url_job_and_conf.html";
        Main.main(("-ot HTML -of " + filename
                + " -job http://eobjects.org/resources/example_repo/DC/jobs/random_number_generation.analysis.xml -conf http://eobjects.org/resources/example_repo/DC/conf.xml")
                        .split(" "));

        File file = new File(filename);
        assertTrue(file.exists());
        String result = FileHelper.readFileAsString(file);
        String[] lines = result.split("\n");

        assertEquals("<html>", lines[1]);

        Tidy tidy = new Tidy();
        StringWriter writer = new StringWriter();
        tidy.setTrimEmptyElements(false);
        tidy.setErrout(new PrintWriter(writer));
        tidy.parse(FileHelper.getReader(file), System.out);

        String parserOutput = writer.toString();
        assertTrue("Parser output was:\n" + parserOutput,
                parserOutput.indexOf("no warnings or errors were found") != -1);
    }

    public void testWriteHtmlToFile() throws Throwable {
        String filename = "target/test_write_html_to_file.html";
        Main.main(("-conf examples/conf.xml -job examples/employees_job.xml -of " + filename + " -ot HTML")
                .split(" "));

        File file = new File(filename);
        assertTrue(file.exists());

        {
            String result = FileHelper.readFileAsString(file);
            String[] lines = result.split("\n");

            assertEquals("<html>", lines[1]);
        }

        InputStream in = FileHelper.getInputStream(file);
        try {
            // parse it with validator.nu for HTML correctness
            final HtmlParser htmlParser = new HtmlParser(XmlViolationPolicy.FATAL);
            final AtomicInteger elementCounter = new AtomicInteger();
            htmlParser.setContentHandler(new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes)
                        throws SAXException {
                    elementCounter.incrementAndGet();
                }
            });
            final List<Exception> warningsAndErrors = new ArrayList<Exception>();
            htmlParser.setErrorHandler(new ErrorHandler() {
                @Override
                public void warning(SAXParseException exception) throws SAXException {
                    System.err.println("Warning: " + exception.getMessage());
                    warningsAndErrors.add(exception);
                }

                @Override
                public void fatalError(SAXParseException exception) throws SAXException {
                    System.out.println("Fatal error: " + exception.getMessage());
                    throw exception;
                }

                @Override
                public void error(SAXParseException exception) throws SAXException {
                    System.err.println("Error: " + exception.getMessage());
                    warningsAndErrors.add(exception);
                }
            });

            htmlParser.parse(new InputSource(in));

            // the output has approx 3600 XML elements
            int elementCount = elementCounter.get();
            assertTrue("Element count: " + elementCount, elementCount > 3000);
            assertTrue("Element count: " + elementCount, elementCount < 5000);

            if (!warningsAndErrors.isEmpty()) {
                for (Exception error : warningsAndErrors) {
                    if (error.getMessage()
                            .startsWith("No explicit character encoding declaration has been seen yet")) {
                        // ignore/accept this one
                        continue;
                    }
                    error.printStackTrace();
                    fail("Got " + warningsAndErrors.size() + " warnings and errors, see log for details");
                }
            }
        } finally {
            in.close();
        }
    }

    public void testWriteSerializedToFile() throws Throwable {
        String filename = "target/test_write_serialized_to_file.analysis.result.dat";
        Main.main(("-conf examples/conf.xml -job examples/employees_job.xml -of " + filename + " -ot SERIALIZED")
                .split(" "));

        File file = new File(filename);
        assertTrue(file.exists());

        AnalysisResult result = (AnalysisResult) SerializationUtils.deserialize(new FileInputStream(file));
        assertNotNull(result);
        assertEquals(6, result.getResults().size());
    }
}