/*! ******************************************************************************
*
* 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.core.plugins;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import org.apache.commons.vfs2.FileObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.exception.KettleFileException;
/**
* @author Tatsiana_Kasiankova
*
*/
public class PluginFolderTest {
private static final String BASE_TEMP_DIR = System.getProperty( "java.io.tmpdir" );
private static final String PLUGINS_DIR_NAME = "plugins";
private static final String WITH_JAR_IN_NAME_DIR_NAME = "job.jar";
private static final String TEST_DIR_NAME = "test_dir";
/**
*
*/
private static final Path PATH_TO_KETTLE_IGNORE_FILE =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, TEST_DIR_NAME, ".kettle-ignore" );
private static final String JAR_FILE1_NAME = "job.jar";
private static final String JAR_FILE2_NAME = "test.jar";
/**
*
*/
private static final Path PATH_TO_JAR_IN_LIB_DIR =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, "lib", JAR_FILE2_NAME );
private static final String NOT_JAR_FILE_NAME = "test.txt";
private static final Path PATH_TO_PLUGIN_DIR = Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME );
/**
* Paths below represent the following structure of the folder and files in them:
* <p>
* <TMP_DIR>/plugins/job.jar - folder
* <p>
* <TMP_DIR>/plugins/job.jar/job.jar - file
* <p>
* <TMP_DIR>/plugins/job.jar/test.txt - file
*/
private static final Path PATH_TO_DIR_WITH_JAR_IN_NAME =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, WITH_JAR_IN_NAME_DIR_NAME );
private static final Path PATH_TO_JAR_FILE1 =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, WITH_JAR_IN_NAME_DIR_NAME, JAR_FILE1_NAME );
private static final Path PATH_TO_NOT_JAR_FILE =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, WITH_JAR_IN_NAME_DIR_NAME, NOT_JAR_FILE_NAME );
/**
* Paths below represent the following structure of the folder and files in them:
* <p>
* <TMP_DIR>/plugins/test_dir - folder
* <p>
* <TMP_DIR>/plugins/test_dir/job.jar - file
* <p>
* <TMP_DIR>/plugins/test_dir/test.txt - file
*/
private static final Path PATH_TO_TEST_DIR_NAME = Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, TEST_DIR_NAME );
private static final Path PATH_TO_JAR_FILE2 =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, TEST_DIR_NAME, JAR_FILE2_NAME );
private static final Path PATH_TO_NOT_JAR_FILE_IN_TEST_DIR =
Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, TEST_DIR_NAME, NOT_JAR_FILE_NAME );
private PluginFolder plFolder;
@Before
public void setUp() throws IOException {
cleanTempDir( PATH_TO_PLUGIN_DIR );
plFolder = new PluginFolder( PATH_TO_PLUGIN_DIR.toAbsolutePath().toString(), false, true );
}
@After
public void clean() throws IOException {
cleanTempDir( PATH_TO_PLUGIN_DIR );
plFolder = null;
}
@Test
public void testIsPluginXmlFolder_SetPluginXmlFolder() throws IOException, KettleFileException {
plFolder = new PluginFolder( PLUGINS_DIR_NAME, false, true );
assertNotNull( plFolder );
assertFalse( plFolder.isPluginXmlFolder() );
plFolder.setPluginXmlFolder( true );
assertTrue( plFolder.isPluginXmlFolder() );
plFolder.setPluginXmlFolder( false );
assertFalse( plFolder.isPluginXmlFolder() );
}
@Test
public void testIsPluginAnnotationsFolder_SetPluginAnnotationsFolder() throws IOException, KettleFileException {
plFolder = new PluginFolder( PLUGINS_DIR_NAME, false, true );
assertNotNull( plFolder );
assertTrue( plFolder.isPluginAnnotationsFolder() );
plFolder.setPluginAnnotationsFolder( false );
assertFalse( plFolder.isPluginAnnotationsFolder() );
plFolder.setPluginAnnotationsFolder( true );
assertTrue( plFolder.isPluginAnnotationsFolder() );
}
@Test
public void testGetFolder_SetFolder() throws IOException, KettleFileException {
plFolder = new PluginFolder( null, false, true );
assertNotNull( plFolder );
assertNull( plFolder.getFolder() );
plFolder.setFolder( PLUGINS_DIR_NAME );
assertEquals( PLUGINS_DIR_NAME, plFolder.getFolder() );
}
@Test
public void testFindJarFiles_DirWithJarInNameNotAdded() throws IOException, KettleFileException {
Files.createDirectories( PATH_TO_DIR_WITH_JAR_IN_NAME );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 0, findJarFiles.length );
}
@Test
public void testFindJarFiles_DirWithJarInNameNotAddedButJarFileAdded() throws IOException, KettleFileException {
Files.createDirectories( PATH_TO_DIR_WITH_JAR_IN_NAME );
Files.createFile( PATH_TO_JAR_FILE1 );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 1, findJarFiles.length );
assertTrue( findJarFiles[0].isFile() );
assertEquals( PATH_TO_JAR_FILE1.toUri().toString(), findJarFiles[0].getURL().toString() );
}
@Test
public void testFindJarFiles_DirWithJarInNameNotAddedAndTxtFileNotAdded() throws IOException, KettleFileException {
Files.createDirectories( PATH_TO_DIR_WITH_JAR_IN_NAME );
Files.createFile( PATH_TO_NOT_JAR_FILE );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 0, findJarFiles.length );
}
@Test
public void testFindJarFiles_SeveralJarsInDifferentDirs() throws IOException, KettleFileException {
// Files in plugins/job.jar folder
Files.createDirectories( PATH_TO_DIR_WITH_JAR_IN_NAME );
Files.createFile( PATH_TO_JAR_FILE1 );
Files.createFile( PATH_TO_NOT_JAR_FILE );
// Files in plugins/test_dir folder
Files.createDirectories( PATH_TO_TEST_DIR_NAME );
Files.createFile( PATH_TO_JAR_FILE2 );
Files.createFile( PATH_TO_NOT_JAR_FILE_IN_TEST_DIR );
// Files in plugins folder
Files.createFile( Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, JAR_FILE2_NAME ) );
Files.createFile( Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, NOT_JAR_FILE_NAME ) );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 3, findJarFiles.length );
}
@Test
public void testFindJarFiles_DirWithKettleIgnoreFileIgnored() throws IOException, KettleFileException {
Files.createDirectories( PATH_TO_TEST_DIR_NAME );
Files.createFile( PATH_TO_JAR_FILE2 );
Files.createFile( PATH_TO_KETTLE_IGNORE_FILE );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 0, findJarFiles.length );
}
@Test
public void testFindJarFiles_LibDirIgnored() throws IOException, KettleFileException {
Files.createDirectories( Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, "lib" ) );
Files.createFile( PATH_TO_JAR_IN_LIB_DIR );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 0, findJarFiles.length );
}
@Test
public void testFindJarFiles_LibDirNOTIgnored() throws IOException, KettleFileException {
Files.createDirectories( Paths.get( BASE_TEMP_DIR, PLUGINS_DIR_NAME, "lib" ) );
Files.createFile( PATH_TO_JAR_IN_LIB_DIR );
plFolder = new PluginFolder( PATH_TO_PLUGIN_DIR.toAbsolutePath().toString(), false, true, true );
FileObject[] findJarFiles = plFolder.findJarFiles();
assertNotNull( findJarFiles );
assertEquals( 1, findJarFiles.length );
assertTrue( findJarFiles[0].isFile() );
assertEquals( PATH_TO_JAR_IN_LIB_DIR.toUri().toString(), findJarFiles[0].getURL().toString() );
}
@Test
public void testFindJarFiles_ExceptionThrows() {
String nullFolder = null;
String expectedMessage = "Unable to list jar files in plugin folder '" + nullFolder + "'";
plFolder = new PluginFolder( nullFolder, false, true );
try {
plFolder.findJarFiles();
fail( "KettleFileException was not occured but expected." );
} catch ( KettleFileException e ) {
assertTrue( e instanceof KettleFileException );
assertTrue( e.getLocalizedMessage().trim().startsWith( expectedMessage ) );
}
}
private void cleanTempDir( Path path ) throws IOException {
Files.walkFileTree( path, new FileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory( Path dir, IOException exc ) throws IOException {
Files.delete( dir );
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs ) {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException {
Files.delete( file );
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed( Path file, IOException exc ) throws IOException {
return FileVisitResult.CONTINUE;
}
} );
}
}