git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271064 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,215 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.myrmidon; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.Collection; | |||
| import java.util.Iterator; | |||
| import jdepend.framework.JDepend; | |||
| import jdepend.framework.JavaPackage; | |||
| import junit.framework.TestCase; | |||
| /** | |||
| * An abstract Unit test that can be used to test Dependency metrics | |||
| * fall in acceptable limits. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class DependencyMetricsTest | |||
| extends TestCase | |||
| { | |||
| private JDepend m_jDepend; | |||
| public DependencyMetricsTest( final String name ) | |||
| { | |||
| super( name ); | |||
| } | |||
| /** | |||
| * Sets up the test fixture. | |||
| * | |||
| * Called before every test case method. | |||
| */ | |||
| protected void setUp() | |||
| { | |||
| m_jDepend = new JDepend(); | |||
| try | |||
| { | |||
| m_jDepend.addDirectory( "src/java" ); | |||
| //m_jDepend.addDirectory( "src/main" ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| fail( ioe.getMessage() ); | |||
| } | |||
| m_jDepend.analyze(); | |||
| } | |||
| /** | |||
| * Tears down the test fixture. | |||
| * | |||
| * Called after every test case method. | |||
| */ | |||
| protected void tearDown() | |||
| { | |||
| m_jDepend = null; | |||
| } | |||
| /** | |||
| * Utility method to retrieve JDpenden instance that contains statistics. | |||
| */ | |||
| protected final JDepend getJDepend() | |||
| { | |||
| return m_jDepend; | |||
| } | |||
| /** | |||
| * Make sure that the launcher classes in org.apache.myrmidon.launcher.* | |||
| * are completely decoupled from the rest of the system. | |||
| */ | |||
| public void testLauncherDecoupled() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final String name = "org.apache.myrmidon.launcher"; | |||
| final JavaPackage javaPackage = jDepend.getPackage( name ); | |||
| final Collection afferentSet = javaPackage.getAfferents(); | |||
| final Iterator afferents = afferentSet.iterator(); | |||
| while( afferents.hasNext() ) | |||
| { | |||
| final JavaPackage afferent = (JavaPackage)afferents.next(); | |||
| final String afferentName = afferent.getName(); | |||
| if( !afferentName.startsWith( name ) ) | |||
| { | |||
| fail( "The launcher package " + name + " depends on external classes " + | |||
| "contained in " + afferentName + ". No classes besides " + | |||
| "those in the launcher hierarchy should be referenced" ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure that the implementations of the myrmidon kernel components | |||
| * (ie org.apache.myrmidon.component.X.*) are not referenced by anyone | |||
| * except by other objects in the same package or child packages. | |||
| */ | |||
| public void testNoComponentImplSharing() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| final String name = javaPackage.getName(); | |||
| final String componentPackage = "org.apache.myrmidon.component."; | |||
| if( !name.startsWith( componentPackage ) ) | |||
| { | |||
| continue; | |||
| } | |||
| final int start = componentPackage.length() + 1; | |||
| final int end = name.indexOf( '.', start ); | |||
| final String component = name.substring( end ); | |||
| final Collection afferentSet = javaPackage.getAfferents(); | |||
| final Iterator afferents = afferentSet.iterator(); | |||
| while( afferents.hasNext() ) | |||
| { | |||
| final JavaPackage efferent = (JavaPackage)afferents.next(); | |||
| final String efferentName = efferent.getName(); | |||
| if( !efferentName.startsWith( component ) ) | |||
| { | |||
| fail( "The package " + name + " is referred to by classes " + | |||
| "contained in " + efferentName + ". No classes besides " + | |||
| "those part of the particular implementation of kernel " + | |||
| "component should reference the implementations" ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure that aut does not depend on any other ant classes | |||
| * and thus can be cleanly decoupled. | |||
| */ | |||
| public void testAutDecoupled() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| final String name = javaPackage.getName(); | |||
| if( !name.startsWith( "org.apache.aut" ) ) | |||
| { | |||
| continue; | |||
| } | |||
| final Collection efferentSet = javaPackage.getEfferents(); | |||
| final Iterator efferents = efferentSet.iterator(); | |||
| while( efferents.hasNext() ) | |||
| { | |||
| final JavaPackage efferent = (JavaPackage)efferents.next(); | |||
| final String efferentName = efferent.getName(); | |||
| if( efferentName.startsWith( "org.apache.myrmidon" ) || | |||
| efferentName.startsWith( "org.apache.antlib" ) || | |||
| efferentName.startsWith( "org.apache.tools.ant" ) ) | |||
| { | |||
| fail( "The package " + name + " depends on classes " + | |||
| "contained in " + efferentName ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure there are no circular dependencies between packages because | |||
| * circular dependencies are evil!!! | |||
| */ | |||
| public void testNoCircularity() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| if( javaPackage.containsCycle() ) | |||
| { | |||
| final ArrayList cycle = new ArrayList(); | |||
| javaPackage.collectCycle( cycle ); | |||
| final ArrayList names = getPackageNames( cycle ); | |||
| fail( "The package " + javaPackage.getName() + " contains a cycle " + | |||
| "with a path " + names ); | |||
| } | |||
| } | |||
| } | |||
| private ArrayList getPackageNames( final ArrayList cycle ) | |||
| { | |||
| final ArrayList names = new ArrayList(); | |||
| final int size = cycle.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)cycle.get( i ); | |||
| names.add( javaPackage.getName() ); | |||
| } | |||
| return names; | |||
| } | |||
| } | |||
| @@ -0,0 +1,215 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.myrmidon; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.Collection; | |||
| import java.util.Iterator; | |||
| import jdepend.framework.JDepend; | |||
| import jdepend.framework.JavaPackage; | |||
| import junit.framework.TestCase; | |||
| /** | |||
| * An abstract Unit test that can be used to test Dependency metrics | |||
| * fall in acceptable limits. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class DependencyMetricsTest | |||
| extends TestCase | |||
| { | |||
| private JDepend m_jDepend; | |||
| public DependencyMetricsTest( final String name ) | |||
| { | |||
| super( name ); | |||
| } | |||
| /** | |||
| * Sets up the test fixture. | |||
| * | |||
| * Called before every test case method. | |||
| */ | |||
| protected void setUp() | |||
| { | |||
| m_jDepend = new JDepend(); | |||
| try | |||
| { | |||
| m_jDepend.addDirectory( "src/java" ); | |||
| //m_jDepend.addDirectory( "src/main" ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| fail( ioe.getMessage() ); | |||
| } | |||
| m_jDepend.analyze(); | |||
| } | |||
| /** | |||
| * Tears down the test fixture. | |||
| * | |||
| * Called after every test case method. | |||
| */ | |||
| protected void tearDown() | |||
| { | |||
| m_jDepend = null; | |||
| } | |||
| /** | |||
| * Utility method to retrieve JDpenden instance that contains statistics. | |||
| */ | |||
| protected final JDepend getJDepend() | |||
| { | |||
| return m_jDepend; | |||
| } | |||
| /** | |||
| * Make sure that the launcher classes in org.apache.myrmidon.launcher.* | |||
| * are completely decoupled from the rest of the system. | |||
| */ | |||
| public void testLauncherDecoupled() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final String name = "org.apache.myrmidon.launcher"; | |||
| final JavaPackage javaPackage = jDepend.getPackage( name ); | |||
| final Collection afferentSet = javaPackage.getAfferents(); | |||
| final Iterator afferents = afferentSet.iterator(); | |||
| while( afferents.hasNext() ) | |||
| { | |||
| final JavaPackage afferent = (JavaPackage)afferents.next(); | |||
| final String afferentName = afferent.getName(); | |||
| if( !afferentName.startsWith( name ) ) | |||
| { | |||
| fail( "The launcher package " + name + " depends on external classes " + | |||
| "contained in " + afferentName + ". No classes besides " + | |||
| "those in the launcher hierarchy should be referenced" ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure that the implementations of the myrmidon kernel components | |||
| * (ie org.apache.myrmidon.component.X.*) are not referenced by anyone | |||
| * except by other objects in the same package or child packages. | |||
| */ | |||
| public void testNoComponentImplSharing() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| final String name = javaPackage.getName(); | |||
| final String componentPackage = "org.apache.myrmidon.component."; | |||
| if( !name.startsWith( componentPackage ) ) | |||
| { | |||
| continue; | |||
| } | |||
| final int start = componentPackage.length() + 1; | |||
| final int end = name.indexOf( '.', start ); | |||
| final String component = name.substring( end ); | |||
| final Collection afferentSet = javaPackage.getAfferents(); | |||
| final Iterator afferents = afferentSet.iterator(); | |||
| while( afferents.hasNext() ) | |||
| { | |||
| final JavaPackage efferent = (JavaPackage)afferents.next(); | |||
| final String efferentName = efferent.getName(); | |||
| if( !efferentName.startsWith( component ) ) | |||
| { | |||
| fail( "The package " + name + " is referred to by classes " + | |||
| "contained in " + efferentName + ". No classes besides " + | |||
| "those part of the particular implementation of kernel " + | |||
| "component should reference the implementations" ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure that aut does not depend on any other ant classes | |||
| * and thus can be cleanly decoupled. | |||
| */ | |||
| public void testAutDecoupled() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| final String name = javaPackage.getName(); | |||
| if( !name.startsWith( "org.apache.aut" ) ) | |||
| { | |||
| continue; | |||
| } | |||
| final Collection efferentSet = javaPackage.getEfferents(); | |||
| final Iterator efferents = efferentSet.iterator(); | |||
| while( efferents.hasNext() ) | |||
| { | |||
| final JavaPackage efferent = (JavaPackage)efferents.next(); | |||
| final String efferentName = efferent.getName(); | |||
| if( efferentName.startsWith( "org.apache.myrmidon" ) || | |||
| efferentName.startsWith( "org.apache.antlib" ) || | |||
| efferentName.startsWith( "org.apache.tools.ant" ) ) | |||
| { | |||
| fail( "The package " + name + " depends on classes " + | |||
| "contained in " + efferentName ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Make sure there are no circular dependencies between packages because | |||
| * circular dependencies are evil!!! | |||
| */ | |||
| public void testNoCircularity() | |||
| { | |||
| final JDepend jDepend = getJDepend(); | |||
| final Collection packageSet = jDepend.getPackages(); | |||
| final Iterator packages = packageSet.iterator(); | |||
| while( packages.hasNext() ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)packages.next(); | |||
| if( javaPackage.containsCycle() ) | |||
| { | |||
| final ArrayList cycle = new ArrayList(); | |||
| javaPackage.collectCycle( cycle ); | |||
| final ArrayList names = getPackageNames( cycle ); | |||
| fail( "The package " + javaPackage.getName() + " contains a cycle " + | |||
| "with a path " + names ); | |||
| } | |||
| } | |||
| } | |||
| private ArrayList getPackageNames( final ArrayList cycle ) | |||
| { | |||
| final ArrayList names = new ArrayList(); | |||
| final int size = cycle.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final JavaPackage javaPackage = (JavaPackage)cycle.get( i ); | |||
| names.add( javaPackage.getName() ); | |||
| } | |||
| return names; | |||
| } | |||
| } | |||