/*! ****************************************************************************** * * 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; } } ); } }