/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2016 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.plugin.services.importer;
import com.sun.xml.bind.StringInputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.platform.api.mimetype.IMimeType;
import org.pentaho.platform.api.repository2.unified.Converter;
import org.pentaho.platform.api.repository2.unified.IRepositoryContentConverterHandler;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.core.mimetype.MimeType;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.services.importexport.Log4JRepositoryImportLogger;
import org.pentaho.platform.plugin.services.importexport.RepositoryFileBundle;
import org.pentaho.platform.util.XmlTestConstants;
import org.springframework.test.util.ReflectionTestUtils;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
public class LocaleImportHandlerTest {
private static final String DEFAULT_ENCODING = "UTF-8";
PentahoPlatformImporter importer;
LocaleFilesProcessor localeFilesProcessor;
@Before
public void setUp() throws Exception {
NameBaseMimeResolver nameResolver = new NameBaseMimeResolver();
PentahoSystem.registerObject( nameResolver );
IRepositoryContentConverterHandler converterHandler =
new DefaultRepositoryContentConverterHandler( new HashMap<String, Converter>() );
List<IMimeType> localeMimeList = new ArrayList<IMimeType>();
localeMimeList.add( new MimeType( "text/locale", "locale" ) );
nameResolver.addMimeType( new MimeType( "text/prptMimeType", "prpt" ) );
nameResolver.addMimeType( new MimeType( "text/xactionMimeType", "xaction" ) );
MimeType mimeType = new MimeType( "text/xml", "xml" );
mimeType.setHidden( true );
nameResolver.addMimeType( mimeType );
mimeType = new MimeType( "image/png", "png" );
mimeType.setHidden( true );
nameResolver.addMimeType( mimeType );
List<String> allowedArtifacts = new ArrayList<String>();
allowedArtifacts.add( "xaction" );
allowedArtifacts.add( "url" );
LocaleImportHandler localeImportHandler = new LocaleImportHandler( localeMimeList, allowedArtifacts );
LocaleImportHandler spylocaleImportHandler = spy( localeImportHandler );
Log log = mock( Log.class );
doReturn( log ).when( spylocaleImportHandler ).getLogger();
List<IPlatformImportHandler> handlers = new ArrayList<IPlatformImportHandler>();
handlers.add( spylocaleImportHandler );
importer = new PentahoPlatformImporter( handlers, converterHandler );
importer.setRepositoryImportLogger( new Log4JRepositoryImportLogger() );
localeFilesProcessor = new LocaleFilesProcessor();
}
@Test
public void testImportLocaleFiles() throws Exception {
StringBuffer localeContent = new StringBuffer();
localeContent.append( "name=Test" );
localeContent.append( "\n" );
localeContent.append( "description=Test description" );
assertTrue( processIsLocalFile( "test.properties", localeContent ) );
assertFalse( processIsLocalFile( "test.bla", localeContent ) );
localeContent = new StringBuffer( "bla bla" );
assertFalse( processIsLocalFile( "test.properties", localeContent ) );
localeFilesProcessor.processLocaleFiles( importer );
}
@Test
public void testValidImportIndexLocaleFile() {
String localeContent =
"<index><name>My name</name><description>My descript</description><icon>samples.png</icon><visible>true</visible><display-type>icons</display-type></index>";
RepositoryFileImportBundle importBundle = createBundle( localeContent, "index.xml" );
IUnifiedRepository unifiedRepository = initLocaleHandler( importBundle );
try {
importer.importFile( importBundle );
verify( unifiedRepository, times( 1 ) ).getFile( anyString() );
verify( unifiedRepository, never() ).getChildren( anyInt() );
verify( unifiedRepository, times( 1 ) ).setLocalePropertiesForFile( any( RepositoryFile.class ), anyString(),
any( Properties.class ) );
} catch ( PlatformImportException e ) {
fail( e.getMessage() );
}
}
@Test
public void testInValidImportIndexLocaleFile() {
String localeContent =
"<index><name>%name</name><description>%description</description><icon>samples.png</icon><visible>true</visible><display-type>icons</display-type></index>";
RepositoryFileImportBundle importBundle = createBundle( localeContent, "index.xml" );
IUnifiedRepository unifiedRepository = initLocaleHandler( importBundle );
try {
importer.importFile( importBundle );
verify( unifiedRepository, times( 1 ) ).getFile( anyString() );
verify( unifiedRepository, times( 1 ) ).getChildren( anyInt() );
verify( unifiedRepository, never() ).setLocalePropertiesForFile( any( RepositoryFile.class ), anyString(),
any( Properties.class ) );
} catch ( PlatformImportException e ) {
fail( e.getMessage() );
}
}
@Test
public void testImportNotLocaleFile() {
String localeContent = "<index></display-type></index>";
RepositoryFileImportBundle importBundle = createBundle( localeContent, "test.xml" );
IUnifiedRepository unifiedRepository = initLocaleHandler( importBundle );
try {
importer.importFile( importBundle );
verify( unifiedRepository, times( 1 ) ).getFile( anyString() );
verify( unifiedRepository, times( 1 ) ).getChildren( anyInt() );
verify( unifiedRepository, never() ).setLocalePropertiesForFile( any( RepositoryFile.class ), anyString(),
any( Properties.class ) );
} catch ( PlatformImportException e ) {
fail( e.getMessage() );
}
}
private IUnifiedRepository initLocaleHandler( RepositoryFileImportBundle importBundle ) {
IUnifiedRepository unifiedRepository = mock( IUnifiedRepository.class );
when( unifiedRepository.getFile( importBundle.getPath() ) ).thenReturn( importBundle.getFile() );
LocaleImportHandler localeHandler = (LocaleImportHandler) importer.getHandlers().get( importBundle.getMimeType() );
ReflectionTestUtils.setField( localeHandler, "unifiedRepository", unifiedRepository );
return unifiedRepository;
}
private RepositoryFileImportBundle createBundle( String localeContent, String fileName ) {
InputStream in = new ByteArrayInputStream( localeContent.getBytes() );
RepositoryFile repoFile = new RepositoryFile.Builder( fileName ).build();
RepositoryFileImportBundle.Builder bundleBuilder = new RepositoryFileImportBundle.Builder();
bundleBuilder.path( "/pentaho-solutions/my-test/" + fileName );
bundleBuilder.mime( "text/locale" );
bundleBuilder.input( in );
bundleBuilder.charSet( DEFAULT_ENCODING );
bundleBuilder.overwriteFile( true );
bundleBuilder.applyAclSettings( true );
bundleBuilder.overwriteAclSettings( true );
bundleBuilder.retainOwnership( false );
bundleBuilder.name( fileName );
bundleBuilder.file( repoFile );
RepositoryFileImportBundle importBundle = bundleBuilder.build();
return importBundle;
}
private boolean processIsLocalFile( String fileName, StringBuffer localeContent ) throws Exception {
RepositoryFile file = new RepositoryFile.Builder( fileName ).build();
RepositoryFileBundle repoFileBundle =
new RepositoryFileBundle( file, null, StringUtils.EMPTY, null, DEFAULT_ENCODING, null );
return localeFilesProcessor.isLocaleFile( repoFileBundle, "/", localeContent.toString().getBytes() );
}
@Test( timeout = 2000, expected = SAXException.class )
public void shouldNotFailAndReturnNullWhenMaliciousXmlIsGiven() throws IOException, ParserConfigurationException, SAXException {
LocaleImportHandler lih = new LocaleImportHandler( Collections.emptyList(), null );
lih.getLocalBundleDocument( new StringInputStream( XmlTestConstants.MALICIOUS_XML ) );
fail();
}
@Test
public void shouldNotFailAndReturnNotNullWhenLegalXmlIsGiven() throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<slave_config>"
+ "</slave_config>";
LocaleImportHandler lih = new LocaleImportHandler( Collections.emptyList(), null );
assertNotNull( lih.getLocalBundleDocument( new StringInputStream( xml ) ) );
}
}