blob: c504e04d9d78d444d4ad1576cb7e81715b165311 [file] [log] [blame]
package org.apache.maven.surefire.booter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import static java.io.File.separator;
import static org.apache.maven.surefire.shared.lang3.JavaVersion.JAVA_9;
import static org.apache.maven.surefire.shared.lang3.JavaVersion.JAVA_RECENT;
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_FREE_BSD;
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_LINUX;
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_NET_BSD;
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_OPEN_BSD;
import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assume.assumeTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import static org.powermock.reflect.Whitebox.invokeMethod;
/**
* Test of {@link SystemUtils}.
*
* @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
* @since 2.20.1
*/
@SuppressWarnings( "checkstyle:magicnumber" )
@RunWith( Enclosed.class )
public class SystemUtilsTest
{
/**
*
*/
public static class PlainUnitTests
{
@Test
public void shouldMatchJavaSpecVersion() throws Exception
{
BigDecimal actual = invokeMethod( SystemUtils.class, "getJavaSpecificationVersion" );
BigDecimal expected =
new BigDecimal( System.getProperty( "java.specification.version" ) ).stripTrailingZeros();
assertThat( actual ).isEqualTo( expected );
assertThat( SystemUtils.JAVA_SPECIFICATION_VERSION ).isEqualTo( expected );
}
@Test
public void shouldParseProprietaryReleaseFile() throws IOException
{
String classes = new File( "." ).getCanonicalPath() + separator + "target" + separator + "test-classes";
File path = new File( classes, "jdk8-IBM" + separator + "bin" + separator + "java" );
assertThat( SystemUtils.isJava9AtLeast( path.getAbsolutePath() ) ).isFalse();
path = new File( classes, "jdk8-oracle" + separator + "bin" + separator + "java" );
assertThat( SystemUtils.isJava9AtLeast( path.getAbsolutePath() ) ).isFalse();
path = new File( classes, "jdk9-oracle" + separator + "bin" + separator + "java" );
assertThat( SystemUtils.isJava9AtLeast( path.getAbsolutePath() ) ).isTrue();
}
@Test
public void incorrectJdkPath()
{
File jre = new File( System.getProperty( "java.home" ) );
File jdk = jre.getParentFile();
File incorrect = jdk.getParentFile();
assertThat( SystemUtils.isJava9AtLeast( incorrect.getAbsolutePath() ) ).isFalse();
}
@Test
public void shouldHaveJavaPath()
{
String javaPath = System.getProperty( "java.home" ) + separator + "bin" + separator + "java";
assertThat( SystemUtils.endsWithJavaPath( javaPath ) ).isTrue();
}
@Test
public void shouldNotHaveJavaPath()
{
assertThat( SystemUtils.endsWithJavaPath( "/jdk" ) ).isFalse();
}
@Test
public void shouldNotExtractJdkHomeFromJavaExec()
{
File pathToJdk = SystemUtils.toJdkHomeFromJvmExec( "/jdk/binx/java" );
assertThat( pathToJdk ).isNull();
}
@Test
public void shouldExtractJdkHomeFromJavaExec()
{
File pathToJdk = SystemUtils.toJdkHomeFromJvmExec( "/jdk/bin/java" );
assertThat( pathToJdk ).isEqualTo( new File( "/jdk" ).getAbsoluteFile() );
}
@Test
public void shouldNotExtractJdkHomeFromJreExec() throws IOException
{
String classes = new File( "." ).getCanonicalPath() + separator + "target" + separator + "test-classes";
File jdk = new File( classes, "jdk" );
String pathToJreExec = jdk.getAbsolutePath() + separator + "jre" + separator + "binx" + separator + "java";
File pathToJdk = SystemUtils.toJdkHomeFromJvmExec( pathToJreExec );
assertThat( pathToJdk ).isNull();
}
@Test
public void shouldExtractJdkHomeFromJreExec() throws IOException
{
String classes = new File( "." ).getCanonicalPath() + separator + "target" + separator + "test-classes";
File jdk = new File( classes, "jdk" );
String pathToJreExec = jdk.getAbsolutePath() + separator + "jre" + separator + "bin" + separator + "java";
File pathToJdk = SystemUtils.toJdkHomeFromJvmExec( pathToJreExec );
assertThat( pathToJdk ).isEqualTo( jdk );
}
@Test
public void shouldExtractJdkHomeFromJre()
{
File pathToJdk = SystemUtils.toJdkHomeFromJre( "/jdk/jre" );
assertThat( pathToJdk ).isEqualTo( new File( "/jdk" ).getAbsoluteFile() );
}
@Test
public void shouldExtractJdkHomeFromJdk()
{
File pathToJdk = SystemUtils.toJdkHomeFromJre( "/jdk/" );
assertThat( pathToJdk ).isEqualTo( new File( "/jdk" ).getAbsoluteFile() );
}
@Test
public void shouldExtractJdkHomeFromRealPath()
{
File pathToJdk = SystemUtils.toJdkHomeFromJre();
if ( JAVA_RECENT.atLeast( JAVA_9 ) )
{
File realJdkHome = new File( System.getProperty( "java.home" ) ).getAbsoluteFile();
assertThat( realJdkHome ).isDirectory();
assertThat( realJdkHome.getName() ).isNotEqualTo( "jre" );
assertThat( pathToJdk ).isEqualTo( realJdkHome );
}
else
{
File realJreHome = new File( System.getProperty( "java.home" ) ).getAbsoluteFile();
assertThat( realJreHome ).isDirectory();
assertThat( realJreHome.getName() ).isEqualTo( "jre" );
File realJdkHome = realJreHome.getParentFile();
assertThat( pathToJdk ).isEqualTo( realJdkHome );
}
}
@Test
public void shouldBeJavaVersion()
{
assertThat( SystemUtils.isJava9AtLeast( (BigDecimal ) null ) ).isFalse();
assertThat( SystemUtils.isJava9AtLeast( new BigDecimal( "1.8" ) ) ).isFalse();
assertThat( SystemUtils.isJava9AtLeast( new BigDecimal( 9 ) ) ).isTrue();
}
@Test
public void shouldBePlatformClassLoader()
{
ClassLoader cl = SystemUtils.platformClassLoader();
if ( JAVA_RECENT.atLeast( JAVA_9 ) )
{
assertThat( cl ).isNotNull();
}
else
{
assertThat( cl ).isNull();
}
}
@Test
public void shouldNotFindClassLoader()
{
ClassLoader cl = SystemUtils.reflectClassLoader( getClass(), "_getPlatformClassLoader_" );
assertThat( cl ).isNull();
}
@Test
public void shouldFindClassLoader()
{
ClassLoader cl = SystemUtils.reflectClassLoader( getClass(), "getPlatformClassLoader" );
assertThat( cl ).isSameAs( ClassLoader.getSystemClassLoader() );
}
@Test
public void shouldBePidOnJigsaw()
{
assumeTrue( JAVA_RECENT.atLeast( JAVA_9 ) );
Long actualPid = SystemUtils.pidOnJava9();
String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
assertThat( actualPid + "" )
.isEqualTo( expectedPid );
}
@Test
public void shouldBePidStatusOnLinux() throws Exception
{
assumeTrue( IS_OS_LINUX );
Long actualPid = SystemUtils.pidStatusOnLinux();
String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
assertThat( actualPid + "" )
.isEqualTo( expectedPid );
}
@Test
public void shouldBeMockPidStatusOnLinux() throws Exception
{
String root = new File( System.getProperty( "user.dir" ), "target/test-classes" ).getAbsolutePath();
Long actualPid = SystemUtils.pidStatusOnLinux( root );
assertThat( actualPid )
.isEqualTo( 48982L );
}
@Test
public void shouldBePidStatusOnBSD() throws Exception
{
assumeTrue( IS_OS_FREE_BSD || IS_OS_NET_BSD || IS_OS_OPEN_BSD );
Long actualPid = SystemUtils.pidStatusOnBSD();
String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
assertThat( actualPid + "" )
.isEqualTo( expectedPid );
}
@Test
public void shouldBeMockPidStatusOnBSD() throws Exception
{
String root = new File( System.getProperty( "user.dir" ), "target/test-classes" ).getAbsolutePath();
Long actualPid = SystemUtils.pidStatusOnBSD( root );
assertThat( actualPid )
.isEqualTo( 60424L );
}
@Test
public void shouldBePidOnJMX()
{
Long actualPid = SystemUtils.pidOnJMX();
String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
assertThat( actualPid + "" )
.isEqualTo( expectedPid );
}
@Test
public void shouldBePid()
{
Long actualPid = SystemUtils.pid();
String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
assertThat( actualPid + "" )
.isEqualTo( expectedPid );
}
@SuppressWarnings( "unused" )
public static ClassLoader getPlatformClassLoader()
{
return ClassLoader.getSystemClassLoader();
}
}
/**
*
*/
@RunWith( PowerMockRunner.class )
@PrepareForTest( SystemUtils.class )
@PowerMockIgnore( { "org.jacoco.agent.rt.*", "com.vladium.emma.rt.*" } )
public static class MockTest
{
@Test
public void shouldBeDifferentJdk9()
{
testIsJava9AtLeast( new File( System.getProperty( "java.home" ) ) );
}
@Test
public void shouldBeSameJdk9()
{
// PowerMockJUnit44RunnerDelegateImpl does not work with Assumptions: assumeFalse
if ( !JAVA_RECENT.atLeast( JAVA_9 ) )
{
testIsJava9AtLeast( new File( System.getProperty( "java.home" ) ).getParentFile() );
}
}
private static void testIsJava9AtLeast( File pathInJdk )
{
File path = new File( pathInJdk, "bin" + separator + "java" );
mockStatic( SystemUtils.class );
when( SystemUtils.isJava9AtLeast( anyString() ) )
.thenCallRealMethod();
when( SystemUtils.toJdkHomeFromJvmExec( anyString() ) )
.thenCallRealMethod();
when( SystemUtils.toJdkHomeFromJre() )
.thenCallRealMethod();
when( SystemUtils.toJdkHomeFromJre( anyString() ) )
.thenCallRealMethod();
when( SystemUtils.isBuiltInJava9AtLeast() )
.thenCallRealMethod();
when( SystemUtils.toJdkVersionFromReleaseFile( any( File.class ) ) )
.thenCallRealMethod();
when( SystemUtils.isJava9AtLeast( any( BigDecimal.class ) ) )
.thenCallRealMethod();
if ( JAVA_RECENT.atLeast( JAVA_9 ) )
{
assertThat( SystemUtils.isJava9AtLeast( path.getAbsolutePath() ) ).isTrue();
}
else
{
assertThat( SystemUtils.isJava9AtLeast( path.getAbsolutePath() ) ).isFalse();
}
verifyStatic( SystemUtils.class, times( 0 ) );
SystemUtils.toJdkVersionFromReleaseFile( any( File.class ) );
verifyStatic( SystemUtils.class, times( 1 ) );
SystemUtils.isBuiltInJava9AtLeast();
}
}
}