/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.trans.steps.systemdata;
import static org.junit.Assert.assertEquals;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.steps.loadsave.LoadSaveTester;
import org.pentaho.di.trans.steps.loadsave.initializer.InitializerInterface;
import org.pentaho.di.trans.steps.loadsave.validator.ArrayLoadSaveValidator;
import org.pentaho.di.trans.steps.loadsave.validator.FieldLoadSaveValidator;
import org.pentaho.di.trans.steps.loadsave.validator.StringLoadSaveValidator;
import org.pentaho.metastore.api.IMetaStore;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
/**
* User: Dzmitry Stsiapanau Date: 1/20/14 Time: 3:04 PM
*/
public class SystemDataMetaTest implements InitializerInterface<StepMetaInterface> {
LoadSaveTester loadSaveTester;
Class<SystemDataMeta> testMetaClass = SystemDataMeta.class;
SystemDataMeta expectedSystemDataMeta;
String expectedXML = " <fields>\n" + " <field>\n" + " <name>hostname_real</name>\n"
+ " <type>Hostname real</type>\n" + " </field>\n" + " <field>\n"
+ " <name>hostname</name>\n" + " <type>Hostname</type>\n" + " </field>\n"
+ " </fields>\n";
@Before
public void setUp() throws Exception {
expectedSystemDataMeta = new SystemDataMeta();
expectedSystemDataMeta.allocate( 2 );
String[] names = expectedSystemDataMeta.getFieldName();
SystemDataTypes[] types = expectedSystemDataMeta.getFieldType();
names[0] = "hostname_real";
names[1] = "hostname";
types[0] = SystemDataMeta.getType( SystemDataMeta.getTypeDesc( SystemDataTypes.TYPE_SYSTEM_INFO_HOSTNAME_REAL ) );
types[1] = SystemDataMeta.getType( SystemDataMeta.getTypeDesc( SystemDataTypes.TYPE_SYSTEM_INFO_HOSTNAME ) );
}
@After
public void tearDown() throws Exception {
}
@Test
public void testLoadXML() throws Exception {
SystemDataMeta systemDataMeta = new SystemDataMeta();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse( new InputSource( new StringReader( expectedXML ) ) );
Node node = document;
IMetaStore store = null;
systemDataMeta.loadXML( node, null, store );
assertEquals( expectedSystemDataMeta, systemDataMeta );
}
@Test
public void testGetXML() throws Exception {
String generatedXML = expectedSystemDataMeta.getXML();
assertEquals( expectedXML.replaceAll( "\n", "" ).replaceAll( "\r", "" ), generatedXML.replaceAll( "\n", "" )
.replaceAll( "\r", "" ) );
}
@Before
public void setUpLoadSave() throws Exception {
KettleEnvironment.init();
PluginRegistry.init( true );
List<String> attributes =
Arrays.asList( "fieldName", "fieldType" );
Map<String, String> getterMap = new HashMap<String, String>() {
{
put( "fieldName", "getFieldName" );
put( "fieldType", "getFieldType" );
}
};
Map<String, String> setterMap = new HashMap<String, String>() {
{
put( "fieldName", "setFieldName" );
put( "fieldType", "setFieldType" );
}
};
FieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator =
new ArrayLoadSaveValidator<String>( new StringLoadSaveValidator(), 5 );
FieldLoadSaveValidator<SystemDataTypes[]> sdtArrayLoadSaveValidator =
new ArrayLoadSaveValidator<SystemDataTypes>( new SystemDataTypesLoadSaveValidator(), 5 );
Map<String, FieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>();
attrValidatorMap.put( "fieldName", stringArrayLoadSaveValidator );
attrValidatorMap.put( "fieldType", sdtArrayLoadSaveValidator );
Map<String, FieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>();
loadSaveTester =
new LoadSaveTester( testMetaClass, attributes, new ArrayList<String>(), new ArrayList<String>(),
getterMap, setterMap, attrValidatorMap, typeValidatorMap, this );
}
// Call the allocate method on the LoadSaveTester meta class
@Override
public void modify( StepMetaInterface someMeta ) {
if ( someMeta instanceof SystemDataMeta ) {
( (SystemDataMeta) someMeta ).allocate( 5 );
}
}
@Test
public void testSerialization() throws KettleException {
loadSaveTester.testSerialization();
}
public class SystemDataTypesLoadSaveValidator implements FieldLoadSaveValidator<SystemDataTypes> {
final Random rand = new Random();
@Override
public SystemDataTypes getTestObject() {
SystemDataTypes[] allTypes = SystemDataTypes.values();
return allTypes[rand.nextInt( allTypes.length )];
}
@Override
public boolean validateTestObject( SystemDataTypes testObject, Object actual ) {
if ( !( actual instanceof SystemDataTypes ) ) {
return false;
}
SystemDataTypes actualInput = (SystemDataTypes) actual;
return ( testObject.toString().equals( actualInput.toString() ) );
}
}
}