| @@ -1,206 +1,206 @@ | |||
| /* | |||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||
| * contributor license agreements. See the NOTICE file distributed with | |||
| * this work for additional information regarding copyright ownership. | |||
| * The ASF licenses this file to You 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.apache.tools.ant.taskdefs.optional.ssh; | |||
| import java.io.File; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.taskdefs.condition.FilesMatch; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.selectors.FilenameSelector; | |||
| import org.junit.After; | |||
| import org.junit.Before; | |||
| import org.junit.Test; | |||
| import static org.junit.Assert.assertFalse; | |||
| import static org.junit.Assert.assertNotNull; | |||
| import static org.junit.Assert.assertTrue; | |||
| import static org.junit.Assert.fail; | |||
| /** | |||
| * This is a unit test for the Scp task in Ant. It must be | |||
| * configured with command line options in order for it to work. | |||
| * Here are the options: | |||
| * | |||
| * scp.tmp This is a local path to a temporary | |||
| * directory for this task to use. | |||
| * scp.host This is the remote location of the form: | |||
| * "user:password@host:/path/to/directory" | |||
| * scp.port The port of the listening SSH service. | |||
| * Defaults to 22. (optional) | |||
| * scp.known.hosts The file containing the public keys of known | |||
| * hosts. Must be a SSH2 version file, but | |||
| * supports RSA and DSA keys. If it is not present | |||
| * this task setTrust() to true. (optional) | |||
| */ | |||
| public class ScpTest { | |||
| private File tempDir; | |||
| private String sshHostUri = System.getProperty("scp.host"); | |||
| private int port = Integer.parseInt( System.getProperty( "scp.port", "22" ) ); | |||
| private String knownHosts = System.getProperty("scp.known.hosts"); | |||
| private List cleanUpList = new ArrayList(); | |||
| public ScpTest() { | |||
| if (System.getProperty("scp.tmp") != null) { | |||
| tempDir = new File(System.getProperty("scp.tmp")); | |||
| } | |||
| } | |||
| @Before | |||
| public void setUp() { | |||
| cleanUpList.clear(); | |||
| } | |||
| @After | |||
| public void tearDown() { | |||
| for( Iterator i = cleanUpList.iterator(); i.hasNext(); ) { | |||
| File file = (File) i.next(); | |||
| file.delete(); | |||
| } | |||
| } | |||
| @Test | |||
| public void testSingleFileUploadAndDownload() throws IOException { | |||
| assertNotNull("system property scp.tmp must be set", tempDir); | |||
| File uploadFile = createTemporaryFile(); | |||
| // upload | |||
| Scp scpTask = createTask(); | |||
| scpTask.setFile( uploadFile.getPath() ); | |||
| scpTask.setTodir( sshHostUri ); | |||
| scpTask.execute(); | |||
| File testFile = new File( tempDir.getPath() + File.separator + | |||
| "download-testSingleFileUploadAndDownload.test" ); | |||
| addCleanup(testFile ); | |||
| assertFalse("Assert that the testFile does not exist.", testFile.exists()); | |||
| // download | |||
| scpTask = createTask(); | |||
| scpTask.setFile( sshHostUri + "/" + uploadFile.getName() ); | |||
| scpTask.setTodir( testFile.getPath() ); | |||
| scpTask.execute(); | |||
| assertTrue( "Assert that the testFile exists.", testFile.exists() ); | |||
| compareFiles( uploadFile, testFile ); | |||
| } | |||
| @Test | |||
| public void testMultiUploadAndDownload() throws IOException { | |||
| assertNotNull("system property scp.tmp must be set", tempDir); | |||
| List uploadList = new ArrayList(); | |||
| for( int i = 0; i < 5; i++ ) { | |||
| uploadList.add( createTemporaryFile() ); | |||
| } | |||
| Scp scp = createTask(); | |||
| FilenameSelector selector = new FilenameSelector(); | |||
| selector.setName( "scp*" ); | |||
| FileSet fileset = new FileSet(); | |||
| fileset.setDir( tempDir ); | |||
| fileset.addFilename( selector ); | |||
| scp.addFileset( fileset ); | |||
| scp.setTodir( sshHostUri ); | |||
| scp.execute(); | |||
| File multi = new File( tempDir, "multi" ); | |||
| multi.mkdir(); | |||
| addCleanup( multi ); | |||
| Scp scp2 = createTask(); | |||
| scp2.setFile( sshHostUri + "/scp*" ); | |||
| scp2.setTodir( multi.getPath() ); | |||
| scp2.execute(); | |||
| FilesMatch match = new FilesMatch(); | |||
| for( Iterator i = uploadList.iterator(); i.hasNext(); ) { | |||
| File f = (File)i.next(); | |||
| match.setFile1( f ); | |||
| File f2 = new File( multi, f.getName() ); | |||
| match.setFile2( f2 ); | |||
| assertTrue("Assert file '" + f.getPath() + "' and file '" + | |||
| f2.getPath() + "'", match.eval() ); | |||
| } | |||
| } | |||
| @Test | |||
| public void testRemoteToDir() throws IOException { | |||
| Scp scpTask = createTask(); | |||
| // first try an invalid URI | |||
| try { | |||
| scpTask.setRemoteTodir( "host:/a/path/without/an/at" ); | |||
| fail("Expected a BuildException to be thrown due to invalid" | |||
| + " remoteToDir"); | |||
| } | |||
| catch (BuildException e) | |||
| { | |||
| // expected | |||
| //TODO we should be asserting a value in here | |||
| } | |||
| // And this one should work | |||
| scpTask.setRemoteTodir( "user:password@host:/a/path/with/an/at" ); | |||
| // no exception | |||
| } | |||
| public void addCleanup( File file ) { | |||
| cleanUpList.add( file ); | |||
| } | |||
| private void compareFiles(File src, File dest) { | |||
| FilesMatch match = new FilesMatch(); | |||
| match.setFile1( src ); | |||
| match.setFile2( dest ); | |||
| assertTrue( "Assert files are equal.", match.eval() ); | |||
| } | |||
| private File createTemporaryFile() throws IOException { | |||
| File uploadFile; | |||
| uploadFile = File.createTempFile( "scp", "test", tempDir ); | |||
| FileWriter writer = new FileWriter( uploadFile ); | |||
| writer.write("Can you hear me now?\n"); | |||
| writer.close(); | |||
| addCleanup( uploadFile ); | |||
| return uploadFile; | |||
| } | |||
| private Scp createTask() { | |||
| Scp scp = new Scp(); | |||
| Project p = new Project(); | |||
| p.init(); | |||
| scp.setProject( p ); | |||
| if( knownHosts != null ) { | |||
| scp.setKnownhosts( knownHosts ); | |||
| } else { | |||
| scp.setTrust( true ); | |||
| } | |||
| scp.setPort( port ); | |||
| return scp; | |||
| } | |||
| } | |||
| /* | |||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||
| * contributor license agreements. See the NOTICE file distributed with | |||
| * this work for additional information regarding copyright ownership. | |||
| * The ASF licenses this file to You 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.apache.tools.ant.taskdefs.optional.ssh; | |||
| import java.io.File; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.taskdefs.condition.FilesMatch; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.selectors.FilenameSelector; | |||
| import org.junit.After; | |||
| import org.junit.Before; | |||
| import org.junit.Test; | |||
| import static org.junit.Assert.assertFalse; | |||
| import static org.junit.Assert.assertNotNull; | |||
| import static org.junit.Assert.assertTrue; | |||
| import static org.junit.Assert.fail; | |||
| /** | |||
| * This is a unit test for the Scp task in Ant. It must be | |||
| * configured with command line options in order for it to work. | |||
| * Here are the options: | |||
| * | |||
| * scp.tmp This is a local path to a temporary | |||
| * directory for this task to use. | |||
| * scp.host This is the remote location of the form: | |||
| * "user:password@host:/path/to/directory" | |||
| * scp.port The port of the listening SSH service. | |||
| * Defaults to 22. (optional) | |||
| * scp.known.hosts The file containing the public keys of known | |||
| * hosts. Must be a SSH2 version file, but | |||
| * supports RSA and DSA keys. If it is not present | |||
| * this task setTrust() to true. (optional) | |||
| */ | |||
| public class ScpTest { | |||
| private File tempDir; | |||
| private String sshHostUri = System.getProperty("scp.host"); | |||
| private int port = Integer.parseInt( System.getProperty( "scp.port", "22" ) ); | |||
| private String knownHosts = System.getProperty("scp.known.hosts"); | |||
| private List cleanUpList = new ArrayList(); | |||
| public ScpTest() { | |||
| if (System.getProperty("scp.tmp") != null) { | |||
| tempDir = new File(System.getProperty("scp.tmp")); | |||
| } | |||
| } | |||
| @Before | |||
| public void setUp() { | |||
| cleanUpList.clear(); | |||
| } | |||
| @After | |||
| public void tearDown() { | |||
| for( Iterator i = cleanUpList.iterator(); i.hasNext(); ) { | |||
| File file = (File) i.next(); | |||
| file.delete(); | |||
| } | |||
| } | |||
| @Test | |||
| public void testSingleFileUploadAndDownload() throws IOException { | |||
| assertNotNull("system property scp.tmp must be set", tempDir); | |||
| File uploadFile = createTemporaryFile(); | |||
| // upload | |||
| Scp scpTask = createTask(); | |||
| scpTask.setFile( uploadFile.getPath() ); | |||
| scpTask.setTodir( sshHostUri ); | |||
| scpTask.execute(); | |||
| File testFile = new File( tempDir.getPath() + File.separator + | |||
| "download-testSingleFileUploadAndDownload.test" ); | |||
| addCleanup(testFile ); | |||
| assertFalse("Assert that the testFile does not exist.", testFile.exists()); | |||
| // download | |||
| scpTask = createTask(); | |||
| scpTask.setFile( sshHostUri + "/" + uploadFile.getName() ); | |||
| scpTask.setTodir( testFile.getPath() ); | |||
| scpTask.execute(); | |||
| assertTrue( "Assert that the testFile exists.", testFile.exists() ); | |||
| compareFiles( uploadFile, testFile ); | |||
| } | |||
| @Test | |||
| public void testMultiUploadAndDownload() throws IOException { | |||
| assertNotNull("system property scp.tmp must be set", tempDir); | |||
| List uploadList = new ArrayList(); | |||
| for( int i = 0; i < 5; i++ ) { | |||
| uploadList.add( createTemporaryFile() ); | |||
| } | |||
| Scp scp = createTask(); | |||
| FilenameSelector selector = new FilenameSelector(); | |||
| selector.setName( "scp*" ); | |||
| FileSet fileset = new FileSet(); | |||
| fileset.setDir( tempDir ); | |||
| fileset.addFilename( selector ); | |||
| scp.addFileset( fileset ); | |||
| scp.setTodir( sshHostUri ); | |||
| scp.execute(); | |||
| File multi = new File( tempDir, "multi" ); | |||
| multi.mkdir(); | |||
| addCleanup( multi ); | |||
| Scp scp2 = createTask(); | |||
| scp2.setFile( sshHostUri + "/scp*" ); | |||
| scp2.setTodir( multi.getPath() ); | |||
| scp2.execute(); | |||
| FilesMatch match = new FilesMatch(); | |||
| for( Iterator i = uploadList.iterator(); i.hasNext(); ) { | |||
| File f = (File)i.next(); | |||
| match.setFile1( f ); | |||
| File f2 = new File( multi, f.getName() ); | |||
| match.setFile2( f2 ); | |||
| assertTrue("Assert file '" + f.getPath() + "' and file '" + | |||
| f2.getPath() + "'", match.eval() ); | |||
| } | |||
| } | |||
| @Test | |||
| public void testRemoteToDir() throws IOException { | |||
| Scp scpTask = createTask(); | |||
| // first try an invalid URI | |||
| try { | |||
| scpTask.setRemoteTodir( "host:/a/path/without/an/at" ); | |||
| fail("Expected a BuildException to be thrown due to invalid" | |||
| + " remoteToDir"); | |||
| } | |||
| catch (BuildException e) | |||
| { | |||
| // expected | |||
| //TODO we should be asserting a value in here | |||
| } | |||
| // And this one should work | |||
| scpTask.setRemoteTodir( "user:password@host:/a/path/with/an/at" ); | |||
| // no exception | |||
| } | |||
| public void addCleanup( File file ) { | |||
| cleanUpList.add( file ); | |||
| } | |||
| private void compareFiles(File src, File dest) { | |||
| FilesMatch match = new FilesMatch(); | |||
| match.setFile1( src ); | |||
| match.setFile2( dest ); | |||
| assertTrue( "Assert files are equal.", match.eval() ); | |||
| } | |||
| private File createTemporaryFile() throws IOException { | |||
| File uploadFile; | |||
| uploadFile = File.createTempFile( "scp", "test", tempDir ); | |||
| FileWriter writer = new FileWriter( uploadFile ); | |||
| writer.write("Can you hear me now?\n"); | |||
| writer.close(); | |||
| addCleanup( uploadFile ); | |||
| return uploadFile; | |||
| } | |||
| private Scp createTask() { | |||
| Scp scp = new Scp(); | |||
| Project p = new Project(); | |||
| p.init(); | |||
| scp.setProject( p ); | |||
| if( knownHosts != null ) { | |||
| scp.setKnownhosts( knownHosts ); | |||
| } else { | |||
| scp.setTrust( true ); | |||
| } | |||
| scp.setPort( port ); | |||
| return scp; | |||
| } | |||
| } | |||