Package org.codehaus.dna.tools.verifier

Source Code of org.codehaus.dna.tools.verifier.ComponentVerifierTestCase

/*
* Copyright (C) The Spice Group. All rights reserved.
*
* This software is published under the terms of the Spice
* Software License version 1.1, a copy of which has been included
* with this distribution in the LICENSE.txt file.
*/
package org.codehaus.dna.tools.verifier;

import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Arrays;
import java.awt.event.ActionListener;

import org.codehaus.dna.Configurable;
import org.codehaus.dna.Configuration;
import org.codehaus.dna.tools.verifier.ComponentVerifier;
import org.codehaus.dna.tools.verifier.VerifyIssue;
import org.codehaus.metaclass.introspector.MetaClassIntrospector;
import org.codehaus.metaclass.model.Attribute;
import org.codehaus.metaclass.model.ClassDescriptor;
import org.codehaus.metaclass.model.FieldDescriptor;
import org.codehaus.metaclass.model.MethodDescriptor;
import org.codehaus.metaclass.model.ParameterDescriptor;
import org.codehaus.metaclass.Attributes;

/**
*
* @author Peter Donald
* @version $Revision: 1.1 $ $Date: 2004/04/18 20:13:44 $
*/
public class ComponentVerifierTestCase
    extends TestCase
{
    public void testVerifyNonArrayWithNonArray()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonArray( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyNonArrayWithArray()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonArray( Object[].class, issues );
        assertSingleIssue( issues, "The class is an array.", true, false );
    }

    public void testVerifyNonInterfaceWithNonInterface()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonInterface( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyNonInterfaceWithInterface()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonInterface( ActionListener.class, issues );
        assertSingleIssue( issues, "The class is an interface.", true, false );
    }

    public void testVerifyNonPrimitiveWithNonInterface()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonPrimitive( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyNonPrimitiveWithPrimitive()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonPrimitive( Integer.TYPE, issues );
        assertSingleIssue( issues, "The class represents a primitive type.", true, false );
    }

    public void testVerifyPublicThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyPublic( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyPublicThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyPublic( AbstractNonPublicClassWithNonPublicCtor.class, issues );
        assertSingleIssue( issues, "The class is not public.", true, false );
    }

    public void testVerifyNonAbstractThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonAbstract( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyNonAbstractThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNonAbstract( AbstractNonPublicClassWithNonPublicCtor.class, issues );
        assertSingleIssue( issues, "The class is abstract.", true, false );
    }

    public void testVerifyNoArgConstructorThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNoArgConstructor( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyNoArgConstructorThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyNoArgConstructor( AbstractNonPublicClassWithNonPublicCtor.class, issues );
        assertSingleIssue( issues, "The class does not have a public default constructor.", true, false );
    }

    public void testVerifyServiceNotALifecycleThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceNotALifecycle( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyServiceNotALifecycleThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceNotALifecycle( LifecycleExtendingService.class, issues );
        assertSingleIssue( issues, "Service " + LifecycleExtendingService.class.getName() +
                                   " extends lifecycle interface " +
                                   Configurable.class.getName() + ".", true, false );
    }

    public void testVerifyServiceIsPublicThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceIsPublic( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyServiceIsPublicThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceIsPublic( LifecycleExtendingService.class, issues );
        assertSingleIssue( issues, "Service " + LifecycleExtendingService.class.getName() +
                                   " must be public.", true, false );
    }

    public void testVerifyServiceIsaInterfaceThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceIsaInterface( ActionListener.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyServiceIsaInterfaceThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyServiceIsaInterface( Object.class, issues );
        assertSingleIssue( issues, "Service " + Object.class.getName() +
                                   " must be an interface.", true, false );
    }

    public void testVerifyClass()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyClass( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyService()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyService( ActionListener.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyImplementsServicesThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        final Class[] services = new Class[]{ActionListener.class};
        verifier.verifyImplementsServices( ActionListenerComponent.class, services, issues );
        assertNoIssues( issues );
    }

    public void testVerifyImplementsServicesThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        final Class[] services = new Class[]{ActionListener.class};
        verifier.verifyImplementsServices( Object.class, services, issues );
        assertSingleIssue( issues, "The metadata declares that the class " +
                                   "supports the service " +
                                   ActionListener.class.getName() +
                                   " but the class does not implement the " +
                                   "service interface.", true, false );
    }

    public void testVerifyMetaDataThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        MetaClassIntrospector.setAccessor( new SimpleAccessor() );
        MetaClassIntrospector.clearCompleteCache();
        final List issues = new ArrayList();
        verifier.verifyMetaData( ComponentVerifierTestCase.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyMetaDataThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new NullAccessor() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyMetaData( Object.class, issues );
        assertSingleIssue( issues,
                           "The class does not specify correct " +
                           "metadata. Missing expected dna.component " +
                           "attribute in the class attributes.",
                           true, false );
    }

    public void testGetServiceClasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        MetaClassIntrospector.setAccessor( new BadServiceAccessor() );
        MetaClassIntrospector.clearCompleteCache();
        final List issues = new ArrayList();
        verifier.getServiceClasses( ComponentVerifier.class, issues );
        assertSingleIssue( issues,
                           "Unable to load service interface " +
                           BadServiceAccessor.BAD_SERVICE +
                           " for class. Reason: " +
                           "java.lang.ClassNotFoundException: I-No-Exist!.",
                           true, false );
    }

    public void testVerifyType()
        throws Exception
    {
        final Properties parameters = new Properties();
        parameters.setProperty( "type", ActionListener.class.getName() );
        final Attribute[] attributes = new Attribute[]
        {
            new Attribute( "dna.component" ),
            new Attribute( "dna.service", parameters )
        };
        final ClassDescriptor descriptor =
            new ClassDescriptor( BasicComponent.class.getName(),
                                 attributes,
                                 attributes,
                                 FieldDescriptor.EMPTY_SET,
                                 MethodDescriptor.EMPTY_SET );
        final ComponentVerifier verifier = new ComponentVerifier();
        final RegistrationMetaClassAccessor accessor = new RegistrationMetaClassAccessor();
        accessor.registerDescriptor( descriptor );
        MetaClassIntrospector.setAccessor( accessor );
        MetaClassIntrospector.clearCompleteCache();
        final VerifyIssue[] issues = verifier.verifyType( BasicComponent.class );
        assertEquals( "issues.length", 0, issues.length );
    }

    public void testVerifyDependencyOptionalValidThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyOptionalValid( "true", issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyOptionalValidThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyOptionalValid( "blah", issues );
        assertSingleIssue( issues,
                           "The dna.dependency attribute specifies " +
                           "optional parameter as \"blah\" that is not one " +
                           "of true or false.",
                           true, false );
    }

    public void testVerifyDependencyKeyConformsThatPassesWithQualifier()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyKeyConforms( "X", "X/X", issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyKeyConformsThatPassesWithoutQualifier()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyKeyConforms( "X", "X", issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyKeyConformsThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyKeyConforms( "X", "blah", issues );
        assertSingleIssue( issues,
                           "The dna.dependency attribute specifies the key " +
                           "blah which does not conform to recomendation of " +
                           "(type)[/(qualifier)].",
                           false, false );
    }

    public void testVerifyDependencyTypeThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyType( LifecycleExtendingService.class,
                                       ActionListener.class.getName(),
                                       issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyTypeThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyType( LifecycleExtendingService.class,
                                       "INoExist!",
                                       issues );
        assertSingleIssue( issues,
                           "Unable to load dependency with type INoExist! " +
                           "for class. Reason: " +
                           "java.lang.ClassNotFoundException: INoExist!.",
                           true, false );
    }

    public void testVerifyOptionalParameterThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyOptionalParameter( "true", issues );
        assertNoIssues( issues );
    }

    public void testVerifyOptionalParameterThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyOptionalParameter( null, issues );
        assertSingleIssue( issues,
                           "The dna.dependency attribute does not " +
                           "specify the parameter optional.",
                           true, false );
    }

    public void testVerifyDependencyMetaDataThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        final Properties parameters = new Properties();
        parameters.setProperty( "optional", "false" );
        parameters.setProperty( "type", ActionListener.class.getName() );
        parameters.setProperty( "key", ActionListener.class.getName() );
        verifier.verifyDependencyMetaData( LifecycleExtendingService.class,
                                           new Attribute( "dna.dependency", parameters ),
                                           issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyMetaDataThatNoPassesDueToMissingType()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        final Properties parameters = new Properties();
        parameters.setProperty( "optional", "false" );
        verifier.verifyDependencyMetaData( LifecycleExtendingService.class,
                                           new Attribute( "dna.dependency", parameters ),
                                           issues );
        assertSingleIssue( issues,
                           "The dna.dependency attribute does not specify the parameter type.",
                           true, false );
    }

    public void testVerifyDependencyMetaDataThatNoPassesDueToMissingKey()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        final Properties parameters = new Properties();
        parameters.setProperty( "optional", "false" );
        parameters.setProperty( "type", ActionListener.class.getName() );
        final Attribute attribute = new Attribute( "dna.dependency", parameters );
        verifier.verifyDependencyMetaData( LifecycleExtendingService.class,
                                           attribute,
                                           issues );
        assertSingleIssue( issues,
                           "The dna.dependency attribute does not specify the parameter key.",
                           true, false );
    }

    public void testVerifyDependencyMetaDataThatPassesDueToNotImplementingComposable()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        verifier.verifyDependencyMetaData( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyMetaDataThatPassesDueToNoMetaData()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new SimpleAccessor() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyDependencyMetaData( BasicComponent.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyDependencyMetaDataThatPassesWithMetaData()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new AccessorWithDependencyMetaData() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyDependencyMetaData( BasicComponent.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyConfigurationMetaDataThatPassesAsNotConfigurable()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new AccessorWithDependencyMetaData() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyConfigurationMetaData( Object.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyConfigurationMetaDataThatPassesAsNoMetaData()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new SimpleAccessor() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyConfigurationMetaData( BasicComponent.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyConfigurationMetaDataThatPassesAsValidMetaData()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();

        final Properties parameters = new Properties();
        parameters.setProperty( "location", "BasicComponent-schema.xml" );
        final Attribute[] attributes = new Attribute[]
        {
            new Attribute( "dna.configuration", parameters )
        };
        final ParameterDescriptor param =
            new ParameterDescriptor( "X", Configuration.class.getName() );
        final ParameterDescriptor[] params = new ParameterDescriptor[]{param};
        final MethodDescriptor method =
            new MethodDescriptor( "configure", "", params, attributes, attributes );
        final ClassDescriptor descriptor =
            new ClassDescriptor( BasicComponent.class.getName(),
                                 Attribute.EMPTY_SET,
                                 Attribute.EMPTY_SET,
                                 FieldDescriptor.EMPTY_SET,
                                 new MethodDescriptor[]{method} );
        final RegistrationMetaClassAccessor accessor = new RegistrationMetaClassAccessor();
        accessor.registerDescriptor( descriptor );
        MetaClassIntrospector.setAccessor( accessor );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyConfigurationMetaData( BasicComponent.class, issues );
        assertNoIssues( issues );
    }

    public void testVerifyConfigurationMetaDataThatNoPassesAsInvalidMetaData()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();

        final Properties parameters = new Properties();
        final Attribute[] attributes = new Attribute[]
        {
            new Attribute( "dna.configuration", parameters )
        };
        final ParameterDescriptor param =
            new ParameterDescriptor( "X", Configuration.class.getName() );
        final ParameterDescriptor[] params = new ParameterDescriptor[]{param};
        final MethodDescriptor method =
            new MethodDescriptor( "configure", "", params, attributes, attributes );
        final ClassDescriptor descriptor =
            new ClassDescriptor( BasicComponent.class.getName(),
                                 Attribute.EMPTY_SET,
                                 Attribute.EMPTY_SET,
                                 FieldDescriptor.EMPTY_SET,
                                 new MethodDescriptor[]{method} );
        final RegistrationMetaClassAccessor accessor = new RegistrationMetaClassAccessor();
        accessor.registerDescriptor( descriptor );
        MetaClassIntrospector.setAccessor( accessor );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyConfigurationMetaData( BasicComponent.class, issues );

        assertSingleIssue( issues,
                           "The dna.configuration attribute is missing the " +
                           "location parameter.",
                           true, false );
    }

    public void testverifyLocationThatPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new AccessorWithDependencyMetaData() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyLocation( BasicComponent.class,
                                 "BasicComponent-schema.xml",
                                 issues );
        assertNoIssues( issues );
    }

    public void testverifyLocationThatNoPasses()
        throws Exception
    {
        final ComponentVerifier verifier = new ComponentVerifier();
        final List issues = new ArrayList();
        MetaClassIntrospector.setAccessor( new AccessorWithDependencyMetaData() );
        MetaClassIntrospector.clearCompleteCache();
        verifier.verifyLocation( BasicComponent.class,
                                 "NoExist",
                                 issues );
        assertSingleIssue( issues,
                           "Unable to load configuration schema from location " +
                           "NoExist.",
                           true, false );
    }

    private void assertNoIssues( final List issues )
    {
        if( 0 != issues.size() )
        {
            final int count = issues.size();
            for( int i = 0; i < count; i++ )
            {
                final VerifyIssue issue = (VerifyIssue)issues.get( i );
                System.out.println(
                    "issue.getDescription() = " + issue.getDescription() );
            }
        }
        assertEquals( "issues.length", 0, issues.size() );
    }

    private void assertSingleIssue( final List issues,
                                    final String message,
                                    final boolean error,
                                    final boolean warning )
    {
        assertEquals( "issues.length", 1, issues.size() );
        final VerifyIssue issue = (VerifyIssue)issues.get( 0 );
        assertEquals( "issues[0].isWarning", warning, issue.isWarning() );
        assertEquals( "issues[0].isError", error, issue.isError() );
        assertEquals( "issues[0].description", message, issue.getDescription() );
    }
}
TOP

Related Classes of org.codehaus.dna.tools.verifier.ComponentVerifierTestCase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.