1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.surefire.its.jiras;
20  
21  import javax.xml.parsers.DocumentBuilderFactory;
22  import javax.xml.xpath.XPath;
23  import javax.xml.xpath.XPathFactory;
24  
25  import java.io.File;
26  import java.util.ArrayList;
27  
28  import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
29  import org.junit.Before;
30  import org.junit.BeforeClass;
31  import org.junit.Test;
32  import org.junit.runner.RunWith;
33  import org.junit.runners.Parameterized;
34  import org.junit.runners.Parameterized.Parameter;
35  import org.junit.runners.Parameterized.Parameters;
36  import org.w3c.dom.Document;
37  
38  import static org.assertj.core.api.Assertions.assertThat;
39  
40  
41  
42  
43  @RunWith(Parameterized.class)
44  @SuppressWarnings("checkstyle:magicnumber")
45  public class Surefire946KillMainProcessInReusableForkIT extends SurefireJUnit4IntegrationTestCase {
46      
47      private static final int TEST_SLEEP_TIME = 3_500;
48  
49      private String classifierOfDummyDependency;
50  
51      @Parameter
52      @SuppressWarnings("checkstyle:visibilitymodifier")
53      public String shutdownMavenMethod;
54  
55      @Parameter(1)
56      @SuppressWarnings("checkstyle:visibilitymodifier")
57      public String shutdownSurefireMethod;
58  
59      @Parameters(name = "{0}-{1}")
60      public static Iterable<Object[]> data() {
61          ArrayList<Object[]> args = new ArrayList<>();
62          args.add(new Object[] {"halt", "exit"});
63          args.add(new Object[] {"halt", "kill"});
64          args.add(new Object[] {"exit", "exit"});
65          args.add(new Object[] {"exit", "kill"});
66          args.add(new Object[] {"interrupt", "exit"});
67          args.add(new Object[] {"interrupt", "kill"});
68          return args;
69      }
70  
71      @BeforeClass
72      public static void installSelfdestructPlugin() {
73          unpack(Surefire946KillMainProcessInReusableForkIT.class, "surefire-946-self-destruct-plugin", "plugin")
74                  .executeInstall();
75      }
76  
77      @Before
78      public void dummyDep() {
79          classifierOfDummyDependency = shutdownMavenMethod + shutdownSurefireMethod;
80          unpack("surefire-946-dummy-dependency", classifierOfDummyDependency)
81                  .sysProp("distinct.classifier", classifierOfDummyDependency)
82                  .executeInstall();
83      }
84  
85      @Test(timeout = 60_000)
86      public void test() throws Exception {
87          unpack("surefire-946-killMainProcessInReusableFork", "-" + shutdownMavenMethod + "-" + shutdownSurefireMethod)
88                  .sysProp("distinct.classifier", classifierOfDummyDependency)
89                  .sysProp("surefire.shutdown", shutdownSurefireMethod)
90                  .sysProp("selfdestruct.timeoutInMillis", "20000")
91                  .sysProp("selfdestruct.method", shutdownMavenMethod)
92                  .sysProp("testSleepTime", String.valueOf(TEST_SLEEP_TIME))
93                  .addGoal("org.apache.maven.plugins.surefire:maven-selfdestruct-plugin:selfdestruct")
94                  .setForkJvm()
95                  .forkPerThread(1)
96                  .maven()
97                  .withFailure()
98                  .executeTest();
99  
100         XPathFactory xpathFactory = XPathFactory.newInstance();
101         XPath xpath = xpathFactory.newXPath();
102         File settings = new File(System.getProperty("maven.settings.file")).getCanonicalFile();
103         Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(settings);
104         String localRepository = xpath.evaluate("/settings/localRepository", doc);
105         assertThat(localRepository).isNotNull().isNotEmpty();
106 
107         File dep = new File(
108                 localRepository,
109                 "org/apache/maven/plugins/surefire/surefire-946-dummy-dependency/0.1/"
110                         + "surefire-946-dummy-dependency-0.1-" + classifierOfDummyDependency + ".jar");
111 
112         assertThat(dep).exists();
113 
114         boolean deleted;
115         int iterations = 0;
116         do {
117             Thread.sleep(1_000L);
118             deleted = dep.delete();
119         } while (!deleted && ++iterations < 10);
120         assertThat(deleted).isTrue();
121     }
122 }