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