package com.simpligility.maven.plugins.android.phase01generatesources; import com.simpligility.maven.plugins.android.AbstractAndroidMojo; import com.simpligility.maven.plugins.android.phase01generatesources.GenerateSourcesMojo; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.easymock.EasyMock; import org.easymock.IAnswer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import java.io.File; import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * Covers method {@link GenerateSourcesMojo#getPackageCompareMap(Set)} with tests * * @author Oleg Green - olegalex.green@gmail.com */ @RunWith( PowerMockRunner.class ) @PrepareForTest( GenerateSourcesMojo.class ) public class GetPackageCompareMapTest { public static final String PROJECT_ARTIFACT_ID = "main_application"; public static final String PROJECT_PACKAGE_NAME = "com.jayway.maven.application"; public static final String COM_JAYWAY_MAVEN_LIBRARY_PACKAGE = "com.jayway.maven.library"; public static final String COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE = "com.jayway.maven.library2"; public static final String COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE = "com.jayway.maven.library3"; public static final Artifact LIBRARY1_ARTIFACT = createArtifact("library1"); public static final Artifact LIBRARY2_ARTIFACT = createArtifact("library2"); public static final Artifact LIBRARY3_ARTIFACT = createArtifact("library3"); public static final Map<Artifact, String > TEST_DATA_1 = new HashMap<Artifact, String>() { { put( LIBRARY1_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ); put( LIBRARY2_ARTIFACT, PROJECT_PACKAGE_NAME ); put( LIBRARY3_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ); } }; public static final Map<Artifact, String > TEST_DATA_2 = new HashMap<Artifact, String>() { { put( LIBRARY1_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ); put( LIBRARY2_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE ); put( LIBRARY3_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE ); } }; private MavenProject project; private Artifact projectArtifact; private GenerateSourcesMojo mojo; @Before public void setUp() throws Exception { mojo = PowerMock.createPartialMock( GenerateSourcesMojo.class, "extractPackageNameFromAndroidManifest", "extractPackageNameFromAndroidArtifact" ); setUpMainProject(); Whitebox.setInternalState(mojo, "project", project); Method extractPackageNameFromAndroidManifestMethod = Whitebox.getMethod( AbstractAndroidMojo.class, "extractPackageNameFromAndroidManifest", File.class ); PowerMock.expectPrivate( mojo, extractPackageNameFromAndroidManifestMethod, EasyMock.anyObject( File.class ) ).andReturn(PROJECT_PACKAGE_NAME).once(); } @Test(expected = IllegalArgumentException.class) public void testNoDependencies() throws MojoExecutionException { PowerMock.replay( mojo ); mojo.getPackageCompareMap(null); } @Test public void testEmptyDependencies() throws MojoExecutionException { PowerMock.replay( mojo ); Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( new HashSet<Artifact>() ); assertNotNull( map ); assertEquals( 1, map.size() ); assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) ); Set<Artifact> artifactSet = map.get( PROJECT_PACKAGE_NAME ); assertEquals( 1, artifactSet.size() ); assertTrue( artifactSet.contains( projectArtifact ) ); } @Test public void testData1() throws Exception { mockExtractPackageNameFromArtifactMethod( TEST_DATA_1 ); PowerMock.replay( mojo ); Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( TEST_DATA_1.keySet() ); assertNotNull( map ); assertEquals( 2, map.size() ); assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) ); assertTrue( map.containsKey( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ) ); Set<Artifact> artifactSet1 = map.get( PROJECT_PACKAGE_NAME ); assertEquals( 2, artifactSet1.size() ); assertTrue( artifactSet1.contains( LIBRARY2_ARTIFACT ) ); assertTrue( artifactSet1.contains( projectArtifact ) ); Set<Artifact> artifactSet2 = map.get( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ); assertEquals( 2, artifactSet2.size() ); assertTrue( artifactSet2.contains( LIBRARY1_ARTIFACT ) ); assertTrue( artifactSet2.contains( LIBRARY3_ARTIFACT ) ); PowerMock.verify( mojo ); EasyMock.verify( project, projectArtifact ); } @Test public void testData2() throws Exception { mockExtractPackageNameFromArtifactMethod( TEST_DATA_2 ); PowerMock.replay( mojo ); Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( TEST_DATA_2.keySet() ); assertNotNull( map ); assertEquals( 4, map.size() ); assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) ); Set<Artifact> artifactSet1 = map.get( PROJECT_PACKAGE_NAME ); assertEquals( 1, artifactSet1.size() ); assertTrue( artifactSet1.contains( projectArtifact ) ); Set<Artifact> artifactSet2 = map.get( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ); assertEquals( 1, artifactSet2.size() ); assertTrue( artifactSet2.contains( LIBRARY1_ARTIFACT ) ); Set<Artifact> artifactSet3 = map.get( COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE ); assertEquals( 1, artifactSet3.size() ); assertTrue( artifactSet3.contains( LIBRARY2_ARTIFACT ) ); Set<Artifact> artifactSet4 = map.get( COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE ); assertEquals( 1, artifactSet4.size() ); assertTrue( artifactSet4.contains( LIBRARY3_ARTIFACT ) ); PowerMock.verify( mojo ); EasyMock.verify( project, projectArtifact ); } private void setUpMainProject() { projectArtifact = EasyMock.createMock( Artifact.class ); EasyMock.expect( projectArtifact.getArtifactId() ).andReturn( PROJECT_ARTIFACT_ID ).anyTimes(); EasyMock.replay( projectArtifact ); project = EasyMock.createNiceMock( MavenProject.class ); EasyMock.expect( project.getArtifact() ).andReturn( projectArtifact ); EasyMock.replay( project ); } private void mockExtractPackageNameFromArtifactMethod( final Map<Artifact, String> testData ) throws Exception { Method extractPackageNameFromAndroidArtifact = Whitebox.getMethod( AbstractAndroidMojo.class, "extractPackageNameFromAndroidArtifact", Artifact.class ); PowerMock.expectPrivate( mojo, extractPackageNameFromAndroidArtifact, EasyMock.anyObject( Artifact.class ) ).andAnswer(new IAnswer<String>() { @Override public String answer() throws Throwable { final Object[] args = EasyMock.getCurrentArguments(); final Artifact inputArtifact = (Artifact)args[0]; return testData.get(inputArtifact); } }).anyTimes(); } private static Artifact createArtifact( String artifactId ) { Artifact artifactMock = EasyMock.createMock( Artifact.class ); EasyMock.expect( artifactMock.getArtifactId() ).andReturn( artifactId ).anyTimes(); EasyMock.replay( artifactMock ); return artifactMock; } }