From fad6f679b8f0971d660adab3d99d7f9c8cd42aac Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 19 Feb 2010 14:25:44 -0500 Subject: Modifications to support unit testing for native projects --- .../maven/plugin/nar/AbstractDownloadMojo.java | 60 ++++++++++++++++++++++ .../apache/maven/plugin/nar/AbstractNarMojo.java | 31 ++++++++++- .../maven/plugin/nar/AbstractUnpackMojo.java | 51 ++++++++++++++++++ .../apache/maven/plugin/nar/NarDownloadMojo.java | 27 +--------- .../maven/plugin/nar/NarTestCompileMojo.java | 32 ++++++++---- .../maven/plugin/nar/NarTestDownloadMojo.java | 59 +++++++++++++++++++++ .../org/apache/maven/plugin/nar/NarTestMojo.java | 26 ++++------ .../apache/maven/plugin/nar/NarTestUnpackMojo.java | 60 ++++++++++++++++++++++ .../org/apache/maven/plugin/nar/NarUnpackMojo.java | 27 +--------- src/main/resources/META-INF/plexus/components.xml | 4 +- 10 files changed, 297 insertions(+), 80 deletions(-) create mode 100644 src/main/java/org/apache/maven/plugin/nar/AbstractDownloadMojo.java create mode 100644 src/main/java/org/apache/maven/plugin/nar/AbstractUnpackMojo.java create mode 100644 src/main/java/org/apache/maven/plugin/nar/NarTestDownloadMojo.java create mode 100644 src/main/java/org/apache/maven/plugin/nar/NarTestUnpackMojo.java diff --git a/src/main/java/org/apache/maven/plugin/nar/AbstractDownloadMojo.java b/src/main/java/org/apache/maven/plugin/nar/AbstractDownloadMojo.java new file mode 100644 index 0000000..5315939 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/nar/AbstractDownloadMojo.java @@ -0,0 +1,60 @@ +package org.apache.maven.plugin.nar; + +/* + * 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 java.util.Iterator; +import java.util.List; + +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; + +/** + * Downloads any dependent NAR files. This includes the noarch and aol type NAR files. + */ +public abstract class AbstractDownloadMojo + extends AbstractDependencyMojo +{ + + /** + * Artifact resolver, needed to download the attached nar files. + * + * @component role="org.apache.maven.artifact.resolver.ArtifactResolver" + * @required + * @readonly + */ + protected ArtifactResolver artifactResolver; + + /** + * Remote repositories which will be searched for nar attachments. + * + * @parameter expression="${project.remoteArtifactRepositories}" + * @required + * @readonly + */ + protected List remoteArtifactRepositories; + + /** + * List of classifiers which you want download. Example ppc-MacOSX-g++, x86-Windows-msvc, i386-Linux-g++. + * + * @parameter expression="" + */ + protected List classifiers; +} diff --git a/src/main/java/org/apache/maven/plugin/nar/AbstractNarMojo.java b/src/main/java/org/apache/maven/plugin/nar/AbstractNarMojo.java index eb71a9f..f2e7da4 100644 --- a/src/main/java/org/apache/maven/plugin/nar/AbstractNarMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/AbstractNarMojo.java @@ -95,12 +95,18 @@ public abstract class AbstractNarMojo /** * Target directory for Nar file construction. Defaults to "${project.build.directory}/nar" for "nar-compile" goal - * Defaults to "${project.build.directory}/test-nar" for "nar-testCompile" goal * * @parameter expression="" */ private File targetDirectory; + /** + * Target directory for Nar test construction. Defaults to "${project.build.directory}/test-nar" for "nar-testCompile" goal + * + * @parameter expression="" + */ + private File testTargetDirectory; + /** * Target directory for Nar file unpacking. Defaults to "${targetDirectory}" * @@ -108,6 +114,13 @@ public abstract class AbstractNarMojo */ private File unpackDirectory; + /** + * Target directory for Nar test unpacking. Defaults to "${testTargetDirectory}" + * + * @parameter expression="" + */ + private File testUnpackDirectory; + /** * Layout to be used for building and unpacking artifacts * @@ -149,11 +162,19 @@ public abstract class AbstractNarMojo { targetDirectory = new File( mavenProject.getBuild().getDirectory(), "nar" ); } + if ( testTargetDirectory == null ) + { + testTargetDirectory = new File( mavenProject.getBuild().getDirectory(), "test-nar" ); + } if ( unpackDirectory == null ) { unpackDirectory = targetDirectory; } + if ( testUnpackDirectory == null ) + { + testUnpackDirectory = testTargetDirectory; + } } protected final String getArchitecture() @@ -191,11 +212,19 @@ public abstract class AbstractNarMojo { return targetDirectory; } + protected final File getTestTargetDirectory() + { + return testTargetDirectory; + } protected final File getUnpackDirectory() { return unpackDirectory; } + protected final File getTestUnpackDirectory() + { + return testUnpackDirectory; + } protected final NarLayout getLayout() throws MojoExecutionException diff --git a/src/main/java/org/apache/maven/plugin/nar/AbstractUnpackMojo.java b/src/main/java/org/apache/maven/plugin/nar/AbstractUnpackMojo.java new file mode 100644 index 0000000..9a201ed --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/nar/AbstractUnpackMojo.java @@ -0,0 +1,51 @@ +package org.apache.maven.plugin.nar; + +/* + * 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 java.util.Iterator; +import java.util.List; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.codehaus.plexus.archiver.manager.ArchiverManager; + +/** + * Unpacks NAR files. Unpacking happens in the local repository, and also sets flags on binaries and corrects static + * libraries. + */ +public abstract class AbstractUnpackMojo + extends AbstractCompileMojo +{ + + /** + * List of classifiers which you want unpack. Example ppc-MacOSX-g++, x86-Windows-msvc, i386-Linux-g++. + * + * @parameter expression="" + */ + protected List classifiers; + + /** + * To look up Archiver/UnArchiver implementations + * + * @component role="org.codehaus.plexus.archiver.manager.ArchiverManager" + * @required + */ + protected ArchiverManager archiverManager; +} diff --git a/src/main/java/org/apache/maven/plugin/nar/NarDownloadMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarDownloadMojo.java index fa83de7..8992665 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarDownloadMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarDownloadMojo.java @@ -36,34 +36,9 @@ import org.apache.maven.plugin.MojoFailureException; * @author Mark Donszelmann */ public class NarDownloadMojo - extends AbstractDependencyMojo + extends AbstractDownloadMojo { - /** - * Artifact resolver, needed to download the attached nar files. - * - * @component role="org.apache.maven.artifact.resolver.ArtifactResolver" - * @required - * @readonly - */ - private ArtifactResolver artifactResolver; - - /** - * Remote repositories which will be searched for nar attachments. - * - * @parameter expression="${project.remoteArtifactRepositories}" - * @required - * @readonly - */ - private List remoteArtifactRepositories; - - /** - * List of classifiers which you want download. Example ppc-MacOSX-g++, x86-Windows-msvc, i386-Linux-g++. - * - * @parameter expression="" - */ - private List classifiers; - public final void narExecute() throws MojoExecutionException, MojoFailureException { diff --git a/src/main/java/org/apache/maven/plugin/nar/NarTestCompileMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarTestCompileMojo.java index 266adfc..259484b 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarTestCompileMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarTestCompileMojo.java @@ -144,10 +144,18 @@ public class NarTestCompileMojo for ( Iterator i = getNarManager().getNarDependencies( "test" ).iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); - File include = + + // check if it exists in the normal unpack directory + File include = getLayout().getIncludeDirectory( getUnpackDirectory(), artifact.getArtifactId(), artifact.getVersion() ); - if ( include.exists() ) + if ( !include.exists() ) { + // otherwise try the test unpack directory + include = + getLayout().getIncludeDirectory( getTestUnpackDirectory(), artifact.getArtifactId(), artifact.getVersion() ); + } + if ( include.exists() ) + { task.createIncludePath().setPath( include.getPath() ); } } @@ -248,13 +256,20 @@ public class NarTestCompileMojo if ( !binding.equals( Library.JNI ) && !binding.equals( Library.NONE ) ) { - File unpackDirectory = getUnpackDirectory(); - + // check if it exists in the normal unpack directory File dir = - getLayout().getLibDirectory( unpackDirectory, dependency.getArtifactId(), + getLayout().getLibDirectory( getUnpackDirectory(), dependency.getArtifactId(), dependency.getVersion(), aol.toString(), binding ); - getLog().debug( "Looking for Library Directory: " + dir ); + if ( !dir.exists() ) + { + getLog().debug( "Library Directory " + dir + " does NOT exist." ); + + // otherwise try the test unpack directory + dir = getLayout().getLibDirectory( getTestUnpackDirectory(), dependency.getArtifactId(), + dependency.getVersion(), aol.toString(), binding ); + getLog().debug( "Looking for Library Directory: " + dir ); + } if ( dir.exists() ) { LibrarySet libSet = new LibrarySet(); @@ -312,9 +327,4 @@ public class NarTestCompileMojo } } - protected final File getTestTargetDirectory() - { - return new File( getMavenProject().getBuild().getDirectory(), "test-nar" ); - } - } diff --git a/src/main/java/org/apache/maven/plugin/nar/NarTestDownloadMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarTestDownloadMojo.java new file mode 100644 index 0000000..988bc88 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/nar/NarTestDownloadMojo.java @@ -0,0 +1,59 @@ +package org.apache.maven.plugin.nar; + +/* + * 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 java.util.Iterator; +import java.util.List; + +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; + +/** + * Downloads any dependent NAR files. This includes the noarch and aol type NAR files. + * + * @goal nar-testDownload + * @phase generate-test-sources + * @requiresProject + * @requiresDependencyResolution test + * @author Mark Donszelmann + */ +public class NarTestDownloadMojo + extends AbstractDownloadMojo +{ + + public final void narExecute() + throws MojoExecutionException, MojoFailureException + { + List narArtifacts = getNarManager().getNarDependencies( "test" ); + if ( classifiers == null ) + { + getNarManager().downloadAttachedNars( narArtifacts, remoteArtifactRepositories, artifactResolver, null ); + } + else + { + for ( Iterator j = classifiers.iterator(); j.hasNext(); ) + { + getNarManager().downloadAttachedNars( narArtifacts, remoteArtifactRepositories, artifactResolver, + (String) j.next() ); + } + } + } +} diff --git a/src/main/java/org/apache/maven/plugin/nar/NarTestMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarTestMojo.java index bf5fc1b..e2cca51 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarTestMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarTestMojo.java @@ -74,22 +74,23 @@ public class NarTestMojo if ( test.shouldRun() ) { // NOTE should we use layout here ? - String extension = getOS().equals( OS.WINDOWS ) ? ".exe" : ""; - String name = - getTestTargetDirectory().getPath() + File.separator + "bin" + File.separator + getAOL() - + File.separator + test.getName() + extension; - if ( !new File( name ).exists() ) + String name = test.getName() + (getOS().equals( OS.WINDOWS ) ? ".exe" : ""); + File path = new File( getTestTargetDirectory(), "bin" ); + path = new File( path, getAOL().toString() ); + path = new File( path, name ); + if ( !path.exists() ) { - getLog().warn( "Skipping non-existing test " + name ); + getLog().warn( "Skipping non-existing test " + path ); return; } - getLog().info( "Running test " + name ); + + File workingDir = new File( getTestTargetDirectory(), "test-reports" ); + workingDir.mkdirs(); + getLog().info( "Running test " + name + " in " + workingDir ); - File workingDir = getMavenProject().getBasedir(); - getLog().info( " in " + workingDir ); List args = test.getArgs(); int result = - NarUtil.runCommand( name, (String[]) args.toArray( new String[args.size()] ), workingDir, + NarUtil.runCommand( path.toString(), (String[]) args.toArray( new String[args.size()] ), workingDir, generateEnvironment(), getLog() ); if ( result != 0 ) { @@ -129,11 +130,6 @@ public class NarTestMojo } } - protected final File getTestTargetDirectory() - { - return new File( getMavenProject().getBuild().getDirectory(), "test-nar" ); - } - private String[] generateEnvironment() throws MojoExecutionException, MojoFailureException { diff --git a/src/main/java/org/apache/maven/plugin/nar/NarTestUnpackMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarTestUnpackMojo.java new file mode 100644 index 0000000..b74ece1 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/nar/NarTestUnpackMojo.java @@ -0,0 +1,60 @@ +package org.apache.maven.plugin.nar; + +/* + * 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 java.util.Iterator; +import java.util.List; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.codehaus.plexus.archiver.manager.ArchiverManager; + +/** + * Unpacks NAR files. Unpacking happens in the local repository, and also sets flags on binaries and corrects static + * libraries. + * + * @goal nar-testUnpack + * @phase process-test-sources + * @requiresProject + * @requiresDependencyResolution test + * @author Mark Donszelmann + */ +public class NarTestUnpackMojo + extends AbstractUnpackMojo +{ + + public final void narExecute() + throws MojoExecutionException, MojoFailureException + { + NarManager mgr = getNarManager(); + List narArtifacts = mgr.getNarDependencies( "test" ); + if ( classifiers == null ) + { + mgr.unpackAttachedNars( narArtifacts, archiverManager, null, getOS(), getLayout(), getTestUnpackDirectory() ); + } + else + { + for ( Iterator j = classifiers.iterator(); j.hasNext(); ) + { + mgr.unpackAttachedNars( narArtifacts, archiverManager, (String) j.next(), getOS(), getLayout(), getTestUnpackDirectory() ); + } + } + } +} diff --git a/src/main/java/org/apache/maven/plugin/nar/NarUnpackMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarUnpackMojo.java index f94b49f..b3e2be7 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarUnpackMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarUnpackMojo.java @@ -33,40 +33,17 @@ import org.codehaus.plexus.archiver.manager.ArchiverManager; * @goal nar-unpack * @phase process-sources * @requiresProject - * @requiresDependencyResolution test + * @requiresDependencyResolution * @author Mark Donszelmann */ public class NarUnpackMojo - extends AbstractCompileMojo + extends AbstractUnpackMojo { - /** - * List of classifiers which you want unpack. Example ppc-MacOSX-g++, x86-Windows-msvc, i386-Linux-g++. - * - * @parameter expression="" - */ - private List classifiers; - - /** - * To look up Archiver/UnArchiver implementations - * - * @component role="org.codehaus.plexus.archiver.manager.ArchiverManager" - * @required - */ - private ArchiverManager archiverManager; - public final void narExecute() throws MojoExecutionException, MojoFailureException { List narArtifacts = getNarManager().getNarDependencies( "compile" ); - unpackNars(narArtifacts); - List testNarArtifacts = getNarManager().getNarDependencies( "test" ); - unpackNars(testNarArtifacts); - } - - private void unpackNars(List narArtifacts) - throws MojoExecutionException, MojoFailureException - { if ( classifiers == null ) { getNarManager().unpackAttachedNars( narArtifacts, archiverManager, null, getOS(), getLayout(), getUnpackDirectory() ); diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml index 80850e4..6030fbe 100644 --- a/src/main/resources/META-INF/plexus/components.xml +++ b/src/main/resources/META-INF/plexus/components.xml @@ -45,8 +45,8 @@ org.apache.maven.plugins:maven-nar-plugin:nar-gnu-process - - + org.apache.maven.plugins:maven-nar-plugin:nar-testDownload + org.apache.maven.plugins:maven-nar-plugin:nar-testUnpack org.apache.maven.plugins:maven-resources-plugin:testResources -- cgit v1.2.3