/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.test.platform.plugin.pluginmgr;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JMock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pentaho.platform.api.engine.ISystemSettings;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.services.pluginmgr.PluginClassLoader;
import org.pentaho.platform.plugin.services.pluginmgr.PluginResourceLoader;
import org.pentaho.platform.util.messages.LocaleHelper;
import org.pentaho.test.platform.utils.TestResourceLocation;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import static org.junit.Assert.*;
@SuppressWarnings( "nls" )
@RunWith( JMock.class )
public class PluginResourceLoaderTest {
public static final String TEST_RES = "src/test/resources/";
private Mockery mockery = new Mockery();
private PluginResourceLoader resLoader;
private Class<?> pluginClass;
private PluginClassLoader classLoader;
@Before
public void init() throws ClassNotFoundException {
resLoader = new PluginResourceLoader();
classLoader =
new PluginClassLoader( new File("./" + TEST_RES + "PluginResourceLoaderTest"), getClass().getClassLoader() );
pluginClass = classLoader.loadClass( "PluginResLoaderDummyClass" );
}
@Test
public void testGetResource_fromFileSystem() throws UnsupportedEncodingException {
InputStream in = resLoader.getResourceAsStream( pluginClass, "pluginResourceTest.properties" );
assertNotNull( "Failed to get resource as stream", in );
byte[] bytes = resLoader.getResourceAsBytes( pluginClass, "pluginResourceTest.properties" );
assertNotNull( "Failed to get resource as bytes", bytes );
String s = resLoader.getResourceAsString( pluginClass, "pluginResourceTest.properties" );
assertNotNull( "Failed to get resource as string", s );
s = resLoader.getResourceAsString( pluginClass, "pluginResourceTest.properties", "UTF-8" );
assertNotNull( "Failed to get resource as string", s );
// load a resource from a subdirectory
in = resLoader.getResourceAsStream( pluginClass, "resources/pluginResourceTest-inresources.properties" );
assertNotNull( "Failed to get resource as stream", in );
}
@Test
public void testGetResource_FileDNE() throws UnsupportedEncodingException {
InputStream in = resLoader.getResourceAsStream( pluginClass, "non-existent-file" );
assertNull( "InputStream should have been null indicating resource not found", in );
byte[] bytes = resLoader.getResourceAsBytes( pluginClass, "non-existent-file" );
assertNull( "byte array should have been null indicating resource not found", bytes );
String s = resLoader.getResourceAsString( pluginClass, "non-existent-file" );
assertNull( "InputStream should have been null indicating resource not found", s );
}
@Test( expected = UnsupportedEncodingException.class )
public void testBadStringEncoding() throws UnsupportedEncodingException {
@SuppressWarnings( "unused" )
String s = resLoader.getResourceAsString( pluginClass, "pluginResourceTest.properties", "bogus encoding" );
}
@Test
public void testGetResourceBundleFromInsideJar() {
ResourceBundle.getBundle( "pluginResourceTest-injar", LocaleHelper.getLocale(), classLoader );
}
@Test
public void testGetResourceBundleFromResourcesDir() {
// this properties file lives in the "resources" directory under the plugin root dir
// test that retrieving a resource bundle works the same by in the resource loader and the java ResourceBundle api
ResourceBundle.getBundle( "resources/pluginResourceTest-inresources", LocaleHelper.getLocale(), classLoader );
ResourceBundle.getBundle( "resources.pluginResourceTest-inresources", LocaleHelper.getLocale(), classLoader );
resLoader.getResourceBundle( pluginClass, "resources/pluginResourceTest-inresources" );
resLoader.getResourceBundle( pluginClass, "resources.pluginResourceTest-inresources" );
}
@Test
public void ItestGetResource_fromClassLoader() throws ClassNotFoundException, IOException {
// find a properties file included in a jar
assertNotNull( "Could not find the properties file embededd in the jar", resLoader.getResourceAsStream(
pluginClass, "pluginResourceTest-injar.properties" ) );
// find a properties file at the classloader root directory
assertNotNull( "Could not find the properties file on the classloader root dir", resLoader.getResourceAsStream(
pluginClass, "pluginResourceTest.properties" ) );
assertNotNull( "Could not find the properties file embededd in the jar", resLoader.getResourceAsStream(
pluginClass, "org/pentaho/test/pluginResourceTest-deepinjar.properties" ) );
assertNotNull( "Could not find the properties file embededd in the jar", resLoader.getResourceAsStream(
pluginClass, "org/pentaho/test/file.with.dots.in.name.properties" ) );
}
@Test
public void testPluginPath() {
String path = resLoader.getSystemRelativePluginPath( pluginClass.getClassLoader() );
assertTrue( "Plugin path is not correct", path.endsWith( TestResourceLocation.TEST_RESOURCES + "/PluginResourceLoaderTest" ) ); //$NON-NLS-2$
}
@Test
public void testGetPluginSettings() {
final ISystemSettings mockSettings = mockery.mock( ISystemSettings.class );
final String fullPathToSettingsFile =
resLoader.getSystemRelativePluginPath( pluginClass.getClassLoader() ) + "/settings.xml";
mockery.checking( new Expectations() {
{
oneOf( mockSettings ).getSystemSetting( fullPathToSettingsFile, "testsetting", null );
will( returnValue( "false" ) );
oneOf( mockSettings ).getSystemSetting( fullPathToSettingsFile, "bogussetting", null );
will( returnValue( null ) );
oneOf( mockSettings ).getSystemSetting( fullPathToSettingsFile, "bogussetting", "true" );
will( returnValue( "true" ) );
}
} );
PentahoSystem.setSystemSettingsService( mockSettings );
assertEquals( "Cache value incorrect", "false", resLoader.getPluginSetting( pluginClass, "testsetting" ) );
assertNull( "Bogus value should not have been found", resLoader.getPluginSetting( pluginClass, "bogussetting" ) );
assertEquals( "Bogus value should have a default of true", "true", resLoader.getPluginSetting( pluginClass,
"bogussetting", "true" ) );
}
@Test
public void testFindResources_propertyFiles() throws URISyntaxException {
List<URL> urls = resLoader.findResources( pluginClass, "*properties*" );
boolean propFile1Found = false, propFile2Found = false;
for ( URL url : urls ) {
File f = new File( url.toURI() );
String fileName = f.getName();
if ( "pluginResourceTest-inresources.properties".equals( fileName ) ) {
propFile1Found = true;
}
if ( "pluginResourceTest.properties".equals( fileName ) ) {
propFile2Found = true;
}
}
assertTrue( "pluginResourceTest-inresources.properties was not found", propFile1Found );
assertTrue( "pluginResourceTest.properties was not found", propFile2Found );
}
@Test
public void testFindResources_allRecursive() {
List<URL> urls = resLoader.findResources( pluginClass, "templates/*" );
for ( URL url : urls ) {
System.err.println( url.getPath() );
assertTrue( "Url does not contain templates dir in path: " + url.getPath(),
url.getPath().contains( "templates" ) );
}
boolean found = false;
for ( URL url : urls ) {
found = url.getPath().endsWith( "test.html" );
if ( found ) {
break;
}
}
assertTrue( "Template not found", found );
}
}