/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed 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.
*
******************************************************************************/
package org.pentaho.di.version;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.junit.Before;
import org.junit.Test;
public class BuildVersionUnitTest {
private EnvironmentVariableGetter mockEnvironmentVariableGetter;
private ManifestGetter mockManifestGetter;
private void setNewMocks() {
mockEnvironmentVariableGetter = mock( EnvironmentVariableGetter.class );
mockManifestGetter = mock( ManifestGetter.class );
BuildVersion.environmentVariableGetter = mockEnvironmentVariableGetter;
BuildVersion.manifestGetter = mockManifestGetter;
}
@Before
public void setup() {
// This is to clear state between each run, init mocks
setNewMocks();
BuildVersion.refreshInstance();
setNewMocks();
}
private void initManifestGetter( String version, String revision, String date, String user ) {
Manifest manifest = mock( Manifest.class );
try {
when( mockManifestGetter.getManifest() ).thenReturn( manifest );
} catch ( Exception e ) {
// wont happen
}
Attributes attributes = mock( Attributes.class );
when( manifest.getMainAttributes() ).thenReturn( attributes );
when( manifest.getMainAttributes().getValue( Attributes.Name.IMPLEMENTATION_VERSION ) ).thenReturn( version );
when( manifest.getMainAttributes().getValue( Attributes.Name.SPECIFICATION_VERSION ) ).thenReturn( revision );
when( manifest.getMainAttributes().getValue( "Compile-Timestamp" ) ).thenReturn( date );
when( manifest.getMainAttributes().getValue( "Compile-User" ) ).thenReturn( user );
}
private void initEnvironmentVariableGetter( String version, String revision, String date, String user ) {
try {
when( mockEnvironmentVariableGetter.getEnvVarible( BuildVersion.KETTLE_BUILD_VERSION ) ).thenReturn( version );
when( mockEnvironmentVariableGetter.getEnvVarible( BuildVersion.KETTLE_BUILD_REVISION ) ).thenReturn( revision );
when( mockEnvironmentVariableGetter.getEnvVarible( BuildVersion.KETTLE_BUILD_DATE ) ).thenReturn( date );
when( mockEnvironmentVariableGetter.getEnvVarible( BuildVersion.KETTLE_BUILD_USER ) ).thenReturn( user );
} catch ( Exception e ) {
// wont happen
}
}
@Test
public void testGetInstance() {
initManifestGetter( null, null, null, null ); // it's possible to have a manifest w/ no version, which causes an NPE
BuildVersion.refreshInstance();
BuildVersion version = BuildVersion.getInstance();
if ( version == null || version.getVersion() == null || version.getVersion().isEmpty() ) {
fail( "Unable to retrieve BuildVersion" );
}
initManifestGetter( "version", null, null, null );
BuildVersion.refreshInstance();
version = BuildVersion.getInstance();
if ( version == null || version.getVersion().isEmpty() ) {
fail( "Unable to retrieve BuildVersion" );
}
BuildVersion version2 = BuildVersion.getInstance();
if ( version2 != version ) {
fail( "Build version is required to be singleton" );
}
initManifestGetter( null, null, null, null ); // it's possible to have a manifest w/ no version, which causes an NPE
initEnvironmentVariableGetter( null, null, null, null ); // it's possible to have a manifest w/ no version, which
// causes an NPE
BuildVersion.refreshInstance();
version = BuildVersion.getInstance();
if ( version == null || version.getVersion() == null || version.getVersion().isEmpty() ) {
fail( "Unable to retrieve BuildVersion" );
}
initEnvironmentVariableGetter( "version", null, null, null ); // it's possible to have a manifest w/ no version,
// which causes an NPE
BuildVersion.refreshInstance();
version = BuildVersion.getInstance();
if ( version == null || version.getVersion().isEmpty() ) {
fail( "Unable to retrieve BuildVersion" );
}
version2 = BuildVersion.getInstance();
if ( version2 != version ) {
fail( "Build version is required to be singleton" );
}
}
@Test
public void testGetBuildDate() {
initManifestGetter( null, null, new Date().toString(), null );
BuildVersion.refreshInstance();
BuildVersion version = BuildVersion.getInstance();
String buildDate = version.getBuildDate();
if ( buildDate == null || buildDate.isEmpty() ) {
fail( "Unable to retrieve build date" );
}
}
@Test
public void testGetBuildDateAsLocalDate() {
SimpleDateFormat sdf = new SimpleDateFormat( BuildVersion.JAR_BUILD_DATE_FORMAT );
initManifestGetter( null, null, sdf.format( new Date() ), null );
BuildVersion.refreshInstance();
BuildVersion version = BuildVersion.getInstance();
Date buildDate = version.getBuildDateAsLocalDate();
if ( buildDate == null ) {
fail( "Unable to retrieve build date as Local date" );
}
}
private static String buildDateTestString = "2014-12-13 10.20.30";
private static String buildDateFailString = "this better fail!";
@Test
public void testSetBuildDate() {
BuildVersion version = BuildVersion.getInstance();
// since this is a singleton, preserve the initial
try {
version.setBuildDate( buildDateTestString );
} catch ( Exception ex ) {
fail( "Error setting valid date" );
}
String newDate = version.getBuildDate();
if ( newDate != buildDateTestString ) {
fail( "Error setting build date" );
}
SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH.mm.ss" );
try {
Date newDateAsDate = version.getBuildDateAsLocalDate();
Date buildDateTestDate = formatter.parse( buildDateTestString );
if ( !newDateAsDate.equals( buildDateTestDate ) ) {
fail( "Date fields don't match: " + newDateAsDate + " -> " + buildDateTestDate );
}
} catch ( Exception ex ) {
fail( "Exception parsing fields : " + ex.getMessage() );
}
// try to set a bogus date...
boolean bogusGotException = false;
try {
version.setBuildDate( buildDateFailString );
fail( "Should have gotten exception setting invalid date." );
} catch ( Exception ex ) {
bogusGotException = true; // we SHOULD get here...
}
if ( !bogusGotException ) {
fail( "Should have gotten exception setting invalid date." );
}
// make sure it's still the previous set...
String stillGood = version.getBuildDate();
if ( stillGood == null || !stillGood.equals( buildDateTestString ) ) {
fail( "Failed setting date to invalid date - but left date as invalid." );
}
}
@Test
public void testGetVersion() {
BuildVersion version = BuildVersion.getInstance();
String buildversion = version.getVersion();
if ( buildversion != BuildVersion.getInstance().getVersion() ) {
fail( "Unexpected version number found." );
}
}
private static String testVersionString = "Unit Test Version";
@Test
public void testSetVersion() {
BuildVersion version = BuildVersion.getInstance();
version.setVersion( testVersionString );
String newVersion = version.getVersion();
if ( newVersion == null || !newVersion.equals( testVersionString ) ) {
fail( "Unable to set version" );
}
}
@Test
public void testGetRevision() {
initEnvironmentVariableGetter( "version", "revision", new Date().toString(), "user" );
BuildVersion.refreshInstance();
BuildVersion version = BuildVersion.getInstance();
String revision = version.getRevision();
if ( !"revision".equals( revision ) ) {
fail( "Unexpected revsision found : " + revision );
}
}
private static String testRevisionString = "Unit Test Revision";
@Test
public void testSetRevision() {
BuildVersion version = BuildVersion.getInstance();
version.setRevision( testRevisionString );
String newRevision = version.getRevision();
if ( newRevision == null || !newRevision.equals( testRevisionString ) ) {
fail( "Error setting revision." );
}
}
@Test
public void testGetBuildUser() {
initManifestGetter( null, null, null, testUserString );
BuildVersion.refreshInstance();
BuildVersion version = BuildVersion.getInstance();
String buser = version.getBuildUser();
if ( buser == null || buser.isEmpty() ) {
fail( "Unable to retrieve user." );
}
}
private static String testUserString = "Unit Test User";
@Test
public void testSetBuildUser() {
BuildVersion version = BuildVersion.getInstance();
version.setBuildUser( testUserString );
String newUser = version.getBuildUser();
if ( newUser == null || !newUser.equals( testUserString ) ) {
fail( "Error setting build user" );
}
}
@Test
public void testInitFromManifest() {
String version = "manversion";
String revision = "manrevision";
String date = "mandate";
String user = "manuser";
initManifestGetter( version, revision, date, user );
BuildVersion.refreshInstance();
assertEquals( version, BuildVersion.getInstance().getVersion() );
assertEquals( revision, BuildVersion.getInstance().getRevision() );
assertEquals( date, BuildVersion.getInstance().getBuildDate() );
assertEquals( user, BuildVersion.getInstance().getBuildUser() );
}
@Test
public void testInitFromEnv() {
String version = "envversion";
String revision = "envrevision";
String date = "envdate";
String user = "envuser";
initEnvironmentVariableGetter( version, revision, date, user );
BuildVersion.refreshInstance();
assertEquals( version, BuildVersion.getInstance().getVersion() );
assertEquals( revision, BuildVersion.getInstance().getRevision() );
assertEquals( date, BuildVersion.getInstance().getBuildDate() );
assertEquals( user, BuildVersion.getInstance().getBuildUser() );
}
}