/*******************************************************************************
*
* Pentaho Big Data
*
* Copyright (C) 2002-2015 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.hadoop.shim.api;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.hadoop.shim.api.ShimProperties.ListOverrideType;
import org.pentaho.hadoop.shim.api.ShimProperties.SetOverrideType;
import org.pentaho.hadoop.shim.api.ShimProperties.WindowsChecker;
public class ShimPropertiesTest {
private ShimProperties shimProperties;
private WindowsChecker windowsChecker;
@Before
public void setup() {
windowsChecker = mock( WindowsChecker.class );
shimProperties = new ShimProperties( windowsChecker );
}
private String join( String delim, Collection<String> collection ) {
StringBuilder stringBuilder = new StringBuilder();
for ( String string : collection ) {
stringBuilder.append( string );
stringBuilder.append( "," );
}
if ( stringBuilder.length() > 0 ) {
stringBuilder.setLength( stringBuilder.length() - 1 );
}
return stringBuilder.toString();
}
@Test
public void testGetConfigSetReplaceWithNoShimConfig() {
Set<String> rootConfig = new HashSet<String>( Arrays.asList( "one", "b", "iii" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
assertEquals( rootConfig, shimProperties.getConfigSet( "propName", SetOverrideType.REPLACE ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( rootConfig, shimProperties.getConfigSet( "propName", SetOverrideType.REPLACE ) );
}
@Test
public void testGetConfigSetReplaceWithShimConfig() {
Set<String> rootConfig = new HashSet<String>( Arrays.asList( "one", "b", "iii" ) );
Set<String> shimConfig = new HashSet<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigSet( "propName", SetOverrideType.REPLACE ) );
}
@Test
public void testGetConfigSetReplaceWithNoRootConfig() {
Set<String> shimConfig = new HashSet<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
assertEquals( new HashSet<String>(), shimProperties.getConfigSet( "propName", SetOverrideType.REPLACE ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigSet( "propName", SetOverrideType.REPLACE ) );
}
@Test
public void testGetConfigSetOverlayWithNoShimConfig() {
Set<String> rootConfig = new HashSet<String>( Arrays.asList( "one", "b", "iii" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
assertEquals( rootConfig, shimProperties.getConfigSet( "propName", SetOverrideType.OVERLAY ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( rootConfig, shimProperties.getConfigSet( "propName", SetOverrideType.OVERLAY ) );
}
@Test
public void testGetConfigSetOverlayWithShimConfig() {
Set<String> rootConfig = new HashSet<String>( Arrays.asList( "one", "b", "iii" ) );
Set<String> shimConfig = new HashSet<String>( Arrays.asList( "1", "two", "tres" ) );
Set<String> combinedConfig = new HashSet<String>( rootConfig );
combinedConfig.addAll( shimConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( combinedConfig, shimProperties.getConfigSet( "propName", SetOverrideType.OVERLAY ) );
}
@Test
public void testGetConfigSetOverlayWithNoRootConfig() {
Set<String> shimConfig = new HashSet<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
assertEquals( new HashSet<String>(), shimProperties.getConfigSet( "propName", SetOverrideType.OVERLAY ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigSet( "propName", SetOverrideType.OVERLAY ) );
}
@Test
public void testGetConfigSetDefaultsToOverlay() {
Set<String> rootConfig = new HashSet<String>( Arrays.asList( "one", "b", "iii" ) );
Set<String> shimConfig = new HashSet<String>( Arrays.asList( "1", "two", "tres" ) );
Set<String> combinedConfig = new HashSet<String>( rootConfig );
combinedConfig.addAll( shimConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( combinedConfig, shimProperties.getConfigSet( "propName" ) );
}
@Test
public void testGetConfigListReplaceWithNoShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
}
@Test
public void testGetConfigListReplaceWithShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
}
@Test
public void testGetConfigListReplaceWith2ShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> shimConfig2 = new ArrayList<String>( Arrays.asList( "3", "cee", "p", "o" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( "hbase.propName", join( ",", shimConfig2 ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1,hbase" );
assertEquals( shimConfig2, shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
}
@Test
public void testGetConfigListReplaceWithNoRootConfig() {
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
assertEquals( new ArrayList<String>(), shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigList( "propName", ListOverrideType.REPLACE ) );
}
@Test
public void testGetConfigListAppendWithNoShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
}
@Test
public void testGetConfigListAppendWithShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> combinedList = new ArrayList<String>( rootConfig );
combinedList.addAll( shimConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( combinedList, shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
}
@Test
public void testGetConfigListAppendWith2ShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> shimConfig2 = new ArrayList<String>( Arrays.asList( "3", "cee", "p", "o" ) );
List<String> combinedList = new ArrayList<String>( rootConfig );
combinedList.addAll( shimConfig );
combinedList.addAll( shimConfig2 );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( "hbase.propName", join( ",", shimConfig2 ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1,hbase" );
assertEquals( combinedList, shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
}
@Test
public void testGetConfigListAppendWithNoRootConfig() {
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
assertEquals( new ArrayList<String>(), shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigList( "propName", ListOverrideType.APPEND ) );
}
@Test
public void testGetConfigListPrependWithNoShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( rootConfig, shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
}
@Test
public void testGetConfigListPrependWithShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> combinedList = new ArrayList<String>( shimConfig );
combinedList.addAll( rootConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( combinedList, shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
}
@Test
public void testGetConfigListPrependWith2ShimConfig() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> shimConfig2 = new ArrayList<String>( Arrays.asList( "3", "cee", "p", "o" ) );
List<String> combinedList = new ArrayList<String>( shimConfig2 );
combinedList.addAll( shimConfig );
combinedList.addAll( rootConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( "hbase.propName", join( ",", shimConfig2 ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1,hbase" );
assertEquals( combinedList, shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
}
@Test
public void testGetConfigListPrependWithNoRootConfig() {
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
assertEquals( new ArrayList<String>(), shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( shimConfig, shimProperties.getConfigList( "propName", ListOverrideType.PREPEND ) );
}
@Test
public void testGetConfigListDefaultsToAppend() {
List<String> rootConfig = new ArrayList<String>( Arrays.asList( "one", "b", "iii" ) );
List<String> shimConfig = new ArrayList<String>( Arrays.asList( "1", "two", "tres" ) );
List<String> combinedList = new ArrayList<String>( rootConfig );
combinedList.addAll( shimConfig );
shimProperties.setProperty( "propName", join( ",", rootConfig ) );
shimProperties.setProperty( "mr1.propName", join( ",", shimConfig ) );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( combinedList, shimProperties.getConfigList( "propName" ) );
}
@Test
public void testGetPrefixedPropertiesNoShimConfig() {
shimProperties.setProperty( "java.system.flatclass", "false" );
assertEquals( "false", shimProperties.getPrefixedProperties( "java.system" ).get( "flatclass" ) );
}
@Test
public void testGetPrefixedPropertiesShimConfig() {
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "mr1.java.system.flatclass", "true" );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( "true", shimProperties.getPrefixedProperties( "java.system" ).get( "flatclass" ) );
}
@Test
public void testGetPrefixedProperties2ShimConfig() {
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "mr1.java.system.flatclass", "true" );
shimProperties.setProperty( "hbase.java.system.flatclass", "green" );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1,hbase" );
assertEquals( "green", shimProperties.getPrefixedProperties( "java.system" ).get( "flatclass" ) );
}
@Test
public void testGetPrefixedOsPropertiesWindowsShimConfig() {
when( windowsChecker.isWindows() ).thenReturn( true );
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "windows.java.system.flatclass", "true" );
assertEquals( "true", shimProperties.getPrefixedProperties( "java.system" ).get( "flatclass" ) );
}
@Test
public void testGetPrefixedOsPropertiesLinuxShimConfigFallback() {
when( windowsChecker.isWindows() ).thenReturn( false );
shimProperties.setProperty( "java.system.flatclass", "true" );
assertEquals( "true", shimProperties.getProperty( "java.system.flatclass", "false" ) );
}
@Test
public void testGetPrefixedOsPropertiesLinuxShimConfigNoBase() {
when( windowsChecker.isWindows() ).thenReturn( false );
shimProperties.setProperty( "linux.java.system.flatclass", "true" );
assertEquals( "true", shimProperties.getProperty( "java.system.flatclass", "false" ) );
}
@Test
public void testGetPrefixedOsPropertiesLinuxShimConfig() {
when( windowsChecker.isWindows() ).thenReturn( false );
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "linux.java.system.flatclass", "true" );
assertEquals( "true", shimProperties.getProperty( "java.system.flatclass" ) );
}
@Test
public void testGetPrefixedOsPropertiesWindowsShimConfigTrumpedBySetConfig() {
when( windowsChecker.isWindows() ).thenReturn( true );
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "windows.java.system.flatclass", "false" );
shimProperties.setProperty( "mr1.java.system.flatclass", "true" );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( "true", shimProperties.getProperty( "java.system.flatclass" ) );
}
@Test
public void testGetPrefixedOsPropertiesWindowsAndShimConfigTrumpsWindowsConfig() {
when( windowsChecker.isWindows() ).thenReturn( true );
shimProperties.setProperty( "java.system.flatclass", "false" );
shimProperties.setProperty( "windows.java.system.flatclass", "false" );
shimProperties.setProperty( "mr1.java.system.flatclass", "false" );
shimProperties.setProperty( "windows.mr1.java.system.flatclass", "true" );
shimProperties.setProperty( ShimProperties.SHIM_CP_CONFIG, "mr1" );
assertEquals( "true", shimProperties.getProperty( "java.system.flatclass" ) );
}
}