1 package org.apache.maven.surefire.its;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.surefire.its.fixture.*;
23 import org.junit.Test;
24 import org.junit.experimental.categories.Category;
25
26 import java.io.File;
27 import java.util.ArrayList;
28 import java.util.HashSet;
29 import java.util.List;
30 import java.util.Set;
31
32 import static org.junit.Assert.assertEquals;
33 import static org.junit.Assert.assertTrue;
34
35
36
37
38
39
40 @Category( Not2xCompatible.class )
41 public class ForkModeMultiModuleIT
42 extends SurefireJUnit4IntegrationTestCase
43 {
44 @Test
45 public void testForkCountOneNoReuse()
46 {
47 List<String> pids = doTest( unpack( getProject() ).forkCount( 1 ).reuseForks( false ) );
48 assertAllDifferentPids( pids );
49 int matchesOne = countSuffixMatches( pids, "_1_1");
50 int matchesTwo = countSuffixMatches( pids, "_2_2" );
51 assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
52 assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
53 assertEquals( "No other forkNumbers than 1 and 2 have been used", 6, matchesOne + matchesTwo);
54 }
55
56
57 @Test
58 public void testForkCountOneReuse()
59 {
60 List<String> pids = doTest( unpack( getProject() ).forkCount( 1 ).reuseForks( true ) );
61 assertDifferentPids( pids, 2 );
62 assertEndWith( pids, "_1_1", 3 );
63 assertEndWith( pids, "_2_2", 3 );
64 }
65
66 @Test
67 public void testForkCountTwoNoReuse()
68 {
69 List<String> pids = doTest( unpack( getProject() ).forkCount( 2 ).reuseForks( false ) );
70 assertAllDifferentPids( pids );
71 int matchesOne = countSuffixMatches( pids, "_1_1");
72 int matchesTwo = countSuffixMatches( pids, "_2_2" );
73 int matchesThree = countSuffixMatches( pids, "_3_3");
74 int matchesFour = countSuffixMatches( pids, "_4_4" );
75 assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
76 assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
77 assertTrue( "At least one fork had forkNumber 3", matchesThree >= 1 );
78 assertTrue( "At least one fork had forkNumber 4", matchesFour >= 1 );
79 assertEquals( "No other forkNumbers than 1, 2, 3, or 4 have been used", 6, matchesOne + matchesTwo + matchesThree + matchesFour );
80 }
81
82 @Test
83 public void testForkCountTwoReuse()
84 {
85 List<String> pids =
86 doTest( unpack( getProject() ).forkCount( 2 ).reuseForks( true ) );
87 assertDifferentPids( pids, 4 );
88
89 int matchesOne = countSuffixMatches( pids, "_1_1");
90 int matchesTwo = countSuffixMatches( pids, "_2_2" );
91 int matchesThree = countSuffixMatches( pids, "_3_3");
92 int matchesFour = countSuffixMatches( pids, "_4_4" );
93 assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
94 assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
95 assertTrue( "At least one fork had forkNumber 3", matchesThree >= 1 );
96 assertTrue( "At least one fork had forkNumber 4", matchesFour >= 1 );
97 assertEquals( "No other forkNumbers than 1, 2, 3, or 4 have been used", 6, matchesOne + matchesTwo + matchesThree + matchesFour );
98 }
99
100 private void assertEndWith( List<String> pids, String suffix, int expectedMatches )
101 {
102 int matches = countSuffixMatches( pids, suffix );
103
104 assertEquals( "suffix " + suffix + " matched the correct number of pids", expectedMatches, matches );
105 }
106
107 private int countSuffixMatches( List<String> pids, String suffix )
108 {
109 int matches = 0;
110 for ( String pid : pids )
111 {
112 if ( pid.endsWith( suffix ) )
113 {
114 matches++;
115 }
116 }
117 return matches;
118 }
119
120 private void assertDifferentPids( List<String> pids, int numOfDifferentPids )
121 {
122 Set<String> pidSet = new HashSet<String>( pids );
123 assertEquals( "number of different pids is not as expected", numOfDifferentPids, pidSet.size() );
124 }
125
126 private void assertAllDifferentPids( List<String> pids )
127 {
128 assertDifferentPids( pids, pids.size() );
129 }
130
131 private List<String> doTest( SurefireLauncher forkMode )
132 {
133 forkMode.addGoal( "-T 2" );
134 forkMode.sysProp( "testProperty", "testValue_${surefire.threadNumber}_${surefire.forkNumber}" );
135 final OutputValidator outputValidator = forkMode.setForkJvm().executeTest();
136 List<String> pids = new ArrayList<String>( 6 );
137 pids.addAll( validateModule( outputValidator, "module-a" ) );
138 pids.addAll( validateModule( outputValidator, "module-b" ) );
139
140 return pids;
141 }
142
143 private List<String> validateModule( OutputValidator outputValidator, String module )
144 {
145 HelperAssertions.assertTestSuiteResults( 3, 0, 0, 0, new File( outputValidator.getBaseDir(), module ) );
146
147 List<String> pids = new ArrayList<String>( 3 );
148 for ( int i = 1; i <= 3; i++ )
149 {
150 final TestFile targetFile = outputValidator.getTargetFile( module, "test" + i + "-pid" );
151 String pid = targetFile.slurpFile();
152 pids.add( pid );
153 }
154
155 return pids;
156 }
157
158 protected String getProject()
159 {
160 return "fork-mode-multimodule";
161 }
162
163
164 }