org.ebayopensource.turmeric.tools.errorlibrary.ErrorLibraryGeneratorTest.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.tools.errorlibrary.ErrorLibraryGeneratorTest.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *******************************************************************************/
package org.ebayopensource.turmeric.tools.errorlibrary;

import static org.hamcrest.Matchers.*;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.lang.SystemUtils;
import org.ebayopensource.turmeric.junit.utils.MavenTestingUtils;
import org.ebayopensource.turmeric.common.v1.types.CommonErrorData;
import org.ebayopensource.turmeric.common.v1.types.ErrorCategory;
import org.ebayopensource.turmeric.common.v1.types.ErrorSeverity;
import org.ebayopensource.turmeric.tools.AbstractCodegenTestCase;
import org.ebayopensource.turmeric.tools.GeneratedAssert;
import org.ebayopensource.turmeric.tools.TestResourceUtil;
import org.ebayopensource.turmeric.tools.codegen.exception.BadInputOptionException;
import org.ebayopensource.turmeric.tools.codegen.exception.BadInputValueException;
import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException;
import org.ebayopensource.turmeric.tools.codegen.exception.MissingInputOptionException;
import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil;
import org.ebayopensource.turmeric.tools.codegen.util.JavacHelper;
import org.junit.Assert;
import org.junit.Test;

public class ErrorLibraryGeneratorTest extends AbstractCodegenTestCase {

    @SuppressWarnings("unchecked")
    @Test
    public void missingInputOptions() throws Exception {
        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + MissingInputOptionException.class.getName());
        } catch (MissingInputOptionException ex) {
            Assert.assertThat(ex.getMessage(),
                    allOf(containsString("Project Root is missing"),
                            containsString("Error Library name is missing"),
                            containsString("Project Generated Content Destination is missing"),
                            containsString("Project Meta Src Dir is missing")));
        }
    }

    @Test
    public void faultyInputOptionsGenType() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = testingdir.getDir();

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeFaultyErrorLibAll", "-pr", rootDir.getAbsolutePath() };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + BadInputOptionException.class.getName());
        } catch (BadInputOptionException ex) {
            Assert.assertThat(ex.getMessage(), containsString("Invalid code gen type specified"));
        }
    }

    @Test
    public void emptyDomainListFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + BadInputValueException.class.getName());
        } catch (BadInputValueException ex) {
            Assert.assertThat(ex.getMessage(),
                    containsString("Please provide a proper value for the option -domain"));
        }
    }

    @Test
    public void nonExistingDomainFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "testDomain", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + CodeGenFailedException.class.getName());
        } catch (CodeGenFailedException ex) {
            Assert.assertThat(ex.getMessage(), containsString("domain [testDomain] not found"));
        }
    }

    @Test
    public void faultyErrorNamesFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/ValidateErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "FaultyErrorName", "-errorlibname", "ValidateErrorLibrary" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + CodeGenFailedException.class.getName());
        } catch (CodeGenFailedException ex) {
            Assert.assertThat(ex.getMessage(), containsString("svc_factory_inst_ illegal_access"));
        }
    }

    @Test
    public void entryNotAvailableInErrorPropertiesFileFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/ValidateErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "PropertiesInconsistent", "-errorlibname", "ValidateErrorLibrary" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + CodeGenFailedException.class.getName());
        } catch (CodeGenFailedException ex) {
            Assert.assertThat(ex.getMessage(), containsString("Errors.properties does not have all the errors"));
        }
    }

    @Test
    public void schemaValidationFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/ValidateErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "SchemaValidationFailure", "-errorlibname", "ValidateErrorLibrary" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + CodeGenFailedException.class.getName());
        } catch (CodeGenFailedException ex) {
            Assert.assertThat(ex.getMessage(),
                    containsString("Metadata Validation failed : XML validation against"));
        }
    }

    @Test
    public void duplicatesValidationFailureCase() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/ValidateErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "Duplicates", "-errorlibname", "ValidateErrorLibrary" };
        // @formatter:on

        try {
            performDirectCodeGen(pluginParameters);
            Assert.fail("Expected exception of type: " + CodeGenFailedException.class.getName());
        } catch (CodeGenFailedException ex) {
            Assert.assertThat(ex.getMessage(), containsString("Duplicates found"));
        }
    }

    @Test
    public void generateErrorConstantsSingleDomain() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);

        File genSrcDir = new File(rootDir, "gen-src");

        GeneratedAssert.assertJavaExists(genSrcDir,
                "org.ebayopensource.turmeric.test.errorlibrary.turmericruntime.ErrorConstants");
    }

    @Test
    public void generateErrorConstantsSingleDomainwithDest() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File destDir = new File(rootDir, "tmp");

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-dest",
                destDir.getAbsolutePath(), "-domain", "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorConstantsSingleDomainDest() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File destDir = new File(rootDir, "tmp");

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime", "-dest", destDir.getAbsolutePath(), "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorDataCollectionwithDest() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File destDir = new File(rootDir, "tmp");

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeDataCollection", "-pr", rootDir.getAbsolutePath(),
                "-domain", "TurmericRuntime,Security", "-dest", destDir.getAbsolutePath(), "-errorlibname",
                "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorConstantsMultipleDomain() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime, Security", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorConstantsMultipleDomainwithDest() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File destDir = new File(rootDir, "tmp");

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime, Security", "-dest", destDir.getAbsolutePath(), "-errorlibname",
                "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorDataCollection() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeDataCollection", "-pr", rootDir.getAbsolutePath(),
                "-domain", "TurmericRuntime,Security", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorConstantsAndDataCollectionSingleDomain() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void generateErrorConstantsAndDataCollectionMultipleDomain() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeErrorLibAll", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime,Security", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void genTypeCommandLineAllWithDomains() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeCommandLineAll", "-pr", rootDir.getAbsolutePath(),
                "-domain", "TurmericRuntime,Security", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void genTypeCommandLineAll() throws Exception {
        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeCommandLineAll", "-pr", rootDir.getAbsolutePath(),
                "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);
    }

    @Test
    public void validateGeneratedErrorConstants() throws Exception {
        String errorConstantsClassName = "org.ebayopensource.turmeric.test.errorlibrary.turmericruntime.ErrorConstants";

        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File binDir = new File(rootDir, "bin");
        File gensrcDir = new File(rootDir, "gen-src");

        MavenTestingUtils.ensureDirExists(binDir);
        MavenTestingUtils.ensureDirExists(gensrcDir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);

        Class<?> errConstant = compileGeneratedFile(errorConstantsClassName, gensrcDir, binDir);
        Assert.assertThat("errConstant", errConstant, notNullValue());
        Assert.assertThat(errConstant.getName(), is(errorConstantsClassName));
    }

    @Test
    public void validateGeneratedErrorDataCollections() throws Exception {
        String errorDataCollectionClassName = "org.ebayopensource.turmeric.test.errorlibrary.turmericruntime.ErrorDataCollection";

        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File binDir = new File(rootDir, "bin");
        File gensrcDir = new File(rootDir, "gen-src");

        MavenTestingUtils.ensureDirExists(binDir);
        MavenTestingUtils.ensureDirExists(gensrcDir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeDataCollection", "-pr", rootDir.getAbsolutePath(),
                "-domain", "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);

        Class<?> errDataCollection = compileGeneratedFile(errorDataCollectionClassName, gensrcDir, binDir);
        Assert.assertThat("errDataCollection", errDataCollection, notNullValue());
        Assert.assertThat(errDataCollection.getName(), is(errorDataCollectionClassName));
    }

    @Test
    public void validateContentOfErrorConstants() throws Exception {
        String errorConstantsClassName = "org.ebayopensource.turmeric.test.errorlibrary.turmericruntime.ErrorConstants";
        String sampleErrorName = "svc_factory_custom_ser_no_bound_type";

        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File binDir = new File(rootDir, "bin");
        File gensrcDir = new File(rootDir, "gen-src");

        MavenTestingUtils.ensureDirExists(binDir);
        MavenTestingUtils.ensureDirExists(gensrcDir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeConstants", "-pr", rootDir.getAbsolutePath(), "-domain",
                "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);

        Class<?> errConstant = compileGeneratedFile(errorConstantsClassName, gensrcDir, binDir);
        Assert.assertThat("errConstant", errConstant, notNullValue());
        Assert.assertThat(errConstant.getName(), is(errorConstantsClassName));

        Field member = errConstant.getField(sampleErrorName.toUpperCase());
        Assert.assertThat("member", member, notNullValue());
        Assert.assertThat("member.type", member.getType().getName(), is(String.class.getName()));
        Assert.assertThat("member.isFinal", Modifier.isFinal(member.getModifiers()), is(true));
        Assert.assertThat("member.isPublic", Modifier.isPublic(member.getModifiers()), is(true));
        Assert.assertThat("member.isStatic", Modifier.isStatic(member.getModifiers()), is(true));
        Assert.assertThat("member.get(null)", (String) member.get(null), is(sampleErrorName));
    }

    @Test
    public void validateContentOfErrorDataCollections() throws Exception {
        String errorDataCOllectionClassName = "org.ebayopensource.turmeric.test.errorlibrary.turmericruntime.ErrorDataCollection";
        String sampleErrorName = "svc_factory_custom_ser_no_bound_type";

        // Initialize testing paths
        MavenTestingUtils.ensureEmpty(testingdir);
        File rootDir = TestResourceUtil.copyResourceRootDir("errorLibrary/TestErrorLibrary", testingdir);
        File binDir = new File(rootDir, "bin");
        File gensrcDir = new File(rootDir, "gen-src");

        MavenTestingUtils.ensureDirExists(binDir);
        MavenTestingUtils.ensureDirExists(gensrcDir);

        // @formatter:off
        String pluginParameters[] = { "-gentype", "genTypeDataCollection", "-pr", rootDir.getAbsolutePath(),
                "-domain", "TurmericRuntime", "-errorlibname", "TestErrorLibrary" };
        // @formatter:on

        performDirectCodeGen(pluginParameters);

        Class<?> errDataCollection = compileGeneratedFile(errorDataCOllectionClassName, gensrcDir, binDir);
        Assert.assertThat("errDataCollection", errDataCollection, notNullValue());
        Assert.assertThat(errDataCollection.getName(), is(errorDataCOllectionClassName));

        Field member = errDataCollection.getField(sampleErrorName);
        Assert.assertThat("member", member, notNullValue());

        Assert.assertThat("member.type", member.getType().getName(), is(CommonErrorData.class.getName()));
        Assert.assertThat("member.isFinal", Modifier.isFinal(member.getModifiers()), is(true));
        Assert.assertThat("member.isPublic", Modifier.isPublic(member.getModifiers()), is(true));
        Assert.assertThat("member.isStatic", Modifier.isStatic(member.getModifiers()), is(true));
        CommonErrorData edata = (CommonErrorData) member.get(null);
        Assert.assertThat("CommonErrorData", edata, notNullValue());
        Assert.assertThat("CommonErrorData.category", edata.getCategory(), is(ErrorCategory.SYSTEM));
        Assert.assertThat("CommonErrorData.severity", edata.getSeverity(), is(ErrorSeverity.ERROR));
        Assert.assertThat("CommonErrorData.subdommain", edata.getSubdomain(), is("Config"));
    }

    private Class<?> compileGeneratedFile(String className, File srcDir, File destDir) throws Exception {
        addToClasspath(srcDir, destDir);
        String javaSrcFilePath = CodeGenUtil.toJavaSrcFilePath(srcDir.getAbsolutePath(), className);
        JavacHelper javacHelper = new JavacHelper(System.out);
        javacHelper.compileJavaSource(javaSrcFilePath, srcDir.getAbsolutePath(), destDir.getAbsolutePath());
        return Class.forName(className);
    }

    private void addToClasspath(File source, File dest) throws Exception {
        String javaHomeStr = System.getProperty("java.home");
        File jreHome = new File(javaHomeStr);
        File toolsJar = new File(jreHome.getParent(), "lib/tools.jar");
        if (SystemUtils.IS_OS_MAC_OSX) {
            toolsJar = new File(jreHome.getParent(), "Classes/classes.jar");
        }
        if (!toolsJar.exists()) {
            if (javaHomeStr.indexOf("jre") > 0 || javaHomeStr.indexOf("JRE") > 0) {
                if (javaHomeStr.endsWith("/")) {
                    javaHomeStr = javaHomeStr + "../";
                } else {
                    javaHomeStr = javaHomeStr + "/../";
                }
                jreHome = new File(javaHomeStr);
                toolsJar = new File(jreHome.getParent(), "lib/tools.jar");
            }

        }

        URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<?> sysclass = URLClassLoader.class;
        Class<?>[] parameters = { URL.class };
        URL u = toolsJar.toURI().toURL();
        Method method = sysclass.getDeclaredMethod("addURL", parameters);
        method.setAccessible(true);
        method.invoke(sysloader, new Object[] { u });
        method.invoke(sysloader, new Object[] { source.toURI().toURL() });
        method.invoke(sysloader, new Object[] { dest.toURI().toURL() });
    }
}