View Javadoc
1   package com.simpligility.maven.plugins.android.phase01generatesources;
2   
3   import com.simpligility.maven.plugins.android.AbstractAndroidMojo;
4   import com.simpligility.maven.plugins.android.phase01generatesources.GenerateSourcesMojo;
5   
6   import org.apache.maven.artifact.Artifact;
7   import org.apache.maven.plugin.MojoExecutionException;
8   import org.apache.maven.project.MavenProject;
9   import org.easymock.EasyMock;
10  import org.easymock.IAnswer;
11  import org.junit.Before;
12  import org.junit.Test;
13  import org.junit.runner.RunWith;
14  import org.powermock.api.easymock.PowerMock;
15  import org.powermock.core.classloader.annotations.PrepareForTest;
16  import org.powermock.modules.junit4.PowerMockRunner;
17  import org.powermock.reflect.Whitebox;
18  
19  import java.io.File;
20  import java.lang.reflect.Method;
21  import java.util.HashMap;
22  import java.util.HashSet;
23  import java.util.Map;
24  import java.util.Set;
25  
26  import static org.junit.Assert.assertEquals;
27  import static org.junit.Assert.assertNotNull;
28  import static org.junit.Assert.assertTrue;
29  
30  /**
31   * Covers method {@link GenerateSourcesMojo#getPackageCompareMap(Set)} with tests
32   *
33   * @author Oleg Green - olegalex.green@gmail.com
34   */
35  
36  @RunWith( PowerMockRunner.class )
37  @PrepareForTest( GenerateSourcesMojo.class )
38  public class GetPackageCompareMapTest
39  {
40      public static final String PROJECT_ARTIFACT_ID = "main_application";
41      public static final String PROJECT_PACKAGE_NAME = "com.jayway.maven.application";
42      public static final String COM_JAYWAY_MAVEN_LIBRARY_PACKAGE = "com.jayway.maven.library";
43      public static final String COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE = "com.jayway.maven.library2";
44      public static final String COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE = "com.jayway.maven.library3";
45      public static final Artifact LIBRARY1_ARTIFACT = createArtifact("library1");
46      public static final Artifact LIBRARY2_ARTIFACT = createArtifact("library2");
47      public static final Artifact LIBRARY3_ARTIFACT = createArtifact("library3");
48      public static final Map<Artifact, String > TEST_DATA_1 = new HashMap<Artifact, String>()
49      {
50          {
51              put( LIBRARY1_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE );
52              put( LIBRARY2_ARTIFACT, PROJECT_PACKAGE_NAME );
53              put( LIBRARY3_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE );
54          }
55      };
56      public static final Map<Artifact, String > TEST_DATA_2 = new HashMap<Artifact, String>()
57      {
58          {
59              put( LIBRARY1_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY_PACKAGE );
60              put( LIBRARY2_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE );
61              put( LIBRARY3_ARTIFACT, COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE );
62          }
63      };
64  
65      private MavenProject project;
66      private Artifact projectArtifact;
67      private GenerateSourcesMojo mojo;
68  
69      @Before
70      public void setUp() throws Exception {
71  
72          mojo = PowerMock.createPartialMock( GenerateSourcesMojo.class,
73                  "extractPackageNameFromAndroidManifest",
74                  "extractPackageNameFromAndroidArtifact" );
75  
76          setUpMainProject();
77          Whitebox.setInternalState(mojo, "project", project);
78  
79          Method extractPackageNameFromAndroidManifestMethod = Whitebox.getMethod(
80                  AbstractAndroidMojo.class,
81                  "extractPackageNameFromAndroidManifest",
82                  File.class
83          );
84          PowerMock.expectPrivate(
85                  mojo,
86                  extractPackageNameFromAndroidManifestMethod,
87                  EasyMock.anyObject( File.class )
88          ).andReturn(PROJECT_PACKAGE_NAME).once();
89      }
90  
91      @Test(expected = IllegalArgumentException.class)
92      public void testNoDependencies() throws MojoExecutionException
93      {
94          PowerMock.replay( mojo );
95  
96          mojo.getPackageCompareMap(null);
97      }
98  
99      @Test
100     public void testEmptyDependencies() throws MojoExecutionException
101     {
102         PowerMock.replay( mojo );
103 
104         Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( new HashSet<Artifact>() );
105         assertNotNull( map );
106         assertEquals( 1, map.size() );
107         assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) );
108 
109         Set<Artifact> artifactSet = map.get( PROJECT_PACKAGE_NAME );
110         assertEquals( 1, artifactSet.size() );
111         assertTrue( artifactSet.contains( projectArtifact ) );
112     }
113 
114     @Test
115     public void testData1() throws Exception
116     {
117         mockExtractPackageNameFromArtifactMethod( TEST_DATA_1 );
118         PowerMock.replay( mojo );
119 
120         Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( TEST_DATA_1.keySet() );
121         assertNotNull( map );
122         assertEquals( 2, map.size() );
123         assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) );
124         assertTrue( map.containsKey( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE ) );
125 
126         Set<Artifact> artifactSet1 = map.get( PROJECT_PACKAGE_NAME );
127         assertEquals( 2, artifactSet1.size() );
128         assertTrue( artifactSet1.contains( LIBRARY2_ARTIFACT ) );
129         assertTrue( artifactSet1.contains( projectArtifact ) );
130 
131         Set<Artifact> artifactSet2 = map.get( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE );
132         assertEquals( 2, artifactSet2.size() );
133         assertTrue( artifactSet2.contains( LIBRARY1_ARTIFACT ) );
134         assertTrue( artifactSet2.contains( LIBRARY3_ARTIFACT ) );
135 
136         PowerMock.verify( mojo );
137         EasyMock.verify( project, projectArtifact );
138     }
139 
140     @Test
141     public void testData2() throws Exception
142     {
143         mockExtractPackageNameFromArtifactMethod( TEST_DATA_2 );
144         PowerMock.replay( mojo );
145 
146         Map<String, Set<Artifact>> map = mojo.getPackageCompareMap( TEST_DATA_2.keySet() );
147         assertNotNull( map );
148         assertEquals( 4, map.size() );
149         assertTrue( map.containsKey( PROJECT_PACKAGE_NAME ) );
150 
151         Set<Artifact> artifactSet1 = map.get( PROJECT_PACKAGE_NAME );
152         assertEquals( 1, artifactSet1.size() );
153         assertTrue( artifactSet1.contains( projectArtifact ) );
154 
155         Set<Artifact> artifactSet2 = map.get( COM_JAYWAY_MAVEN_LIBRARY_PACKAGE );
156         assertEquals( 1, artifactSet2.size() );
157         assertTrue( artifactSet2.contains( LIBRARY1_ARTIFACT ) );
158 
159         Set<Artifact> artifactSet3 = map.get( COM_JAYWAY_MAVEN_LIBRARY2_PACKAGE );
160         assertEquals( 1, artifactSet3.size() );
161         assertTrue( artifactSet3.contains( LIBRARY2_ARTIFACT ) );
162 
163         Set<Artifact> artifactSet4 = map.get( COM_JAYWAY_MAVEN_LIBRARY3_PACKAGE );
164         assertEquals( 1, artifactSet4.size() );
165         assertTrue( artifactSet4.contains( LIBRARY3_ARTIFACT ) );
166 
167         PowerMock.verify( mojo );
168         EasyMock.verify( project, projectArtifact );
169 
170     }
171 
172     private void setUpMainProject()
173     {
174         projectArtifact = EasyMock.createMock( Artifact.class );
175         EasyMock.expect( projectArtifact.getArtifactId() ).andReturn( PROJECT_ARTIFACT_ID ).anyTimes();
176         EasyMock.replay( projectArtifact );
177 
178         project = EasyMock.createNiceMock( MavenProject.class );
179         EasyMock.expect( project.getArtifact() ).andReturn( projectArtifact );
180         EasyMock.replay( project );
181     }
182 
183     private void mockExtractPackageNameFromArtifactMethod( final Map<Artifact, String> testData  ) throws Exception
184     {
185         Method extractPackageNameFromAndroidArtifact = Whitebox.getMethod(
186                 AbstractAndroidMojo.class,
187                 "extractPackageNameFromAndroidArtifact",
188                 Artifact.class
189         );
190         PowerMock.expectPrivate(
191                 mojo,
192                 extractPackageNameFromAndroidArtifact,
193                 EasyMock.anyObject( Artifact.class )
194         ).andAnswer(new IAnswer<String>() {
195             @Override
196             public String answer() throws Throwable {
197                 final Object[] args = EasyMock.getCurrentArguments();
198                 final Artifact inputArtifact = (Artifact)args[0];
199                 return testData.get(inputArtifact);
200             }
201         }).anyTimes();
202     }
203 
204     private static Artifact createArtifact( String artifactId )
205     {
206         Artifact artifactMock = EasyMock.createMock( Artifact.class );
207         EasyMock.expect( artifactMock.getArtifactId() ).andReturn( artifactId ).anyTimes();
208         EasyMock.replay( artifactMock );
209         return artifactMock;
210     }
211 }