View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.surefire.its.jiras;
20  
21  import org.apache.maven.it.VerificationException;
22  import org.apache.maven.surefire.its.fixture.OutputValidator;
23  import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
24  import org.apache.maven.surefire.its.fixture.SurefireLauncher;
25  import org.apache.maven.surefire.its.fixture.TestFile;
26  import org.junit.Test;
27  
28  import static java.nio.charset.StandardCharsets.UTF_8;
29  import static org.assertj.core.api.Assertions.assertThat;
30  import static org.hamcrest.CoreMatchers.anyOf;
31  import static org.hamcrest.CoreMatchers.containsString;
32  import static org.hamcrest.CoreMatchers.is;
33  
34  /**
35   *
36   */
37  public class Surefire1535TestNGParallelSuitesIT extends SurefireJUnit4IntegrationTestCase {
38      private static final String TEST_RESULT_1 = platformEncoding("Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, ");
39      private static final String TEST_RESULT_2 = platformEncoding("Tests run: 2, Failures: 0, Errors: 0, Skipped: 0");
40      private static final String SUITE1 = platformEncoding("Suite1");
41      private static final String SUITE2 = platformEncoding("Suite2");
42      private static final String TEST1 = platformEncoding("test 1");
43      private static final String TEST2 = platformEncoding("test 2");
44      private static final String TEST_SUITE = platformEncoding("Running TestSuite");
45  
46      @Test
47      public void forks2() throws VerificationException {
48          OutputValidator validator = unpack().activateProfile("forked-reports-directory")
49                  .forkCount(2)
50                  .executeTest();
51  
52          TestFile testFile = validator.getSurefireReportsFile("../surefire-reports-1/TEST-TestSuite.xml", UTF_8);
53          testFile.assertFileExists();
54          testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest");
55          String xml = testFile.readFileToString();
56          boolean parallelTest11 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
57          boolean parallelTest12 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
58          assertThat(parallelTest11 ^ parallelTest12).isTrue();
59  
60          testFile = validator.getSurefireReportsFile("../surefire-reports-2/TEST-TestSuite.xml", UTF_8);
61          testFile.assertFileExists();
62          testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest");
63          xml = testFile.readFileToString();
64          boolean parallelTest21 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
65          boolean parallelTest22 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
66          assertThat(parallelTest21 ^ parallelTest22).isTrue();
67  
68          assertThat(parallelTest11 && parallelTest22 || parallelTest12 && parallelTest21)
69                  .isTrue();
70  
71          validator
72                  .assertThatLogLine(containsString(TEST_RESULT_2), is(1))
73                  .assertThatLogLine(containsString(TEST_RESULT_1), is(2))
74                  .assertThatLogLine(containsString(SUITE1), is(1))
75                  .assertThatLogLine(containsString(SUITE2), is(1))
76                  .assertThatLogLine(containsString(TEST1), is(1))
77                  .assertThatLogLine(containsString(TEST2), is(1))
78                  .assertThatLogLine(containsString(TEST_SUITE), is(2));
79      }
80  
81      @Test
82      public void forks2Redirected() throws VerificationException {
83          OutputValidator validator = unpack().activateProfile("forked-reports-directory")
84                  .forkCount(2)
85                  .redirectToFile(true)
86                  .executeTest();
87  
88          TestFile testFile = validator.getSurefireReportsFile("../surefire-reports-1/TEST-TestSuite.xml", UTF_8);
89          testFile.assertFileExists();
90          testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest");
91          String xml = testFile.readFileToString();
92          boolean parallelTest11 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
93          boolean parallelTest12 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
94          assertThat(parallelTest11 ^ parallelTest12).isTrue();
95          String log = validator
96                  .getSurefireReportsFile("../surefire-reports-1/TestSuite-output.txt", UTF_8)
97                  .readFileToString();
98          assertThat(log.contains(TEST1)).isEqualTo(parallelTest11);
99          assertThat(log.contains(SUITE1)).isEqualTo(parallelTest11);
100         assertThat(log.contains(TEST2)).isEqualTo(parallelTest12);
101         assertThat(log.contains(SUITE2)).isEqualTo(parallelTest12);
102 
103         testFile = validator.getSurefireReportsFile("../surefire-reports-2/TEST-TestSuite.xml", UTF_8);
104         testFile.assertFileExists();
105         testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest");
106         xml = testFile.readFileToString();
107         boolean parallelTest21 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
108         boolean parallelTest22 = xml.contains("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
109         assertThat(parallelTest21 ^ parallelTest22).isTrue();
110         log = validator
111                 .getSurefireReportsFile("../surefire-reports-2/TestSuite-output.txt", UTF_8)
112                 .readFileToString();
113         assertThat(log.contains(TEST1)).isEqualTo(parallelTest21);
114         assertThat(log.contains(SUITE1)).isEqualTo(parallelTest21);
115         assertThat(log.contains(TEST2)).isEqualTo(parallelTest22);
116         assertThat(log.contains(SUITE2)).isEqualTo(parallelTest22);
117 
118         assertThat(parallelTest11 && parallelTest22 || parallelTest12 && parallelTest21)
119                 .isTrue();
120 
121         validator
122                 .assertThatLogLine(containsString(TEST_RESULT_2), is(1))
123                 .assertThatLogLine(containsString(TEST_RESULT_1), is(2))
124                 .assertThatLogLine(containsString(TEST_SUITE), is(2));
125 
126         TestFile outFile = validator.getSurefireReportsFile("../surefire-reports-1/TestSuite-output.txt");
127         outFile.assertFileExists();
128         outFile.assertContainsText(anyOf(containsString(SUITE1), containsString(SUITE2)));
129         outFile.assertContainsText(anyOf(containsString(TEST1), containsString(TEST2)));
130 
131         outFile = validator.getSurefireReportsFile("../surefire-reports-2/TestSuite-output.txt");
132         outFile.assertFileExists();
133         outFile.assertContainsText(anyOf(containsString(SUITE1), containsString(SUITE2)));
134         outFile.assertContainsText(anyOf(containsString(TEST1), containsString(TEST2)));
135     }
136 
137     @Test
138     public void forks0() throws VerificationException {
139         OutputValidator validator = unpack().forkCount(0).executeTest();
140 
141         TestFile testFile = validator.getSurefireReportsFile("TEST-TestSuite.xml");
142         testFile.assertFileExists();
143         testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
144         testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
145 
146         validator
147                 .assertThatLogLine(containsString(SUITE1), is(1))
148                 .assertThatLogLine(containsString(SUITE2), is(1))
149                 .assertThatLogLine(containsString(TEST1), is(1))
150                 .assertThatLogLine(containsString(TEST2), is(1))
151                 .assertThatLogLine(containsString(TEST_SUITE), is(1));
152     }
153 
154     @Test
155     public void forks0Redirected() throws VerificationException {
156         OutputValidator validator = unpack().forkCount(0).redirectToFile(true).executeTest();
157 
158         TestFile testFile = validator.getSurefireReportsXmlFile("TEST-TestSuite.xml");
159         testFile.assertFileExists();
160         testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest1\"");
161         testFile.assertContainsText("<testcase name=\"test\" classname=\"it.ParallelTest2\"");
162 
163         validator.assertThatLogLine(containsString(TEST_SUITE), is(1));
164 
165         TestFile outFile = validator.getSurefireReportsFile("TestSuite-output.txt");
166         outFile.assertFileExists();
167         outFile.assertContainsText(SUITE1);
168         outFile.assertContainsText(SUITE2);
169         outFile.assertContainsText(TEST1);
170         outFile.assertContainsText(TEST2);
171     }
172 
173     private SurefireLauncher unpack() {
174         return unpack("/surefire-1535-parallel-testng");
175     }
176 
177     private static String platformEncoding(String text) {
178         return new String(text.getBytes(UTF_8));
179     }
180 }