/* * The MIT License * * Copyright (c) 2013 IKEDA Yasuyuki * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package jp.ikedam.jenkins.plugins.jobcopy_builder; import hudson.EnvVars; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.TopLevelItem; import hudson.model.TopLevelItemDescriptor; import hudson.model.Job; import hudson.search.SearchIndex; import hudson.search.Search; import hudson.security.ACL; import hudson.security.Permission; import hudson.util.NullStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.acegisecurity.AccessDeniedException; import org.apache.commons.io.FileUtils; import junit.framework.TestCase; /** * Tests for AdditionalFileset not concerned with Jenkins. */ public class AdditionalFilesetSimpleTest extends TestCase { private File createTempDir() throws IOException { File tempFile = File.createTempFile("test", null); tempFile.delete(); tempFile.mkdir(); return tempFile; } public void testAdditionalFileset() { String includeFile = "**/config.xml"; String excludeFile = "test/foobar/config.xml"; List<JobcopyOperation> emptyList = new ArrayList<JobcopyOperation>(); List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new ReplaceOperation("from", false, "to", false)); lst.add(new EnableOperation()); // simple values { AdditionalFileset target = new AdditionalFileset( includeFile, excludeFile, false, lst ); assertEquals("simple values", includeFile, target.getIncludeFile()); assertEquals("simple values", excludeFile, target.getExcludeFile()); assertEquals("simple values", false, target.isOverwrite()); assertEquals("simple values", lst, target.getJobcopyOperationList()); } // values surrounded with spaces { AdditionalFileset target = new AdditionalFileset( " " + includeFile + " ", "\t" + excludeFile + "\t", true, emptyList ); assertEquals("values surrounded with spaces", includeFile, target.getIncludeFile()); assertEquals("values surrounded with spaces", excludeFile, target.getExcludeFile()); assertEquals("values surrounded with spaces", true, target.isOverwrite()); assertEquals("values surrounded with spaces", emptyList, target.getJobcopyOperationList()); } // null { AdditionalFileset target = new AdditionalFileset( null, null, false, null ); assertNull("null", target.getIncludeFile()); assertNull("null", target.getExcludeFile()); assertNull("null", target.getJobcopyOperationList()); } } public static class PublicAdditionalFileset extends AdditionalFileset { private static final long serialVersionUID = -8474841816751367916L; public PublicAdditionalFileset( String includeFile, String excludeFile, boolean overwrite, List<JobcopyOperation> jobcopyOperationList ) { super(includeFile, excludeFile, overwrite, jobcopyOperationList); } public List<String> publicGetFilesToCopy(File dir) { return getFilesToCopy(dir); } public boolean publicPerformToFile(File dstFile, File srcFile, EnvVars env, PrintStream logger) { return performToFile(dstFile, srcFile, env, logger); } } // mainly test that unexpected exception not thrown... public void testGetFilesToCopy() throws IOException { File tempDir = null; try { tempDir = createTempDir(); FileUtils.writeStringToFile(new File(tempDir, "test1/test.txt"), "hogehoge"); FileUtils.writeStringToFile(new File(tempDir, "test2/test.txt"), "hogehoge"); FileUtils.writeStringToFile(new File(tempDir, "test3/test/test.txt"), "hogehoge"); // only includes 1 { List<String> files = new PublicAdditionalFileset("**/test.txt", null, false, null).publicGetFilesToCopy(tempDir); assertNotNull("only includes 1", files); assertEquals("only includes 1", 3, files.size()); } // only includes 2 { List<String> files = new PublicAdditionalFileset("**/test.txt", "", false, null).publicGetFilesToCopy(tempDir); assertNotNull("only includes 2", files); assertEquals("only includes 2", 3, files.size()); } // no affect excludes { List<String> files = new PublicAdditionalFileset("**/test.txt", "**/nosuchfile.txt", false, null).publicGetFilesToCopy(tempDir); assertNotNull("no affect excludes", files); assertEquals("no affect excludes", 3, files.size()); } // no files 1 { List<String> files = new PublicAdditionalFileset("**/test.txt", "**/test.txt", false, null).publicGetFilesToCopy(tempDir); assertNotNull("no files 1", files); assertEquals("no files 1", 0, files.size()); } // no files 2 { List<String> files = new PublicAdditionalFileset("**/nosuchfile.txt", null, false, null).publicGetFilesToCopy(tempDir); assertNotNull("no files 2", files); assertEquals("no files 2", 0, files.size()); } // no includes(null) { List<String> files = new PublicAdditionalFileset(null, null, false, null).publicGetFilesToCopy(tempDir); assertNotNull("no includes 1", files); assertEquals("no includes 1", 0, files.size()); } // no includes(empty) { List<String> files = new PublicAdditionalFileset("", null, false, null).publicGetFilesToCopy(tempDir); assertNotNull("no includes 2", files); assertEquals("no includes 2", 0, files.size()); } // no includes(only comma) { List<String> files = new PublicAdditionalFileset(",", null, false, null).publicGetFilesToCopy(tempDir); assertNotNull("no includes(only comma)", files); assertEquals("no includes(only comma)", 3, files.size()); } // root { List<String> files = new PublicAdditionalFileset("/nosuchfile.txt", "/foobar.txt", false, null).publicGetFilesToCopy(tempDir); assertNotNull("root", files); assertEquals("root", 0, files.size()); } } finally { if(tempDir != null && tempDir.exists()) { if(tempDir.isDirectory()) { FileUtils.deleteDirectory(tempDir); } else { tempDir.delete(); } } } } private class DummyPerformToFileAdditionalFileset extends AdditionalFileset { private static final long serialVersionUID = 6038335077788905237L; public DummyPerformToFileAdditionalFileset(String includeFile, String excludeFile, boolean overwrite, List<JobcopyOperation> jobcopyOperationList) { super(includeFile, excludeFile, overwrite, jobcopyOperationList); } public List<String> filesToCopyList; public List<File> dstFileList = new ArrayList<File>(0); public List<File> srcFileList = new ArrayList<File>(0); public List<Boolean> returnList; @Override protected List<String> getFilesToCopy(File dir) { return filesToCopyList; } @Override protected boolean performToFile(File dstFile, File srcFile, EnvVars env, PrintStream logger) { dstFileList.add(dstFile); srcFileList.add(srcFile); boolean ret = returnList.get(0).booleanValue(); returnList = returnList.subList(1, returnList.size()); return ret; } } public void testPerform() throws IOException { File srcDir = new File("/path/to/job1"); File dstDir = new File("/path/to/job2"); DummyJob srcJob = new DummyJob(srcDir); DummyJob dstJob = new DummyJob(dstDir); // simple execution { DummyPerformToFileAdditionalFileset target = new DummyPerformToFileAdditionalFileset( "test.xml", null, false, null ); target.returnList = Arrays.asList(true, true); target.filesToCopyList = Arrays.asList("file1.xml", "file2.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertTrue("simple execution", target.perform(dstJob, srcJob, env, logger)); assertEquals("simple execution", 2, target.srcFileList.size()); assertEquals("simple execution", new File(srcDir, "file1.xml"), target.srcFileList.get(0)); assertEquals("simple execution", new File(srcDir, "file2.xml"), target.srcFileList.get(1)); assertEquals("simple execution", 2, target.dstFileList.size()); assertEquals("simple execution", new File(dstDir, "file1.xml"), target.dstFileList.get(0)); assertEquals("simple execution", new File(dstDir, "file2.xml"), target.dstFileList.get(1)); } // no files { DummyPerformToFileAdditionalFileset target = new DummyPerformToFileAdditionalFileset( "test.xml", null, false, null ); target.filesToCopyList = new ArrayList<String>(0); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertTrue("no files", target.perform(dstJob, srcJob, env, logger)); assertEquals("no files", 0, target.srcFileList.size()); assertEquals("no files", 0, target.dstFileList.size()); } } public void testPerformError() { File srcDir = new File("/path/to/job1"); File dstDir = new File("/path/to/job2"); DummyJob srcJob = new DummyJob(srcDir); DummyJob dstJob = new DummyJob(dstDir); // null includeFiles { DummyPerformToFileAdditionalFileset target = new DummyPerformToFileAdditionalFileset( null, null, false, null ); target.returnList = Arrays.asList(true, true); target.filesToCopyList = Arrays.asList("file1.xml", "file2.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertFalse("null includeFiles", target.perform(dstJob, srcJob, env, logger)); assertEquals("null includeFiles", 0, target.srcFileList.size()); assertEquals("null includeFiles", 0, target.dstFileList.size()); } // blank includeFiles { DummyPerformToFileAdditionalFileset target = new DummyPerformToFileAdditionalFileset( " ", null, false, null ); target.returnList = Arrays.asList(true, true); target.filesToCopyList = Arrays.asList("file1.xml", "file2.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertFalse("blank includeFiles", target.perform(dstJob, srcJob, env, logger)); assertEquals("blank includeFiles", 0, target.srcFileList.size()); assertEquals("blank includeFiles", 0, target.dstFileList.size()); } // fail at begin { DummyPerformToFileAdditionalFileset target = new DummyPerformToFileAdditionalFileset( "test.xml", null, false, null ); target.returnList = Arrays.asList(false, true); target.filesToCopyList = Arrays.asList("file1.xml", "file2.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertFalse("fail at begin", target.perform(dstJob, srcJob, env, logger)); assertEquals("fail at begin", 2, target.srcFileList.size()); assertEquals("fail at begin", new File(srcDir, "file1.xml"), target.srcFileList.get(0)); assertEquals("fail at begin", new File(srcDir, "file2.xml"), target.srcFileList.get(1)); assertEquals("fail at begin", 2, target.dstFileList.size()); assertEquals("fail at begin", new File(dstDir, "file1.xml"), target.dstFileList.get(0)); assertEquals("fail at begin", new File(dstDir, "file2.xml"), target.dstFileList.get(1)); } } private class DummyOperation extends JobcopyOperation { public String xmlString; public String encoding; public String returnString; public DummyOperation(String returnString) { this.returnString = returnString; } @Override public String perform(String xmlString, String encoding, EnvVars env, PrintStream logger) { this.xmlString = xmlString; this.encoding = encoding; return returnString; } } public void testPerformFile() throws IOException { File workDir = null; String dummySrc = "This is a dummy source contents."; String dummyConv = "This is a dummy converted contents."; String dummyDest = "This is a dummy destination contents."; try { workDir = createTempDir(); // simple execution { DummyOperation op = new DummyOperation(dummyConv); PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, Arrays.asList((JobcopyOperation)op) ); File srcFile = new File(workDir, "simple_execution_src.xml"); File dstFile = new File(workDir, "simple_execution_dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); assertTrue("simple execution", target.publicPerformToFile(dstFile, srcFile, env, logger)); assertEquals("simple execution", dummySrc, op.xmlString); assertEquals("simple execution", "UTF-8", op.encoding.toUpperCase()); assertEquals("simple execution", dummyConv, FileUtils.readFileToString(dstFile)); } // not overwrite { DummyOperation op = new DummyOperation(dummyConv); PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, Arrays.asList((JobcopyOperation)op) ); File srcFile = new File(workDir, "simple_execution_src.xml"); File dstFile = new File(workDir, "simple_execution_dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); FileUtils.writeStringToFile(dstFile, dummyDest); assertTrue("not overwrite", target.publicPerformToFile(dstFile, srcFile, env, logger)); assertEquals("not overwrite", dummyDest, FileUtils.readFileToString(dstFile)); } // overwrite { DummyOperation op = new DummyOperation(dummyConv); PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, true, Arrays.asList((JobcopyOperation)op) ); File srcFile = new File(workDir, "overwrite_src.xml"); File dstFile = new File(workDir, "overwrite_dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); FileUtils.writeStringToFile(dstFile, dummyDest); assertTrue("overwrite", target.publicPerformToFile(dstFile, srcFile, env, logger)); assertEquals("overwrite", dummyConv, FileUtils.readFileToString(dstFile)); } // null operation list { PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, null ); File srcFile = new File(workDir, "null_operation_list_src.xml"); File dstFile = new File(workDir, "null_operation_list_dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); assertTrue("null operation list", target.publicPerformToFile(dstFile, srcFile, env, logger)); assertEquals("null operation list", dummySrc, FileUtils.readFileToString(dstFile)); } // empty operation list { PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, new ArrayList<JobcopyOperation>(0) ); File srcFile = new File(workDir, "empty_operation_list_src.xml"); File dstFile = new File(workDir, "empty_operation_list_dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); assertTrue("empty operation list", target.publicPerformToFile(dstFile, srcFile, env, logger)); assertEquals("empty operation list", dummySrc, FileUtils.readFileToString(dstFile)); } } finally { if(workDir != null) { FileUtils.deleteDirectory(workDir); } } } public void testPerformFileError() throws IOException { File workDir = null; String dummySrc = "This is a dummy source contents."; try { workDir = createTempDir(); // fail to read { PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, null ); File srcFile = new File(workDir, "fail_to_read.src.xml"); File dstFile = new File(workDir, "fail_to_read.dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); assertFalse("fail to read", target.publicPerformToFile(dstFile, srcFile, env, logger)); } // fail in operation { DummyOperation op = new DummyOperation(null); PublicAdditionalFileset target = new PublicAdditionalFileset( null, null, false, Arrays.asList((JobcopyOperation)op) ); File srcFile = new File(workDir, "fail_in_operation.src.xml"); File dstFile = new File(workDir, "fail_in_operation.dst.xml"); EnvVars env = new EnvVars(); PrintStream logger = new PrintStream(new NullStream()); FileUtils.writeStringToFile(srcFile, dummySrc); assertFalse("fail in operation", target.publicPerformToFile(dstFile, srcFile, env, logger)); } // fail to write // no way to achieve this... } finally { if(workDir != null) { FileUtils.deleteDirectory(workDir); } } } private static class DummyJob implements TopLevelItem { private File rootDir; public DummyJob(File rootDir) { this.rootDir = rootDir; } @Override public File getRootDir() { return rootDir; } // implement interface methods(no contents) @Override public ItemGroup<? extends Item> getParent() { return null; } @SuppressWarnings("rawtypes") @Override public Collection<? extends Job> getAllJobs() { return null; } @Override public String getName() { return null; } @Override public String getFullName() { return null; } @Override public String getDisplayName() { return null; } @Override public String getFullDisplayName() { return null; } @SuppressWarnings("rawtypes") @Override public String getRelativeNameFrom(ItemGroup g) { return null; } @Override public String getRelativeNameFrom(Item item) { return null; } @Override public String getUrl() { return null; } @Override public String getShortUrl() { return null; } @Override public String getAbsoluteUrl() { return null; } @Override public void onLoad(ItemGroup<? extends Item> parent, String name) throws IOException { } @Override public void onCopiedFrom(Item src) { } @Override public void onCreatedFromScratch() { } @Override public void save() throws IOException { } @Override public void delete() throws IOException, InterruptedException { } @Override public Search getSearch() { return null; } @Override public String getSearchName() { return null; } @Override public String getSearchUrl() { return null; } @Override public SearchIndex getSearchIndex() { return null; } @Override public ACL getACL() { return null; } @Override public void checkPermission(Permission permission) throws AccessDeniedException { } @Override public boolean hasPermission(Permission permission) { return false; } @Override public TopLevelItemDescriptor getDescriptor() { return null; } } }