1 package org.apache.maven.plugin.surefire.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertFalse;
24 import static org.junit.Assert.assertNotNull;
25
26 import org.apache.maven.artifact.Artifact;
27 import org.apache.maven.artifact.DefaultArtifact;
28 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
29 import org.apache.maven.artifact.versioning.VersionRange;
30 import org.apache.maven.surefire.api.testset.TestListResolver;
31 import org.apache.maven.surefire.api.util.ScanResult;
32 import org.junit.Rule;
33 import org.junit.Test;
34 import org.junit.rules.TemporaryFolder;
35
36 import java.io.File;
37 import java.io.FileOutputStream;
38 import java.util.Arrays;
39 import java.util.ArrayList;
40 import java.util.Collections;
41 import java.util.HashMap;
42 import java.util.List;
43 import java.util.Map;
44 import java.util.zip.ZipEntry;
45 import java.util.zip.ZipOutputStream;
46
47
48
49
50 public class DependenciesScannerTest
51 {
52
53 @Rule
54 public TemporaryFolder tempFolder = new TemporaryFolder();
55
56 @Test
57 public void testLocateTestClasses()
58 throws Exception
59 {
60 File testFile = writeTestFile( "DependenciesScannerTest-tests.jar",
61 "org/test/TestA.class", "org/test/TestB.class" );
62
63
64 Artifact artifact =
65 new DefaultArtifact( "org.surefire.dependency", "test-jar", VersionRange.createFromVersion( "1.0" ), "test",
66 "jar", "tests", null );
67 artifact.setFile( testFile );
68
69 List<String> scanDependencies = new ArrayList<>();
70 scanDependencies.add( "org.surefire.dependency:test-jar" );
71
72 List<String> include = new ArrayList<>();
73 include.add( "**/*A.java" );
74 List<String> exclude = new ArrayList<>();
75
76 List<File> dependenciesToScan =
77 filterArtifactsAsFiles( scanDependencies, Collections.singletonList( artifact ) );
78
79 DependencyScanner scanner =
80 new DependencyScanner( dependenciesToScan, new TestListResolver( include, exclude ) );
81
82 ScanResult classNames = scanner.scan();
83 assertNotNull( classNames );
84 assertEquals( 1, classNames.size() );
85
86 Map<String, String> props = new HashMap<>();
87 classNames.writeTo( props );
88 assertEquals( 1, props.size() );
89 }
90
91
92
93
94 @Test
95 public void testLocateTestClassesFromArtifactWithClassifier()
96 throws Exception
97 {
98 File testJarFile = writeTestFile( "DependenciesScannerTest2-1.0-tests-jdk15.jar", "org/test/TestA.class",
99 "org/test/other/TestAA.class", "org/test/TestB.class" );
100 Artifact testArtifact =
101 new DefaultArtifact( "org.surefire.dependency", "dependent-artifact2",
102 VersionRange.createFromVersion( "1.0" ), "test", "jar", "tests-jdk15", null );
103 testArtifact.setFile( testJarFile );
104
105 List<String> scanDependencies = new ArrayList<>();
106 scanDependencies.add( "org.surefire.dependency:dependent-artifact2:*:*:tests-jdk15" );
107
108 List<String> include = new ArrayList<>();
109 include.add( "**/*A.java" );
110 List<String> exclude = new ArrayList<>();
111
112
113 List<File> filesToScan = filterArtifactsAsFiles( scanDependencies, Collections.singletonList( testArtifact ) );
114
115 DependencyScanner scanner =
116 new DependencyScanner( filesToScan, new TestListResolver( include, exclude ) );
117
118 ScanResult classNames = scanner.scan();
119 assertNotNull( classNames );
120 assertEquals( 2, classNames.size() );
121
122 Map<String, String> props = new HashMap<>();
123 classNames.writeTo( props );
124 assertEquals( 2, props.size() );
125 }
126
127
128
129
130 @Test
131 public void testLocateTestClassesFromMultipleArtifactsWithType()
132 throws Exception
133 {
134 File jarFile =
135 writeTestFile( "DependenciesScannerTest3-1.0.jar", "org/test/ClassA.class", "org/test/ClassB.class" );
136 Artifact mainArtifact = new DefaultArtifact( "org.surefire.dependency", "dependent-artifact3",
137 VersionRange.createFromVersion( "1.0" ), "test", "jar", null,
138 new DefaultArtifactHandler() );
139 mainArtifact.setFile( jarFile );
140
141 File testJarFile =
142 writeTestFile( "DependenciesScannerTest3-1.0-tests.jar", "org/test/TestA.class", "org/test/TestB.class" );
143 Artifact testArtifact = new DefaultArtifact( "org.surefire.dependency", "dependent-artifact3",
144 VersionRange.createFromVersion( "1.0" ), "test", "test-jar", null,
145 new DefaultArtifactHandler() );
146 testArtifact.setFile( testJarFile );
147
148 List<String> scanDependencies = new ArrayList<>();
149 scanDependencies.add( "org.surefire.dependency:dependent-artifact3:test-jar" );
150
151 List<String> include = new ArrayList<String>();
152 include.add( "**/*A.java" );
153 List<String> exclude = new ArrayList<String>();
154
155 List<Artifact> artifacts = Arrays.asList( mainArtifact, testArtifact );
156
157 List<File> filesToScan = filterArtifactsAsFiles( scanDependencies, artifacts );
158
159 DependencyScanner scanner = new DependencyScanner( filesToScan, new TestListResolver( include, exclude ) );
160
161 ScanResult classNames = scanner.scan();
162 assertNotNull( classNames );
163 assertEquals( 1, classNames.size() );
164 assertEquals( "org.test.TestA", classNames.getClassName( 0 ) );
165
166 Map<String, String> props = new HashMap<>();
167 classNames.writeTo( props );
168 assertEquals( 1, props.size() );
169 }
170
171
172
173
174 @Test
175 public void testLocateTestClassesFromMultipleVersionsOfArtifact()
176 throws Exception
177 {
178 File jarFile10 =
179 writeTestFile( "DependenciesScannerTest4-1.0.jar", "org/test/ClassA.class", "org/test/ClassB.class" );
180 Artifact artifact10 = new DefaultArtifact( "org.surefire.dependency", "dependent-artifact4",
181 VersionRange.createFromVersion( "1.0" ), "test", "jar", null,
182 new DefaultArtifactHandler() );
183 artifact10.setFile( jarFile10 );
184
185 File jarFile20 =
186 writeTestFile( "DependenciesScannerTest4-2.0.jar", "org/test2/ClassA.class", "org/test2/ClassB.class" );
187 Artifact artifact20 = new DefaultArtifact( "org.surefire.dependency", "dependent-artifact4",
188 VersionRange.createFromVersion( "2.0" ), "test", "jar", null,
189 new DefaultArtifactHandler() );
190 artifact20.setFile( jarFile20 );
191
192 List<String> scanDependencies = new ArrayList<>();
193 scanDependencies.add( "org.surefire.dependency:dependent-artifact4:*:2.0" );
194
195 List<String> include = new ArrayList<>();
196 include.add( "**/*A.java" );
197 List<String> exclude = new ArrayList<>();
198
199 List<Artifact> artifacts = Arrays.asList( artifact10, artifact20 );
200
201 List<File> filesToScan = filterArtifactsAsFiles( scanDependencies, artifacts );
202 DependencyScanner scanner = new DependencyScanner( filesToScan, new TestListResolver( include, exclude ) );
203
204 ScanResult classNames = scanner.scan();
205 assertNotNull( classNames );
206 assertEquals( 1, classNames.size() );
207 assertEquals( "org.test2.ClassA", classNames.getClassName( 0 ) );
208
209 Map<String, String> props = new HashMap<String, String>();
210 classNames.writeTo( props );
211 assertEquals( 1, props.size() );
212 assertFalse( props.values().contains( "org.test.ClassA" ) );
213 }
214
215 private static List<File> filterArtifactsAsFiles( List<String> scanDependencies, List<Artifact> artifacts )
216 {
217 List<File> filesToScan = new ArrayList<>();
218 for ( Artifact a : DependencyScanner.filter( artifacts, scanDependencies ) )
219 {
220 filesToScan.add( a.getFile() );
221 }
222 return filesToScan;
223 }
224
225 private File writeTestFile( String fileName, String... entries )
226 throws Exception
227 {
228 File output = tempFolder.newFile( fileName );
229
230 try ( ZipOutputStream out = new ZipOutputStream( new FileOutputStream( output ) ) )
231 {
232 for ( String entry : entries )
233 {
234 out.putNextEntry( new ZipEntry( entry ) );
235 out.closeEntry();
236 }
237 return output;
238 }
239 }
240 }