View Javadoc
1   package org.apache.maven.surefire.booter;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.junit.Test;
23  
24  import java.io.File;
25  import java.lang.management.ManagementFactory;
26  import java.util.regex.Matcher;
27  
28  import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX;
29  import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS;
30  import static org.fest.assertions.Assertions.assertThat;
31  import static org.hamcrest.CoreMatchers.is;
32  import static org.hamcrest.CoreMatchers.not;
33  import static org.hamcrest.CoreMatchers.notNullValue;
34  import static org.junit.Assume.assumeThat;
35  import static org.junit.Assume.assumeTrue;
36  import static org.powermock.reflect.Whitebox.invokeMethod;
37  
38  /**
39   * Testing {@link PpidChecker} on a platform.
40   *
41   * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
42   * @since 2.20.1
43   */
44  public class PpidCheckerTest
45  {
46      @Test
47      public void shouldHavePpidAsWindows()
48      {
49          assumeTrue( IS_OS_WINDOWS );
50  
51          long expectedPid = Long.parseLong( ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim() );
52  
53          PpidChecker checker = new PpidChecker( expectedPid );
54          ProcessInfo processInfo = checker.windows();
55  
56          assertThat( processInfo )
57                  .isNotNull();
58  
59          assertThat( checker.canUse() )
60                  .isTrue();
61  
62          assertThat( checker.isProcessAlive() )
63                  .isTrue();
64  
65          assertThat( processInfo.getPID() )
66                  .isEqualTo( expectedPid );
67  
68          assertThat( processInfo.getTime() )
69                  .isNotNull();
70      }
71  
72      @Test
73      public void shouldHavePpidAsUnix()
74      {
75          assumeTrue( IS_OS_UNIX );
76  
77          assertThat( PpidChecker.canExecuteUnixPs() )
78                  .as( "Surefire should be tested on real box OS, e.g. Ubuntu or FreeBSD." )
79                  .isTrue();
80  
81          long expectedPid = Long.parseLong( ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim() );
82  
83          PpidChecker checker = new PpidChecker( expectedPid );
84          ProcessInfo processInfo = checker.unix();
85  
86          assertThat( processInfo )
87                  .isNotNull();
88  
89          assertThat( checker.canUse() )
90                  .isTrue();
91  
92          assertThat( checker.isProcessAlive() )
93                  .isTrue();
94  
95          assertThat( processInfo.getPID() )
96                  .isEqualTo( expectedPid );
97  
98          assertThat( processInfo.getTime() )
99                  .isNotNull();
100     }
101 
102     @Test
103     public void shouldNotFindSuchPID()
104     {
105         PpidChecker checker = new PpidChecker( 1000000L );
106         assertThat( checker.canUse() )
107                 .isTrue();
108 
109         boolean isAlive = checker.isProcessAlive();
110 
111         assertThat( isAlive )
112                 .isFalse();
113     }
114 
115     @Test
116     public void shouldParseEtime()
117     {
118         Matcher m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "38" );
119         assertThat( m.matches() )
120                 .isFalse();
121 
122         m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "05:38" );
123         assertThat( m.matches() )
124                 .isTrue();
125         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
126         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 0L );
127         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
128         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
129 
130         m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "00:05:38" );
131         assertThat( m.matches() )
132                 .isTrue();
133         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
134         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 0L );
135         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
136         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
137 
138         m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "01:05:38" );
139         assertThat( m.matches() )
140                 .isTrue();
141         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
142         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
143         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
144         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
145 
146         m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-01:05:38" );
147         assertThat( m.matches() )
148                 .isTrue();
149         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 2 * 24 * 3600L );
150         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
151         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
152         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
153 
154         m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-1:5:3" );
155         assertThat( m.matches() )
156                 .isTrue();
157         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 2 * 24 * 3600L );
158         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
159         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
160         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 3L );
161     }
162 
163     @Test
164     public void shouldHaveSystemPathToWmicOnWindows() throws Exception
165     {
166         assumeTrue( IS_OS_WINDOWS );
167         assumeThat( System.getenv( "SystemRoot" ), is( notNullValue() ) );
168         assumeThat( System.getenv( "SystemRoot" ), is( not( "" ) ) );
169         assumeTrue( new File( System.getenv( "SystemRoot" ), "System32\\Wbem" ).isDirectory() );
170         assumeTrue( new File( System.getenv( "SystemRoot" ), "System32\\Wbem\\wmic.exe" ).isFile() );
171         assertThat( (Boolean) invokeMethod( PpidChecker.class, "hasWmicStandardSystemPath" ) ).isTrue();
172         assertThat( new File( System.getenv( "SystemRoot" ), "System32\\Wbem\\wmic.exe" ) ).isFile();
173     }
174 }