Java tutorial
/*! ****************************************************************************** * * 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.propertyinput; 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 java.util.UUID; import org.apache.commons.vfs2.FileContent; import org.apache.commons.vfs2.FileName; import org.apache.commons.vfs2.FileObject; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.fileinput.FileInputList; import org.pentaho.di.core.logging.LogChannelInterface; import org.pentaho.di.core.plugins.PluginRegistry; import org.pentaho.di.trans.step.BaseStep; 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 java.io.ByteArrayInputStream; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.Charset; public class PropertyInputMetaTest implements InitializerInterface<StepMetaInterface> { Class<PropertyInputMeta> testMetaClass = PropertyInputMeta.class; LoadSaveTester loadSaveTester; @Before public void setUp() throws Exception { KettleEnvironment.init(); PluginRegistry.init(true); List<String> attributes = Arrays.asList("encoding", "fileType", "includeFilename", "resetRowNumber", "resolvevaluevariable", "filenameField", "includeRowNumber", "rowNumberField", "rowLimit", "filefield", "isaddresult", "dynamicFilenameField", "includeIniSection", "iniSectionField", "section", "shortFileFieldName", "pathFieldName", "hiddenFieldName", "lastModificationTimeFieldName", "uriNameFieldName", "rootUriNameFieldName", "extensionFieldName", "sizeFieldName", "fileName", "fileMask", "excludeFileMask", "fileRequired", "includeSubFolders", "inputFields"); Map<String, String> getterMap = new HashMap<String, String>() { { put("encoding", "getEncoding"); put("fileType", "getFileType"); put("includeFilename", "includeFilename"); put("resetRowNumber", "resetRowNumber"); put("resolvevaluevariable", "isResolveValueVariable"); put("filenameField", "getFilenameField"); put("includeRowNumber", "includeRowNumber"); put("rowNumberField", "getRowNumberField"); put("rowLimit", "getRowLimit"); put("filefield", "isFileField"); put("isaddresult", "isAddResultFile"); put("dynamicFilenameField", "getDynamicFilenameField"); put("includeIniSection", "includeIniSection"); put("iniSectionField", "getINISectionField"); put("section", "getSection"); put("shortFileFieldName", "getShortFileNameField"); put("pathFieldName", "getPathField"); put("hiddenFieldName", "isHiddenField"); put("lastModificationTimeFieldName", "getLastModificationDateField"); put("uriNameFieldName", "getUriField"); put("rootUriNameFieldName", "getRootUriField"); put("extensionFieldName", "getExtensionField"); put("sizeFieldName", "getSizeField"); put("fileName", "getFileName"); put("fileMask", "getFileMask"); put("excludeFileMask", "getExcludeFileMask"); put("fileRequired", "getFileRequired"); put("includeSubFolders", "getIncludeSubFolders"); put("inputFields", "getInputFields"); } }; Map<String, String> setterMap = new HashMap<String, String>() { { put("encoding", "setEncoding"); put("fileType", "setFileType"); put("includeFilename", "setIncludeFilename"); put("resetRowNumber", "setResetRowNumber"); put("resolvevaluevariable", "setResolveValueVariable"); put("filenameField", "setFilenameField"); put("includeRowNumber", "setIncludeRowNumber"); put("rowNumberField", "setRowNumberField"); put("rowLimit", "setRowLimit"); put("filefield", "setFileField"); put("isaddresult", "setAddResultFile"); put("dynamicFilenameField", "setDynamicFilenameField"); put("includeIniSection", "setIncludeIniSection"); put("iniSectionField", "setINISectionField"); put("section", "setSection"); put("shortFileFieldName", "setShortFileNameField"); put("pathFieldName", "setPathField"); put("hiddenFieldName", "setIsHiddenField"); put("lastModificationTimeFieldName", "setLastModificationDateField"); put("uriNameFieldName", "setUriField"); put("rootUriNameFieldName", "setRootUriField"); put("extensionFieldName", "setExtensionField"); put("sizeFieldName", "setSizeField"); put("fileName", "setFileName"); put("fileMask", "setFileMask"); put("excludeFileMask", "setExcludeFileMask"); put("fileRequired", "setFileRequired"); put("includeSubFolders", "setIncludeSubFolders"); put("inputFields", "setInputFields"); } }; FieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator = new ArrayLoadSaveValidator<String>( new StringLoadSaveValidator(), 5); FieldLoadSaveValidator<PropertyInputField[]> pifArrayLoadSaveValidator = new ArrayLoadSaveValidator<PropertyInputField>( new PropertyInputFieldLoadSaveValidator(), 5); Map<String, FieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); attrValidatorMap.put("fileName", stringArrayLoadSaveValidator); attrValidatorMap.put("fileMask", stringArrayLoadSaveValidator); attrValidatorMap.put("excludeFileMask", stringArrayLoadSaveValidator); attrValidatorMap.put("fileRequired", stringArrayLoadSaveValidator); attrValidatorMap.put("includeSubFolders", stringArrayLoadSaveValidator); attrValidatorMap.put("inputFields", pifArrayLoadSaveValidator); Map<String, FieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); // typeValidatorMap.put( int[].class.getCanonicalName(), new PrimitiveIntArrayLoadSaveValidator( new IntLoadSaveValidator(), 1 ) ); 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 public void modify(StepMetaInterface propInputMeta) { if (propInputMeta instanceof PropertyInputMeta) { ((PropertyInputMeta) propInputMeta).allocate(5, 5); } } @Test public void testSerialization() throws KettleException { loadSaveTester.testSerialization(); } //PropertyInputField public class PropertyInputFieldLoadSaveValidator implements FieldLoadSaveValidator<PropertyInputField> { final Random rand = new Random(); @Override public PropertyInputField getTestObject() { PropertyInputField rtn = new PropertyInputField(); rtn.setCurrencySymbol(UUID.randomUUID().toString()); rtn.setDecimalSymbol(UUID.randomUUID().toString()); rtn.setFormat(UUID.randomUUID().toString()); rtn.setGroupSymbol(UUID.randomUUID().toString()); rtn.setName(UUID.randomUUID().toString()); rtn.setTrimType(rand.nextInt(4)); rtn.setPrecision(rand.nextInt(9)); rtn.setRepeated(rand.nextBoolean()); rtn.setLength(rand.nextInt(50)); rtn.setSamples(new String[] { UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString() }); return rtn; } @Override public boolean validateTestObject(PropertyInputField testObject, Object actual) { if (!(actual instanceof PropertyInputField)) { return false; } PropertyInputField actualInput = (PropertyInputField) actual; return (testObject.toString().equals(actualInput.toString())); } } @Test public void testOpenNextFile() throws Exception { PropertyInputMeta propertyInputMeta = Mockito.mock(PropertyInputMeta.class); PropertyInputData propertyInputData = new PropertyInputData(); FileInputList fileInputList = new FileInputList(); FileObject fileObject = Mockito.mock(FileObject.class); FileName fileName = Mockito.mock(FileName.class); Mockito.when(fileName.getRootURI()).thenReturn("testFolder"); Mockito.when(fileName.getURI()).thenReturn("testFileName.ini"); String header = "test ini data with umlauts"; String key = "key"; String testValue = "value-with-"; String testData = "[" + header + "]\r\n" + key + "=" + testValue; String charsetEncode = "Windows-1252"; InputStream inputStream = new ByteArrayInputStream(testData.getBytes(Charset.forName(charsetEncode))); FileContent fileContent = Mockito.mock(FileContent.class); Mockito.when(fileObject.getContent()).thenReturn(fileContent); Mockito.when(fileContent.getInputStream()).thenReturn(inputStream); Mockito.when(fileObject.getName()).thenReturn(fileName); fileInputList.addFile(fileObject); propertyInputData.files = fileInputList; propertyInputData.propfiles = false; propertyInputData.realEncoding = charsetEncode; PropertyInput propertyInput = Mockito.mock(PropertyInput.class); Field logField = BaseStep.class.getDeclaredField("log"); logField.setAccessible(true); logField.set(propertyInput, Mockito.mock(LogChannelInterface.class)); Mockito.doCallRealMethod().when(propertyInput).dispose(propertyInputMeta, propertyInputData); propertyInput.dispose(propertyInputMeta, propertyInputData); Method method = PropertyInput.class.getDeclaredMethod("openNextFile"); method.setAccessible(true); method.invoke(propertyInput); Assert.assertEquals(testValue, propertyInputData.wini.get(header).get(key)); } }