Skip to content

Commit 4e29e14

Browse files
authored
Merge pull request #101 from alisiikh/bug_concurrent_modification
Fixed bug: ConcurrentModificationException during project evaluation
2 parents 5cf9e02 + dc47aa6 commit 4e29e14

File tree

22 files changed

+604
-3
lines changed

22 files changed

+604
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
package org.scoverage;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
7+
import java.io.File;
8+
9+
10+
public class ScalaMultiModuleWithMultipleTestTasksTest extends ScoverageFunctionalTest {
11+
12+
13+
public ScalaMultiModuleWithMultipleTestTasksTest() {
14+
super("scala-multi-module-multiple-test-tasks");
15+
}
16+
17+
@Test
18+
public void reportScoverage() {
19+
20+
AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getREPORT_NAME());
21+
22+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
23+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
24+
result.assertTaskExists("b:" + ScoveragePlugin.getREPORT_NAME());
25+
result.assertTaskExists("common:" + ScoveragePlugin.getREPORT_NAME());
26+
result.assertTaskExists("intTest");
27+
result.assertTaskExists("reportIntTestScoverage");
28+
result.assertTaskExists("a:intTest");
29+
result.assertTaskExists("b:intTest");
30+
result.assertTaskExists("common:intTest");
31+
result.assertTaskExists("a:reportIntTestScoverage");
32+
result.assertTaskExists("b:reportIntTestScoverage");
33+
result.assertTaskExists("common:reportIntTestScoverage");
34+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
35+
}
36+
37+
@Test
38+
public void reportScoverageOnlyRoot() {
39+
40+
AssertableBuildResult result = dryRun("clean", ":" + ScoveragePlugin.getREPORT_NAME());
41+
42+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
43+
result.assertTaskDoesntExist("a:" + ScoveragePlugin.getREPORT_NAME());
44+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getREPORT_NAME());
45+
result.assertTaskDoesntExist("common:" + ScoveragePlugin.getREPORT_NAME());
46+
}
47+
48+
@Test
49+
public void reportScoverageOnlyA() {
50+
51+
AssertableBuildResult result = dryRun("clean", ":a:" + ScoveragePlugin.getREPORT_NAME());
52+
53+
result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME());
54+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
55+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getREPORT_NAME());
56+
result.assertTaskDoesntExist("common:" + ScoveragePlugin.getREPORT_NAME());
57+
}
58+
59+
@Test
60+
public void aggregateScoverage() {
61+
62+
AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getAGGREGATE_NAME());
63+
64+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
65+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
66+
result.assertTaskExists("b:" + ScoveragePlugin.getREPORT_NAME());
67+
result.assertTaskExists(ScoveragePlugin.getAGGREGATE_NAME());
68+
result.assertTaskExists("common:" + ScoveragePlugin.getREPORT_NAME());
69+
}
70+
71+
@Test
72+
public void checkScoverage() {
73+
74+
AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getCHECK_NAME());
75+
76+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
77+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
78+
result.assertTaskExists("b:" + ScoveragePlugin.getREPORT_NAME());
79+
result.assertTaskExists("common:" + ScoveragePlugin.getREPORT_NAME());
80+
result.assertTaskExists(ScoveragePlugin.getCHECK_NAME());
81+
result.assertTaskExists("a:" + ScoveragePlugin.getCHECK_NAME());
82+
result.assertTaskExists("b:" + ScoveragePlugin.getCHECK_NAME());
83+
result.assertTaskExists("common:" + ScoveragePlugin.getCHECK_NAME());
84+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
85+
}
86+
87+
@Test
88+
public void checkScoverageOnlyRoot() {
89+
90+
AssertableBuildResult result = dryRun("clean", ":" + ScoveragePlugin.getCHECK_NAME());
91+
92+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
93+
result.assertTaskDoesntExist("a:" + ScoveragePlugin.getREPORT_NAME());
94+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getREPORT_NAME());
95+
result.assertTaskExists(ScoveragePlugin.getCHECK_NAME());
96+
result.assertTaskDoesntExist("a:" + ScoveragePlugin.getCHECK_NAME());
97+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getCHECK_NAME());
98+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
99+
}
100+
101+
@Test
102+
public void checkScoverageOnlyA() {
103+
104+
AssertableBuildResult result = dryRun("clean", ":a:" + ScoveragePlugin.getCHECK_NAME());
105+
106+
result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME());
107+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
108+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getREPORT_NAME());
109+
result.assertTaskDoesntExist("common:" + ScoveragePlugin.getREPORT_NAME());
110+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
111+
result.assertTaskExists("a:" + ScoveragePlugin.getCHECK_NAME());
112+
result.assertTaskDoesntExist("b:" + ScoveragePlugin.getCHECK_NAME());
113+
result.assertTaskDoesntExist("common:" + ScoveragePlugin.getCHECK_NAME());
114+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
115+
}
116+
117+
@Test
118+
public void checkScoverageWithoutIntTests() {
119+
AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getCHECK_NAME(),
120+
"-x", "intTest");
121+
122+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
123+
result.assertTaskExists("a:" + ScoveragePlugin.getREPORT_NAME());
124+
result.assertTaskExists("b:" + ScoveragePlugin.getREPORT_NAME());
125+
result.assertTaskExists("common:" + ScoveragePlugin.getREPORT_NAME());
126+
result.assertTaskDoesntExist("intTest");
127+
result.assertTaskExists("reportIntTestScoverage");
128+
result.assertTaskDoesntExist("a:intTest");
129+
result.assertTaskDoesntExist("b:intTest");
130+
result.assertTaskDoesntExist("common:intTest");
131+
result.assertTaskExists("a:reportIntTestScoverage");
132+
result.assertTaskExists("b:reportIntTestScoverage");
133+
result.assertTaskExists("common:reportIntTestScoverage");
134+
}
135+
136+
@Test
137+
public void checkAndAggregateScoverage() throws Exception {
138+
139+
AssertableBuildResult result = run("clean", ScoveragePlugin.getCHECK_NAME(),
140+
ScoveragePlugin.getAGGREGATE_NAME());
141+
142+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
143+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getREPORT_NAME());
144+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getREPORT_NAME());
145+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getREPORT_NAME());
146+
result.assertTaskSucceeded(ScoveragePlugin.getCHECK_NAME());
147+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getCHECK_NAME());
148+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getCHECK_NAME());
149+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getCHECK_NAME());
150+
result.assertTaskSucceeded(ScoveragePlugin.getAGGREGATE_NAME());
151+
152+
assertAllReportFilesExist();
153+
assertCoverage(100.0);
154+
}
155+
156+
@Test
157+
public void checkScoverageWithoutCoverageInRoot() throws Exception {
158+
159+
AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getCHECK_NAME(),
160+
"test",
161+
"--tests", "org.hello.TestNothingSuite",
162+
"--tests", "org.hello.a.WorldASuite",
163+
"--tests", "org.hello.b.WorldBSuite",
164+
"--tests", "org.hello.common.WorldCommonSuite",
165+
"-x", "intTest");
166+
167+
result.assertTaskFailed(ScoveragePlugin.getCHECK_NAME());
168+
169+
assertRootReportFilesExist();
170+
assertCoverage(0.0);
171+
}
172+
173+
@Test
174+
public void checkScoverageWithoutCoverageInA() throws Exception {
175+
176+
AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getCHECK_NAME(),
177+
"test",
178+
"--tests", "org.hello.a.TestNothingASuite",
179+
"--tests", "org.hello.WorldSuite",
180+
"--tests", "org.hello.b.WorldBSuite",
181+
"--tests", "org.hello.common.WorldCommonSuite",
182+
"-x", ":a:intTest");
183+
184+
result.assertTaskFailed("a:" + ScoveragePlugin.getCHECK_NAME());
185+
186+
assertAReportFilesExist();
187+
assertCoverage(0.0, reportDir(projectDir().toPath().resolve("a").toFile()));
188+
}
189+
190+
@Test
191+
public void checkScoverageWithoutNormalCompilationAndWithoutCoverageInCommon() throws Exception {
192+
193+
AssertableBuildResult result = runAndFail("clean",
194+
":a:test",
195+
":common:test", "--tests", "org.hello.common.TestNothingCommonSuite",
196+
"-x", "compileScala",
197+
ScoveragePlugin.getCHECK_NAME());
198+
199+
result.assertTaskFailed("common:" + ScoveragePlugin.getCHECK_NAME());
200+
201+
assertCommonReportFilesExist();
202+
assertCoverage(0.0, reportDir(projectDir().toPath().resolve("common").toFile()));
203+
}
204+
205+
@Test
206+
public void checkAndAggregateScoverageWithoutCoverageInRoot() throws Exception {
207+
208+
// should pass as the check on the root is for the aggregation (which covers > 50%)
209+
210+
AssertableBuildResult result = run("clean", ScoveragePlugin.getCHECK_NAME(),
211+
ScoveragePlugin.getAGGREGATE_NAME(), "test",
212+
"--tests", "org.hello.TestNothingSuite",
213+
"--tests", "org.hello.a.WorldASuite",
214+
"--tests", "org.hello.b.WorldBSuite",
215+
"--tests", "org.hello.common.WorldCommonSuite");
216+
217+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
218+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getREPORT_NAME());
219+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getREPORT_NAME());
220+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getREPORT_NAME());
221+
result.assertTaskSucceeded(ScoveragePlugin.getCHECK_NAME());
222+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getCHECK_NAME());
223+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getCHECK_NAME());
224+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getCHECK_NAME());
225+
result.assertTaskSucceeded(ScoveragePlugin.getAGGREGATE_NAME());
226+
227+
assertAllReportFilesExist();
228+
assertCoverage(93.33);
229+
}
230+
231+
@Test
232+
public void checkAndAggregateScoverageWithoutCoverageInAll() throws Exception {
233+
234+
AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getCHECK_NAME(),
235+
ScoveragePlugin.getAGGREGATE_NAME(), "test",
236+
"--tests", "org.hello.TestNothingSuite",
237+
"--tests", "org.hello.a.TestNothingASuite",
238+
"--tests", "org.hello.b.TestNothingBSuite",
239+
"--tests", "org.hello.common.TestNothingCommonSuite",
240+
"-x", "intTest");
241+
242+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
243+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getREPORT_NAME());
244+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getREPORT_NAME());
245+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getREPORT_NAME());
246+
result.assertTaskSucceeded(ScoveragePlugin.getAGGREGATE_NAME());
247+
result.assertTaskFailed(ScoveragePlugin.getCHECK_NAME());
248+
249+
assertAllReportFilesExist();
250+
assertCoverage(0.0);
251+
}
252+
253+
@Test
254+
public void aggregateScoverageWithoutNormalCompilation() throws Exception {
255+
256+
AssertableBuildResult result = run("clean", ScoveragePlugin.getAGGREGATE_NAME(),
257+
"-x", "compileScala");
258+
259+
result.assertTaskSkipped("compileScala");
260+
result.assertTaskSkipped("a:compileScala");
261+
result.assertTaskSkipped("b:compileScala");
262+
result.assertTaskSkipped("common:compileScala");
263+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
264+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getCOMPILE_NAME());
265+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getCOMPILE_NAME());
266+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getCOMPILE_NAME());
267+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
268+
result.assertTaskSucceeded("a:" + ScoveragePlugin.getREPORT_NAME());
269+
result.assertTaskSucceeded("b:" + ScoveragePlugin.getREPORT_NAME());
270+
result.assertTaskSucceeded("common:" + ScoveragePlugin.getREPORT_NAME());
271+
result.assertTaskSucceeded(ScoveragePlugin.getAGGREGATE_NAME());
272+
273+
assertAllReportFilesExist();
274+
assertCoverage(100.0);
275+
276+
Assert.assertTrue(resolve(buildDir(resolve(projectDir(), "a")), "classes/scala/main/org/hello/a/WorldA.class").exists());
277+
Assert.assertFalse(resolve(buildDir(resolve(projectDir(), "a")), "classes/scala/scoverage/org/hello/a/WorldA.class").exists());
278+
279+
Assert.assertTrue(resolve(buildDir(resolve(projectDir(), "b")), "classes/scala/main/org/hello/b/WorldB.class").exists());
280+
Assert.assertFalse(resolve(buildDir(resolve(projectDir(), "b")), "classes/scala/scoverage/org/hello/b/WorldB.class").exists());
281+
282+
Assert.assertTrue(resolve(buildDir(resolve(projectDir(), "common")), "classes/scala/main/org/hello/common/WorldCommon.class").exists());
283+
Assert.assertFalse(resolve(buildDir(resolve(projectDir(), "common")), "classes/scala/scoverage/org/hello/common/WorldCommon.class").exists());
284+
}
285+
286+
private void assertAllReportFilesExist() {
287+
288+
assertRootReportFilesExist();
289+
assertAReportFilesExist();
290+
assertBReportFilesExist();
291+
assertCommonReportFilesExist();
292+
assertAggregationFilesExist();
293+
}
294+
295+
private void assertAggregationFilesExist() {
296+
297+
Assert.assertTrue(resolve(reportDir(), "a/src/main/scala/org/hello/a/WorldA.scala.html").exists());
298+
Assert.assertTrue(resolve(reportDir(), "b/src/main/scala/org/hello/b/WorldB.scala.html").exists());
299+
Assert.assertTrue(resolve(reportDir(), "common/src/main/scala/org/hello/common/WorldCommon.scala.html").exists());
300+
}
301+
302+
private void assertRootReportFilesExist() {
303+
304+
Assert.assertTrue(resolve(reportDir(), "index.html").exists());
305+
Assert.assertTrue(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists());
306+
}
307+
308+
private void assertAReportFilesExist() {
309+
310+
File reportDir = reportDir(projectDir().toPath().resolve("a").toFile());
311+
Assert.assertTrue(resolve(reportDir, "index.html").exists());
312+
Assert.assertTrue(resolve(reportDir, "src/main/scala/org/hello/a/WorldA.scala.html").exists());
313+
}
314+
315+
private void assertBReportFilesExist() {
316+
317+
File reportDir = reportDir(projectDir().toPath().resolve("b").toFile());
318+
Assert.assertTrue(resolve(reportDir, "index.html").exists());
319+
Assert.assertTrue(resolve(reportDir, "src/main/scala/org/hello/b/WorldB.scala.html").exists());
320+
}
321+
322+
private void assertCommonReportFilesExist() {
323+
324+
File reportDir = reportDir(projectDir().toPath().resolve("common").toFile());
325+
Assert.assertTrue(resolve(reportDir, "index.html").exists());
326+
Assert.assertTrue(resolve(reportDir, "src/main/scala/org/hello/common/WorldCommon.scala.html").exists());
327+
}
328+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
dependencies {
2+
compile project(":common")
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.hello.a
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class WorldAIntSuite extends FunSuite {
9+
10+
test("barA") {
11+
new WorldA().barA()
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.hello.a
2+
3+
import org.hello.common.WorldCommon
4+
5+
class WorldA {
6+
7+
def fooA(): String = {
8+
val s = "a" + new WorldCommon().fooCommon()
9+
s
10+
}
11+
12+
def barA(): String = {
13+
val s = "a" + new WorldCommon().fooCommon()
14+
s
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.hello.a
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class TestNothingASuite extends FunSuite {
9+
10+
test("nothing") {
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.hello.a
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class WorldASuite extends FunSuite {
9+
10+
test("fooA") {
11+
new WorldA().fooA()
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
dependencies {
2+
compile project(":common")
3+
}

0 commit comments

Comments
 (0)