http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java deleted file mode 100644 index 76711fe..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java +++ /dev/null @@ -1,510 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.attribute.AclEntry; -import java.nio.file.attribute.AclEntryFlag; -import java.nio.file.attribute.AclEntryPermission; -import java.nio.file.attribute.AclEntryType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.EnumSet; -import java.util.List; -import java.util.Map; -import java.util.NavigableMap; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.SftpClient.Attributes; -import org.apache.sshd.client.subsystem.sftp.SftpClient.CloseableHandle; -import org.apache.sshd.client.subsystem.sftp.SftpClient.DirEntry; -import org.apache.sshd.client.subsystem.sftp.SftpClient.OpenMode; -import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.SftpHelper; -import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.session.ServerSession; -import org.apache.sshd.server.subsystem.sftp.AbstractSftpEventListenerAdapter; -import org.apache.sshd.server.subsystem.sftp.DefaultGroupPrincipal; -import org.apache.sshd.server.subsystem.sftp.SftpEventListener; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystem; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystemEnvironment; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; -import org.apache.sshd.util.test.JUnit4ClassRunnerWithParametersFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.runners.Parameterized.UseParametersRunnerFactory; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(Parameterized.class) // see https://github.com/junit-team/junit/wiki/Parameterized-tests -@UseParametersRunnerFactory(JUnit4ClassRunnerWithParametersFactory.class) -public class SftpVersionsTest extends AbstractSftpClientTestSupport { - private static final List<Integer> VERSIONS = - Collections.unmodifiableList( - IntStream.rangeClosed(SftpSubsystemEnvironment.LOWER_SFTP_IMPL, SftpSubsystemEnvironment.HIGHER_SFTP_IMPL) - .boxed() - .collect(Collectors.toList())); - - private final int testVersion; - - public SftpVersionsTest(int version) throws IOException { - testVersion = version; - } - - @Parameters(name = "version={0}") - public static Collection<Object[]> parameters() { - return parameterize(VERSIONS); - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - public final int getTestedVersion() { - return testVersion; - } - - @Test // See SSHD-749 - public void testSftpOpenFlags() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path lclParent = assertHierarchyTargetFolderExists(lclSftp); - Path lclFile = lclParent.resolve(getCurrentTestName() + "-" + getTestedVersion() + ".txt"); - Files.deleteIfExists(lclFile); - - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, lclFile); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - try (OutputStream out = sftp.write(remotePath, OpenMode.Create, OpenMode.Write)) { - out.write(getCurrentTestName().getBytes(StandardCharsets.UTF_8)); - } - assertTrue("File should exist on disk: " + lclFile, Files.exists(lclFile)); - sftp.remove(remotePath); - } - } - } - - @Test - public void testSftpVersionSelector() throws Exception { - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - assertEquals("Mismatched negotiated version", getTestedVersion(), sftp.getVersion()); - } - } - } - - @Test // see SSHD-572 - public void testSftpFileTimesUpdate() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path lclFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + "-" + getTestedVersion() + ".txt"); - Files.write(lclFile, getClass().getName().getBytes(StandardCharsets.UTF_8)); - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, lclFile); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - Attributes attrs = sftp.lstat(remotePath); - long expectedSeconds = TimeUnit.SECONDS.convert(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1L), TimeUnit.MILLISECONDS); - attrs.getFlags().clear(); - attrs.modifyTime(expectedSeconds); - sftp.setStat(remotePath, attrs); - - attrs = sftp.lstat(remotePath); - long actualSeconds = attrs.getModifyTime().to(TimeUnit.SECONDS); - // The NTFS file system delays updates to the last access time for a file by up to 1 hour after the last access - if (expectedSeconds != actualSeconds) { - System.err.append("Mismatched last modified time for ").append(lclFile.toString()) - .append(" - expected=").append(String.valueOf(expectedSeconds)) - .append('[').append(new Date(TimeUnit.SECONDS.toMillis(expectedSeconds)).toString()).append(']') - .append(", actual=").append(String.valueOf(actualSeconds)) - .append('[').append(new Date(TimeUnit.SECONDS.toMillis(actualSeconds)).toString()).append(']') - .println(); - } - } - } - } - - @Test // see SSHD-573 - public void testSftpFileTypeAndPermissionsUpdate() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path subFolder = Files.createDirectories(lclSftp.resolve("sub-folder")); - String subFolderName = subFolder.getFileName().toString(); - Path lclFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + "-" + getTestedVersion() + ".txt"); - String lclFileName = lclFile.getFileName().toString(); - Files.write(lclFile, getClass().getName().getBytes(StandardCharsets.UTF_8)); - - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, lclSftp); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - for (DirEntry entry : sftp.readDir(remotePath)) { - String fileName = entry.getFilename(); - if (".".equals(fileName) || "..".equals(fileName)) { - continue; - } - - Attributes attrs = validateSftpFileTypeAndPermissions(fileName, getTestedVersion(), entry.getAttributes()); - if (subFolderName.equals(fileName)) { - assertEquals("Mismatched sub-folder type", SftpConstants.SSH_FILEXFER_TYPE_DIRECTORY, attrs.getType()); - assertTrue("Sub-folder not marked as directory", attrs.isDirectory()); - } else if (lclFileName.equals(fileName)) { - assertEquals("Mismatched sub-file type", SftpConstants.SSH_FILEXFER_TYPE_REGULAR, attrs.getType()); - assertTrue("Sub-folder not marked as directory", attrs.isRegularFile()); - } - } - } - } - } - - @Test // see SSHD-574 - public void testSftpACLEncodeDecode() throws Exception { - AclEntryType[] types = AclEntryType.values(); - final List<AclEntry> aclExpected = new ArrayList<>(types.length); - for (AclEntryType t : types) { - aclExpected.add(AclEntry.newBuilder() - .setType(t) - .setFlags(EnumSet.allOf(AclEntryFlag.class)) - .setPermissions(EnumSet.allOf(AclEntryPermission.class)) - .setPrincipal(new DefaultGroupPrincipal(getCurrentTestName() + "@" + getClass().getPackage().getName())) - .build()); - } - - final AtomicInteger numInvocations = new AtomicInteger(0); - SftpSubsystemFactory factory = new SftpSubsystemFactory() { - @Override - public Command create() { - SftpSubsystem subsystem = new SftpSubsystem(getExecutorService(), isShutdownOnExit(), - getUnsupportedAttributePolicy(), getFileSystemAccessor(), getErrorStatusDataHandler()) { - @Override - protected NavigableMap<String, Object> resolveFileAttributes(Path file, int flags, LinkOption... options) throws IOException { - NavigableMap<String, Object> attrs = super.resolveFileAttributes(file, flags, options); - if (GenericUtils.isEmpty(attrs)) { - attrs = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - } - - @SuppressWarnings("unchecked") - List<AclEntry> aclActual = (List<AclEntry>) attrs.put("acl", aclExpected); - if (aclActual != null) { - log.info("resolveFileAttributes(" + file + ") replaced ACL: " + aclActual); - } - return attrs; - } - - @Override - protected void setFileAccessControl(Path file, List<AclEntry> aclActual, LinkOption... options) throws IOException { - if (aclActual != null) { - assertListEquals("Mismatched ACL set for file=" + file, aclExpected, aclActual); - numInvocations.incrementAndGet(); - } - } - }; - Collection<? extends SftpEventListener> listeners = getRegisteredListeners(); - if (GenericUtils.size(listeners) > 0) { - for (SftpEventListener l : listeners) { - subsystem.addSftpEventListener(l); - } - } - - return subsystem; - } - }; - - factory.addSftpEventListener(new AbstractSftpEventListenerAdapter() { - @Override - public void modifyingAttributes(ServerSession session, Path path, Map<String, ?> attrs) { - @SuppressWarnings("unchecked") - List<AclEntry> aclActual = GenericUtils.isEmpty(attrs) ? null : (List<AclEntry>) attrs.get("acl"); - if (getTestedVersion() > SftpConstants.SFTP_V3) { - assertListEquals("Mismatched modifying ACL for file=" + path, aclExpected, aclActual); - } else { - assertNull("Unexpected modifying ACL for file=" + path, aclActual); - } - } - - @Override - public void modifiedAttributes(ServerSession session, Path path, Map<String, ?> attrs, Throwable thrown) { - @SuppressWarnings("unchecked") - List<AclEntry> aclActual = GenericUtils.isEmpty(attrs) ? null : (List<AclEntry>) attrs.get("acl"); - if (getTestedVersion() > SftpConstants.SFTP_V3) { - assertListEquals("Mismatched modified ACL for file=" + path, aclExpected, aclActual); - } else { - assertNull("Unexpected modified ACL for file=" + path, aclActual); - } - } - }); - - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Files.createDirectories(lclSftp.resolve("sub-folder")); - Path lclFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + "-" + getTestedVersion() + ".txt"); - Files.write(lclFile, getClass().getName().getBytes(StandardCharsets.UTF_8)); - - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, lclSftp); - int numInvoked = 0; - - List<NamedFactory<Command>> factories = sshd.getSubsystemFactories(); - sshd.setSubsystemFactories(Collections.singletonList(factory)); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - for (DirEntry entry : sftp.readDir(remotePath)) { - String fileName = entry.getFilename(); - if (".".equals(fileName) || "..".equals(fileName)) { - continue; - } - - Attributes attrs = validateSftpFileTypeAndPermissions(fileName, getTestedVersion(), entry.getAttributes()); - List<AclEntry> aclActual = attrs.getAcl(); - if (getTestedVersion() == SftpConstants.SFTP_V3) { - assertNull("Unexpected ACL for entry=" + fileName, aclActual); - } else { - assertListEquals("Mismatched ACL for entry=" + fileName, aclExpected, aclActual); - } - - attrs.getFlags().clear(); - attrs.setAcl(aclExpected); - sftp.setStat(remotePath + "/" + fileName, attrs); - if (getTestedVersion() > SftpConstants.SFTP_V3) { - numInvoked++; - } - } - } - } finally { - sshd.setSubsystemFactories(factories); - } - - assertEquals("Mismatched invocations count", numInvoked, numInvocations.get()); - } - - @Test // see SSHD-575 - public void testSftpExtensionsEncodeDecode() throws Exception { - final Class<?> anchor = getClass(); - final Map<String, String> expExtensions = GenericUtils.<String, String>mapBuilder() - .put("class", anchor.getSimpleName()) - .put("package", anchor.getPackage().getName()) - .put("method", getCurrentTestName()) - .build(); - - final AtomicInteger numInvocations = new AtomicInteger(0); - SftpSubsystemFactory factory = new SftpSubsystemFactory() { - @Override - public Command create() { - SftpSubsystem subsystem = new SftpSubsystem(getExecutorService(), isShutdownOnExit(), - getUnsupportedAttributePolicy(), getFileSystemAccessor(), getErrorStatusDataHandler()) { - @Override - protected NavigableMap<String, Object> resolveFileAttributes(Path file, int flags, LinkOption... options) throws IOException { - NavigableMap<String, Object> attrs = super.resolveFileAttributes(file, flags, options); - if (GenericUtils.isEmpty(attrs)) { - attrs = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - } - - @SuppressWarnings("unchecked") - Map<String, String> actExtensions = (Map<String, String>) attrs.put("extended", expExtensions); - if (actExtensions != null) { - log.info("resolveFileAttributes(" + file + ") replaced extensions: " + actExtensions); - } - return attrs; - } - - @Override - protected void setFileExtensions(Path file, Map<String, byte[]> extensions, LinkOption... options) throws IOException { - assertExtensionsMapEquals("setFileExtensions(" + file + ")", expExtensions, extensions); - numInvocations.incrementAndGet(); - - int currentVersion = getTestedVersion(); - try { - super.setFileExtensions(file, extensions, options); - assertFalse("Expected exception not generated for version=" + currentVersion, currentVersion >= SftpConstants.SFTP_V6); - } catch (UnsupportedOperationException e) { - assertTrue("Unexpected exception for version=" + currentVersion, currentVersion >= SftpConstants.SFTP_V6); - } - } - }; - Collection<? extends SftpEventListener> listeners = getRegisteredListeners(); - if (GenericUtils.size(listeners) > 0) { - for (SftpEventListener l : listeners) { - subsystem.addSftpEventListener(l); - } - } - - return subsystem; - } - }; - - factory.addSftpEventListener(new AbstractSftpEventListenerAdapter() { - @Override - public void modifyingAttributes(ServerSession session, Path path, Map<String, ?> attrs) { - @SuppressWarnings("unchecked") - Map<String, byte[]> actExtensions = GenericUtils.isEmpty(attrs) ? null : (Map<String, byte[]>) attrs.get("extended"); - assertExtensionsMapEquals("modifying(" + path + ")", expExtensions, actExtensions); - } - - @Override - public void modifiedAttributes(ServerSession session, Path path, Map<String, ?> attrs, Throwable thrown) { - @SuppressWarnings("unchecked") - Map<String, byte[]> actExtensions = GenericUtils.isEmpty(attrs) ? null : (Map<String, byte[]>) attrs.get("extended"); - assertExtensionsMapEquals("modified(" + path + ")", expExtensions, actExtensions); - } - }); - - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Files.createDirectories(lclSftp.resolve("sub-folder")); - Path lclFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + "-" + getTestedVersion() + ".txt"); - Files.write(lclFile, getClass().getName().getBytes(StandardCharsets.UTF_8)); - - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, lclSftp); - int numInvoked = 0; - - List<NamedFactory<Command>> factories = sshd.getSubsystemFactories(); - sshd.setSubsystemFactories(Collections.singletonList(factory)); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - for (DirEntry entry : sftp.readDir(remotePath)) { - String fileName = entry.getFilename(); - if (".".equals(fileName) || "..".equals(fileName)) { - continue; - } - - Attributes attrs = validateSftpFileTypeAndPermissions(fileName, getTestedVersion(), entry.getAttributes()); - Map<String, byte[]> actExtensions = attrs.getExtensions(); - assertExtensionsMapEquals("dirEntry=" + fileName, expExtensions, actExtensions); - attrs.getFlags().clear(); - attrs.setStringExtensions(expExtensions); - sftp.setStat(remotePath + "/" + fileName, attrs); - numInvoked++; - } - } - } finally { - sshd.setSubsystemFactories(factories); - } - - assertEquals("Mismatched invocations count", numInvoked, numInvocations.get()); - } - - @Test // see SSHD-623 - public void testEndOfListIndicator() throws Exception { - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient(getTestedVersion())) { - AtomicReference<Boolean> eolIndicator = new AtomicReference<>(); - int version = sftp.getVersion(); - Path targetPath = detectTargetFolder(); - Path parentPath = targetPath.getParent(); - String remotePath = Utils.resolveRelativeRemotePath(parentPath, targetPath); - - try (CloseableHandle handle = sftp.openDir(remotePath)) { - List<DirEntry> entries = sftp.readDir(handle, eolIndicator); - for (int index = 1; entries != null; entries = sftp.readDir(handle, eolIndicator), index++) { - Boolean value = eolIndicator.get(); - if (version < SftpConstants.SFTP_V6) { - assertNull("Unexpected indicator value at iteration #" + index, value); - } else { - assertNotNull("No indicator returned at iteration #" + index, value); - if (value) { - break; - } - } - eolIndicator.set(null); // make sure starting fresh - } - - Boolean value = eolIndicator.get(); - if (version < SftpConstants.SFTP_V6) { - assertNull("Unexpected end-of-list indication received at end of entries", value); - assertNull("Unexpected no last entries indication", entries); - } else { - assertNotNull("No end-of-list indication received at end of entries", value); - assertNotNull("No last received entries", entries); - assertTrue("Bad end-of-list value", value); - } - } - } - } - } - - @Override - public String toString() { - return getClass().getSimpleName() + "[" + getTestedVersion() + "]"; - } - - public static void assertExtensionsMapEquals(String message, Map<String, String> expected, Map<String, byte[]> actual) { - assertMapEquals(message, expected, SftpHelper.toStringExtensions(actual)); - } - - private static Attributes validateSftpFileTypeAndPermissions(String fileName, int version, Attributes attrs) { - int actualPerms = attrs.getPermissions(); - if (version == SftpConstants.SFTP_V3) { - int expected = SftpHelper.permissionsToFileType(actualPerms); - assertEquals(fileName + ": Mismatched file type", expected, attrs.getType()); - } else { - int expected = SftpHelper.fileTypeToPermission(attrs.getType()); - assertTrue(fileName + ": Missing permision=0x" + Integer.toHexString(expected) + " in 0x" + Integer.toHexString(actualPerms), - (actualPerms & expected) == expected); - } - - return attrs; - } -}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/BuiltinSftpClientExtensionsTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/BuiltinSftpClientExtensionsTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/BuiltinSftpClientExtensionsTest.java deleted file mode 100644 index e05105d..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/BuiltinSftpClientExtensionsTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions; - -import org.apache.sshd.client.subsystem.sftp.RawSftpClient; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.util.test.BaseTestSupport; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; -import org.mockito.Mockito; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class BuiltinSftpClientExtensionsTest extends BaseTestSupport { - public BuiltinSftpClientExtensionsTest() { - super(); - } - - @Test - public void testFromName() { - for (String name : new String[]{null, "", getCurrentTestName()}) { - assertNull("Unexpected result for name='" + name + "'", BuiltinSftpClientExtensions.fromName(name)); - } - - for (BuiltinSftpClientExtensions expected : BuiltinSftpClientExtensions.VALUES) { - String name = expected.getName(); - for (int index = 0; index < name.length(); index++) { - BuiltinSftpClientExtensions actual = BuiltinSftpClientExtensions.fromName(name); - assertSame(name, expected, actual); - name = shuffleCase(name); - } - } - } - - @Test - public void testFromType() { - for (Class<?> clazz : new Class<?>[]{null, getClass(), SftpClientExtension.class}) { - assertNull("Unexpected value for class=" + clazz, BuiltinSftpClientExtensions.fromType(clazz)); - } - - for (BuiltinSftpClientExtensions expected : BuiltinSftpClientExtensions.VALUES) { - Class<?> type = expected.getType(); - BuiltinSftpClientExtensions actual = BuiltinSftpClientExtensions.fromType(type); - assertSame(type.getSimpleName(), expected, actual); - } - } - - @Test - public void testFromInstance() { - for (Object instance : new Object[]{null, this}) { - assertNull("Unexpected value for " + instance, BuiltinSftpClientExtensions.fromInstance(instance)); - } - - SftpClient mockClient = Mockito.mock(SftpClient.class); - RawSftpClient mockRaw = Mockito.mock(RawSftpClient.class); - - for (BuiltinSftpClientExtensions expected : BuiltinSftpClientExtensions.VALUES) { - SftpClientExtension e = expected.create(mockClient, mockRaw); - BuiltinSftpClientExtensions actual = BuiltinSftpClientExtensions.fromInstance(e); - assertSame(expected.getName(), expected, actual); - assertEquals("Mismatched extension name", expected.getName(), actual.getName()); - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractCheckFileExtensionTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractCheckFileExtensionTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractCheckFileExtensionTest.java deleted file mode 100644 index b491c61..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractCheckFileExtensionTest.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.helpers; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.SftpClient.CloseableHandle; -import org.apache.sshd.client.subsystem.sftp.extensions.CheckFileHandleExtension; -import org.apache.sshd.client.subsystem.sftp.extensions.CheckFileNameExtension; -import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.common.NamedResource; -import org.apache.sshd.common.digest.BuiltinDigests; -import org.apache.sshd.common.digest.Digest; -import org.apache.sshd.common.digest.DigestFactory; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.SftpException; -import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.NumberUtils; -import org.apache.sshd.common.util.buffer.BufferUtils; -import org.apache.sshd.common.util.io.IoUtils; -import org.apache.sshd.util.test.JUnit4ClassRunnerWithParametersFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.runners.Parameterized.UseParametersRunnerFactory; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(Parameterized.class) // see https://github.com/junit-team/junit/wiki/Parameterized-tests -@UseParametersRunnerFactory(JUnit4ClassRunnerWithParametersFactory.class) -public class AbstractCheckFileExtensionTest extends AbstractSftpClientTestSupport { - private static final Collection<Integer> DATA_SIZES = - Collections.unmodifiableList( - Arrays.asList( - (int) Byte.MAX_VALUE, - SftpConstants.MIN_CHKFILE_BLOCKSIZE, - IoUtils.DEFAULT_COPY_SIZE, - Byte.SIZE * IoUtils.DEFAULT_COPY_SIZE - )); - private static final Collection<Integer> BLOCK_SIZES = - Collections.unmodifiableList( - Arrays.asList( - 0, - SftpConstants.MIN_CHKFILE_BLOCKSIZE, - 1024, - IoUtils.DEFAULT_COPY_SIZE - )); - private static final Collection<Object[]> PARAMETERS; - - static { - Collection<Object[]> list = new ArrayList<>(); - for (DigestFactory factory : BuiltinDigests.VALUES) { - if (!factory.isSupported()) { - System.out.println("Skip unsupported digest=" + factory.getAlgorithm()); - continue; - } - - String algorithm = factory.getName(); - for (Number dataSize : DATA_SIZES) { - for (Number blockSize : BLOCK_SIZES) { - list.add(new Object[]{algorithm, dataSize, blockSize}); - } - } - } - PARAMETERS = list; - } - - - private final String algorithm; - private final int dataSize; - private final int blockSize; - - public AbstractCheckFileExtensionTest(String algorithm, int dataSize, int blockSize) throws IOException { - this.algorithm = algorithm; - this.dataSize = dataSize; - this.blockSize = blockSize; - } - - @Parameters(name = "{0} - dataSize={1}, blockSize={2}") - public static Collection<Object[]> parameters() { - return PARAMETERS; - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testCheckFileExtension() throws Exception { - testCheckFileExtension(algorithm, dataSize, blockSize); - } - - private void testCheckFileExtension(String expectedAlgorithm, int inputDataSize, int hashBlockSize) throws Exception { - NamedFactory<? extends Digest> factory = BuiltinDigests.fromFactoryName(expectedAlgorithm); - Digest digest = null; - if (blockSize == 0) { - digest = factory.create(); - digest.init(); - } - - byte[] seed = (getClass().getName() + "#" + getCurrentTestName() - + "-" + expectedAlgorithm - + "-" + inputDataSize + "/" + hashBlockSize - + IoUtils.EOL) - .getBytes(StandardCharsets.UTF_8); - - try (ByteArrayOutputStream baos = new ByteArrayOutputStream(inputDataSize + seed.length)) { - while (baos.size() < inputDataSize) { - baos.write(seed); - - if (digest != null) { - digest.update(seed); - } - } - - testCheckFileExtension(factory, baos.toByteArray(), hashBlockSize, (digest == null) ? null : digest.digest()); - } - } - - @SuppressWarnings("checkstyle:nestedtrydepth") - private void testCheckFileExtension(NamedFactory<? extends Digest> factory, byte[] data, int hashBlockSize, byte[] expectedHash) throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path srcFile = assertHierarchyTargetFolderExists(lclSftp).resolve(factory.getName() + "-data-" + data.length + "-" + hashBlockSize + ".txt"); - Files.write(srcFile, data, IoUtils.EMPTY_OPEN_OPTIONS); - - List<String> algorithms = new ArrayList<>(BuiltinDigests.VALUES.size()); - // put the selected algorithm 1st and then the rest - algorithms.add(factory.getName()); - for (NamedFactory<? extends Digest> f : BuiltinDigests.VALUES) { - if (f == factory) { - continue; - } - - algorithms.add(f.getName()); - } - - Path parentPath = targetPath.getParent(); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - String srcFolder = Utils.resolveRelativeRemotePath(parentPath, srcFile.getParent()); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - CheckFileNameExtension file = assertExtensionCreated(sftp, CheckFileNameExtension.class); - try { - Map.Entry<String, ?> result = file.checkFileName(srcFolder, algorithms, 0L, 0L, hashBlockSize); - fail("Unexpected success to hash folder=" + srcFolder + ": " + result.getKey()); - } catch (IOException e) { // expected - not allowed to hash a folder - assertTrue("Not an SftpException", e instanceof SftpException); - } - - CheckFileHandleExtension hndl = assertExtensionCreated(sftp, CheckFileHandleExtension.class); - try (CloseableHandle dirHandle = sftp.openDir(srcFolder)) { - try { - Map.Entry<String, ?> result = hndl.checkFileHandle(dirHandle, algorithms, 0L, 0L, hashBlockSize); - fail("Unexpected handle success on folder=" + srcFolder + ": " + result.getKey()); - } catch (IOException e) { // expected - not allowed to hash a folder - assertTrue("Not an SftpException", e instanceof SftpException); - } - } - - validateHashResult(file, file.checkFileName(srcPath, algorithms, 0L, 0L, hashBlockSize), algorithms.get(0), expectedHash); - try (CloseableHandle fileHandle = sftp.open(srcPath, SftpClient.OpenMode.Read)) { - validateHashResult(hndl, hndl.checkFileHandle(fileHandle, algorithms, 0L, 0L, hashBlockSize), algorithms.get(0), expectedHash); - } - } - } - } - - private void validateHashResult(NamedResource hasher, Map.Entry<String, ? extends Collection<byte[]>> result, String expectedAlgorithm, byte[] expectedHash) { - String name = hasher.getName(); - assertNotNull("No result for hash=" + name, result); - assertEquals("Mismatched hash algorithms for " + name, expectedAlgorithm, result.getKey()); - - if (NumberUtils.length(expectedHash) > 0) { - Collection<byte[]> values = result.getValue(); - assertEquals("Mismatched hash values count for " + name, 1, GenericUtils.size(values)); - - byte[] actualHash = values.iterator().next(); - if (!Arrays.equals(expectedHash, actualHash)) { - fail("Mismatched hashes for " + name - + ": expected=" + BufferUtils.toHex(':', expectedHash) - + ", actual=" + BufferUtils.toHex(':', expectedHash)); - } - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractMD5HashExtensionTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractMD5HashExtensionTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractMD5HashExtensionTest.java deleted file mode 100644 index fc3c607..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/AbstractMD5HashExtensionTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.helpers; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.SftpClient.CloseableHandle; -import org.apache.sshd.client.subsystem.sftp.extensions.MD5FileExtension; -import org.apache.sshd.client.subsystem.sftp.extensions.MD5HandleExtension; -import org.apache.sshd.common.digest.BuiltinDigests; -import org.apache.sshd.common.digest.Digest; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.SftpException; -import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.buffer.BufferUtils; -import org.apache.sshd.common.util.io.IoUtils; -import org.apache.sshd.util.test.JUnit4ClassRunnerWithParametersFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Assume; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.runners.Parameterized.UseParametersRunnerFactory; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(Parameterized.class) // see https://github.com/junit-team/junit/wiki/Parameterized-tests -@UseParametersRunnerFactory(JUnit4ClassRunnerWithParametersFactory.class) -public class AbstractMD5HashExtensionTest extends AbstractSftpClientTestSupport { - private static final List<Integer> DATA_SIZES = - Collections.unmodifiableList( - Arrays.asList( - (int) Byte.MAX_VALUE, - SftpConstants.MD5_QUICK_HASH_SIZE, - IoUtils.DEFAULT_COPY_SIZE, - Byte.SIZE * IoUtils.DEFAULT_COPY_SIZE - )); - - private final int size; - - public AbstractMD5HashExtensionTest(int size) throws IOException { - this.size = size; - } - - @Parameters(name = "dataSize={0}") - public static Collection<Object[]> parameters() { - return parameterize(DATA_SIZES); - } - - @BeforeClass - public static void checkMD5Supported() { - Assume.assumeTrue("MD5 not supported", BuiltinDigests.md5.isSupported()); - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testMD5HashExtension() throws Exception { - testMD5HashExtension(size); - } - - private void testMD5HashExtension(int dataSize) throws Exception { - byte[] seed = (getClass().getName() + "#" + getCurrentTestName() + "-" + dataSize + IoUtils.EOL).getBytes(StandardCharsets.UTF_8); - try (ByteArrayOutputStream baos = new ByteArrayOutputStream(dataSize + seed.length)) { - while (baos.size() < dataSize) { - baos.write(seed); - } - - testMD5HashExtension(baos.toByteArray()); - } - } - - @SuppressWarnings("checkstyle:nestedtrydepth") - private void testMD5HashExtension(byte[] data) throws Exception { - Digest digest = BuiltinDigests.md5.create(); - digest.init(); - digest.update(data); - - byte[] expectedHash = digest.digest(); - byte[] quickHash = expectedHash; - if (data.length > SftpConstants.MD5_QUICK_HASH_SIZE) { - byte[] quickData = new byte[SftpConstants.MD5_QUICK_HASH_SIZE]; - System.arraycopy(data, 0, quickData, 0, quickData.length); - digest = BuiltinDigests.md5.create(); - digest.init(); - digest.update(quickData); - quickHash = digest.digest(); - } - - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path srcFile = assertHierarchyTargetFolderExists(lclSftp).resolve("data-" + data.length + ".txt"); - Files.write(srcFile, data, IoUtils.EMPTY_OPEN_OPTIONS); - - Path parentPath = targetPath.getParent(); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - String srcFolder = Utils.resolveRelativeRemotePath(parentPath, srcFile.getParent()); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - MD5FileExtension file = assertExtensionCreated(sftp, MD5FileExtension.class); - try { - byte[] actual = file.getHash(srcFolder, 0L, 0L, quickHash); - fail("Unexpected file success on folder=" + srcFolder + ": " + BufferUtils.toHex(':', actual)); - } catch (IOException e) { // expected - not allowed to hash a folder - assertTrue("Not an SftpException for file hash on " + srcFolder, e instanceof SftpException); - } - - MD5HandleExtension hndl = assertExtensionCreated(sftp, MD5HandleExtension.class); - try (CloseableHandle dirHandle = sftp.openDir(srcFolder)) { - try { - byte[] actual = hndl.getHash(dirHandle, 0L, 0L, quickHash); - fail("Unexpected handle success on folder=" + srcFolder + ": " + BufferUtils.toHex(':', actual)); - } catch (IOException e) { // expected - not allowed to hash a folder - assertTrue("Not an SftpException for handle hash on " + srcFolder, e instanceof SftpException); - } - } - - try (CloseableHandle fileHandle = sftp.open(srcPath, SftpClient.OpenMode.Read)) { - for (byte[] qh : new byte[][]{GenericUtils.EMPTY_BYTE_ARRAY, quickHash}) { - for (boolean useFile : new boolean[]{true, false}) { - byte[] actualHash = useFile ? file.getHash(srcPath, 0L, 0L, qh) : hndl.getHash(fileHandle, 0L, 0L, qh); - String type = useFile ? file.getClass().getSimpleName() : hndl.getClass().getSimpleName(); - if (!Arrays.equals(expectedHash, actualHash)) { - fail("Mismatched hash for quick=" + BufferUtils.toHex(':', qh) - + " using " + type + " on " + srcFile - + ": expected=" + BufferUtils.toHex(':', expectedHash) - + ", actual=" + BufferUtils.toHex(':', actualHash)); - } - } - } - } - } - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyDataExtensionImplTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyDataExtensionImplTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyDataExtensionImplTest.java deleted file mode 100644 index 473ad1f..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyDataExtensionImplTest.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.helpers; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.SftpClient.CloseableHandle; -import org.apache.sshd.client.subsystem.sftp.extensions.CopyDataExtension; -import org.apache.sshd.common.Factory; -import org.apache.sshd.common.random.Random; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.util.io.IoUtils; -import org.apache.sshd.util.test.JUnit4ClassRunnerWithParametersFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.runners.Parameterized.UseParametersRunnerFactory; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(Parameterized.class) // see https://github.com/junit-team/junit/wiki/Parameterized-tests -@UseParametersRunnerFactory(JUnit4ClassRunnerWithParametersFactory.class) -public class CopyDataExtensionImplTest extends AbstractSftpClientTestSupport { - private static final List<Object[]> PARAMETERS = - Collections.unmodifiableList( - Arrays.asList( - new Object[]{ - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE), - Integer.valueOf(0), - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE), - Long.valueOf(0L) - }, - new Object[]{ - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE), - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE / 2), - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE / 4), - Long.valueOf(0L) - }, - new Object[]{ - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE), - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE / 2), - Integer.valueOf(IoUtils.DEFAULT_COPY_SIZE / 4), - Long.valueOf(IoUtils.DEFAULT_COPY_SIZE / 2) - }, - new Object[]{ - Integer.valueOf(Byte.MAX_VALUE), - Integer.valueOf(Byte.MAX_VALUE / 2), - Integer.valueOf(Byte.MAX_VALUE), // attempt to read more than available - Long.valueOf(0L) - } - )); - - private int size; - private int srcOffset; - private int length; - private long dstOffset; - - public CopyDataExtensionImplTest(int size, int srcOffset, int length, long dstOffset) throws IOException { - this.size = size; - this.srcOffset = srcOffset; - this.length = length; - this.dstOffset = dstOffset; - } - - @Parameters(name = "size={0}, readOffset={1}, readLength={2}, writeOffset={3}") - public static Collection<Object[]> parameters() { - return PARAMETERS; - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testCopyDataExtension() throws Exception { - testCopyDataExtension(size, srcOffset, length, dstOffset); - } - - private void testCopyDataExtension(int dataSize, int readOffset, int readLength, long writeOffset) throws Exception { - byte[] seed = (getClass().getName() + "#" + getCurrentTestName() - + "-" + dataSize - + "-" + readOffset + "/" + readLength + "/" + writeOffset - + IoUtils.EOL) - .getBytes(StandardCharsets.UTF_8); - try (ByteArrayOutputStream baos = new ByteArrayOutputStream(dataSize + seed.length)) { - while (baos.size() < dataSize) { - baos.write(seed); - } - - testCopyDataExtension(baos.toByteArray(), readOffset, readLength, writeOffset); - } - } - - private void testCopyDataExtension(byte[] data, int readOffset, int readLength, long writeOffset) throws Exception { - Path targetPath = detectTargetFolder(); - Path parentPath = targetPath.getParent(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - LinkOption[] options = IoUtils.getLinkOptions(true); - String baseName = readOffset + "-" + readLength + "-" + writeOffset; - Path srcFile = assertHierarchyTargetFolderExists(lclSftp, options).resolve(baseName + "-src.txt"); - Files.write(srcFile, data, IoUtils.EMPTY_OPEN_OPTIONS); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - - Path dstFile = srcFile.getParent().resolve(baseName + "-dst.txt"); - if (Files.exists(dstFile, options)) { - Files.delete(dstFile); - } - String dstPath = Utils.resolveRelativeRemotePath(parentPath, dstFile); - if (writeOffset > 0L) { - Factory<? extends Random> factory = client.getRandomFactory(); - Random randomizer = factory.create(); - long totalLength = writeOffset + readLength; - byte[] workBuf = new byte[(int) Math.min(totalLength, IoUtils.DEFAULT_COPY_SIZE)]; - try (OutputStream output = Files.newOutputStream(dstFile, IoUtils.EMPTY_OPEN_OPTIONS)) { - while (totalLength > 0L) { - randomizer.fill(workBuf); - output.write(workBuf); - totalLength -= workBuf.length; - } - } - } - - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - CopyDataExtension ext = assertExtensionCreated(sftp, CopyDataExtension.class); - try (CloseableHandle readHandle = sftp.open(srcPath, SftpClient.OpenMode.Read); - CloseableHandle writeHandle = sftp.open(dstPath, SftpClient.OpenMode.Write, SftpClient.OpenMode.Create)) { - ext.copyData(readHandle, readOffset, readLength, writeHandle, writeOffset); - } - } - } - - int available = data.length; - int required = readOffset + readLength; - if (required > available) { - required = available; - } - byte[] expected = new byte[required - readOffset]; - System.arraycopy(data, readOffset, expected, 0, expected.length); - - byte[] actual = new byte[expected.length]; - try (FileChannel channel = FileChannel.open(dstFile, IoUtils.EMPTY_OPEN_OPTIONS)) { - int readLen = channel.read(ByteBuffer.wrap(actual), writeOffset); - assertEquals("Mismatched read data size", expected.length, readLen); - } - assertArrayEquals("Mismatched copy data", expected, actual); - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyFileExtensionImplTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyFileExtensionImplTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyFileExtensionImplTest.java deleted file mode 100644 index 309a145..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/CopyFileExtensionImplTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.helpers; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.extensions.CopyFileExtension; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.SftpException; -import org.apache.sshd.common.util.io.IoUtils; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class CopyFileExtensionImplTest extends AbstractSftpClientTestSupport { - public CopyFileExtensionImplTest() throws IOException { - super(); - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testCopyFileExtension() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName(), getCurrentTestName()); - Utils.deleteRecursive(lclSftp); - - byte[] data = (getClass().getName() + "#" + getCurrentTestName()).getBytes(StandardCharsets.UTF_8); - Path srcFile = assertHierarchyTargetFolderExists(lclSftp).resolve("src.txt"); - Files.write(srcFile, data, IoUtils.EMPTY_OPEN_OPTIONS); - - Path parentPath = targetPath.getParent(); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - Path dstFile = lclSftp.resolve("dst.txt"); - String dstPath = Utils.resolveRelativeRemotePath(parentPath, dstFile); - - LinkOption[] options = IoUtils.getLinkOptions(true); - assertFalse("Destination file unexpectedly exists", Files.exists(dstFile, options)); - - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - CopyFileExtension ext = assertExtensionCreated(sftp, CopyFileExtension.class); - ext.copyFile(srcPath, dstPath, false); - assertTrue("Source file not preserved", Files.exists(srcFile, options)); - assertTrue("Destination file not created", Files.exists(dstFile, options)); - - byte[] actual = Files.readAllBytes(dstFile); - assertArrayEquals("Mismatched copied data", data, actual); - - try { - ext.copyFile(srcPath, dstPath, false); - fail("Unexpected success to overwrite existing destination: " + dstFile); - } catch (IOException e) { - assertTrue("Not an SftpException", e instanceof SftpException); - } - } - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java deleted file mode 100644 index 1a879ec..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.helpers; - -import java.io.IOException; -import java.io.StreamCorruptedException; -import java.nio.file.FileStore; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.extensions.SpaceAvailableExtension; -import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.extensions.SpaceAvailableExtensionInfo; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystem; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class SpaceAvailableExtensionImplTest extends AbstractSftpClientTestSupport { - public SpaceAvailableExtensionImplTest() throws IOException { - super(); - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testFileStoreReport() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName(), getCurrentTestName()); - Path parentPath = targetPath.getParent(); - FileStore store = Files.getFileStore(lclSftp.getRoot()); - final String queryPath = Utils.resolveRelativeRemotePath(parentPath, lclSftp); - final SpaceAvailableExtensionInfo expected = new SpaceAvailableExtensionInfo(store); - - List<NamedFactory<Command>> factories = sshd.getSubsystemFactories(); - sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory() { - @Override - public Command create() { - return new SftpSubsystem(getExecutorService(), isShutdownOnExit(), - getUnsupportedAttributePolicy(), getFileSystemAccessor(), getErrorStatusDataHandler()) { - @Override - protected SpaceAvailableExtensionInfo doSpaceAvailable(int id, String path) throws IOException { - if (!queryPath.equals(path)) { - throw new StreamCorruptedException("Mismatched query paths: expected=" + queryPath + ", actual=" + path); - } - - return expected; - } - }; - } - })); - - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - SpaceAvailableExtension ext = assertExtensionCreated(sftp, SpaceAvailableExtension.class); - SpaceAvailableExtensionInfo actual = ext.available(queryPath); - assertEquals("Mismatched information", expected, actual); - } - } finally { - sshd.setSubsystemFactories(factories); - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java b/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java deleted file mode 100644 index 9a24863..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * 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.sshd.client.subsystem.sftp.extensions.openssh.helpers; - -import java.io.IOException; -import java.io.StreamCorruptedException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import org.apache.sshd.client.SshClient; -import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.AbstractSftpClientTestSupport; -import org.apache.sshd.client.subsystem.sftp.SftpClient; -import org.apache.sshd.client.subsystem.sftp.SftpClient.CloseableHandle; -import org.apache.sshd.client.subsystem.sftp.extensions.openssh.OpenSSHFsyncExtension; -import org.apache.sshd.client.subsystem.sftp.extensions.openssh.OpenSSHStatExtensionInfo; -import org.apache.sshd.client.subsystem.sftp.extensions.openssh.OpenSSHStatHandleExtension; -import org.apache.sshd.client.subsystem.sftp.extensions.openssh.OpenSSHStatPathExtension; -import org.apache.sshd.common.subsystem.sftp.SftpConstants; -import org.apache.sshd.common.subsystem.sftp.extensions.openssh.AbstractOpenSSHExtensionParser.OpenSSHExtension; -import org.apache.sshd.common.subsystem.sftp.extensions.openssh.FstatVfsExtensionParser; -import org.apache.sshd.common.subsystem.sftp.extensions.openssh.StatVfsExtensionParser; -import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.buffer.Buffer; -import org.apache.sshd.common.util.io.IoUtils; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.session.ServerSession; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystem; -import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; -import org.apache.sshd.util.test.Utils; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class OpenSSHExtensionsTest extends AbstractSftpClientTestSupport { - public OpenSSHExtensionsTest() throws IOException { - super(); - } - - @Before - public void setUp() throws Exception { - setupServer(); - } - - @Test - public void testFsync() throws IOException { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path srcFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + ".txt"); - byte[] expected = (getClass().getName() + "#" + getCurrentTestName()).getBytes(StandardCharsets.UTF_8); - - Path parentPath = targetPath.getParent(); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - OpenSSHFsyncExtension fsync = assertExtensionCreated(sftp, OpenSSHFsyncExtension.class); - try (CloseableHandle fileHandle = sftp.open(srcPath, SftpClient.OpenMode.Write, SftpClient.OpenMode.Create)) { - sftp.write(fileHandle, 0L, expected); - fsync.fsync(fileHandle); - - byte[] actual = Files.readAllBytes(srcFile); - assertArrayEquals("Mismatched written data", expected, actual); - } - } - } - } - - @Test - public void testStat() throws Exception { - Path targetPath = detectTargetFolder(); - Path lclSftp = Utils.resolve(targetPath, SftpConstants.SFTP_SUBSYSTEM_NAME, getClass().getSimpleName()); - Path srcFile = assertHierarchyTargetFolderExists(lclSftp).resolve(getCurrentTestName() + ".txt"); - Files.write(srcFile, (getClass().getName() + "#" + getCurrentTestName()).getBytes(StandardCharsets.UTF_8), IoUtils.EMPTY_OPEN_OPTIONS); - Path parentPath = targetPath.getParent(); - String srcPath = Utils.resolveRelativeRemotePath(parentPath, srcFile); - - final AtomicReference<String> extensionHolder = new AtomicReference<>(null); - final OpenSSHStatExtensionInfo expected = new OpenSSHStatExtensionInfo(); - expected.f_bavail = Short.MAX_VALUE; - expected.f_bfree = Integer.MAX_VALUE; - expected.f_blocks = Short.MAX_VALUE; - expected.f_bsize = IoUtils.DEFAULT_COPY_SIZE; - expected.f_favail = Long.MAX_VALUE; - expected.f_ffree = Byte.MAX_VALUE; - expected.f_files = 3777347L; - expected.f_flag = OpenSSHStatExtensionInfo.SSH_FXE_STATVFS_ST_RDONLY; - expected.f_frsize = 7365L; - expected.f_fsid = 1L; - expected.f_namemax = 256; - - sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory() { - @Override - public Command create() { - return new SftpSubsystem(getExecutorService(), isShutdownOnExit(), - getUnsupportedAttributePolicy(), getFileSystemAccessor(), getErrorStatusDataHandler()) { - @Override - protected List<OpenSSHExtension> resolveOpenSSHExtensions(ServerSession session) { - List<OpenSSHExtension> original = super.resolveOpenSSHExtensions(session); - int numOriginal = GenericUtils.size(original); - List<OpenSSHExtension> result = new ArrayList<>(numOriginal + 2); - if (numOriginal > 0) { - result.addAll(original); - } - - for (String name : new String[]{StatVfsExtensionParser.NAME, FstatVfsExtensionParser.NAME}) { - result.add(new OpenSSHExtension(name, "2")); - } - - return result; - } - - @Override - protected void executeExtendedCommand(Buffer buffer, int id, String extension) throws IOException { - if (StatVfsExtensionParser.NAME.equals(extension) - || FstatVfsExtensionParser.NAME.equals(extension)) { - String prev = extensionHolder.getAndSet(extension); - if (prev != null) { - throw new StreamCorruptedException("executeExtendedCommand(" + extension + ") previous not null: " + prev); - } - - buffer.clear(); - buffer.putByte((byte) SftpConstants.SSH_FXP_EXTENDED_REPLY); - buffer.putInt(id); - OpenSSHStatExtensionInfo.encode(buffer, expected); - send(buffer); - } else { - super.executeExtendedCommand(buffer, id, extension); - } - } - }; - } - })); - - try (SshClient client = setupTestClient()) { - client.start(); - - try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) { - session.addPasswordIdentity(getCurrentTestName()); - session.auth().verify(5L, TimeUnit.SECONDS); - - try (SftpClient sftp = session.createSftpClient()) { - OpenSSHStatPathExtension pathStat = assertExtensionCreated(sftp, OpenSSHStatPathExtension.class); - OpenSSHStatExtensionInfo actual = pathStat.stat(srcPath); - String invokedExtension = extensionHolder.getAndSet(null); - assertEquals("Mismatched invoked extension", pathStat.getName(), invokedExtension); - assertOpenSSHStatExtensionInfoEquals(invokedExtension, expected, actual); - - try (CloseableHandle handle = sftp.open(srcPath)) { - OpenSSHStatHandleExtension handleStat = assertExtensionCreated(sftp, OpenSSHStatHandleExtension.class); - actual = handleStat.stat(handle); - invokedExtension = extensionHolder.getAndSet(null); - assertEquals("Mismatched invoked extension", handleStat.getName(), invokedExtension); - assertOpenSSHStatExtensionInfoEquals(invokedExtension, expected, actual); - } - } - } - } - } - - private static void assertOpenSSHStatExtensionInfoEquals(String extension, OpenSSHStatExtensionInfo expected, OpenSSHStatExtensionInfo actual) throws Exception { - Field[] fields = expected.getClass().getFields(); - for (Field f : fields) { - String name = f.getName(); - int mod = f.getModifiers(); - if (Modifier.isStatic(mod)) { - continue; - } - - Object expValue = f.get(expected); - Object actValue = f.get(actual); - assertEquals(extension + "[" + name + "]", expValue, actValue); - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/251db9b9/sshd-core/src/test/java/org/apache/sshd/common/channel/TestChannelListener.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/common/channel/TestChannelListener.java b/sshd-core/src/test/java/org/apache/sshd/common/channel/TestChannelListener.java deleted file mode 100644 index 6f8a128..0000000 --- a/sshd-core/src/test/java/org/apache/sshd/common/channel/TestChannelListener.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.sshd.common.channel; - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import org.apache.sshd.common.NamedResource; -import org.apache.sshd.common.util.logging.AbstractLoggingBean; -import org.junit.Assert; - -/** - * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> - */ -public class TestChannelListener extends AbstractLoggingBean implements ChannelListener, NamedResource { - private final String name; - private final Collection<Channel> activeChannels = new CopyOnWriteArraySet<>(); - private final Semaphore activeChannelsCounter = new Semaphore(0); - private final Collection<Channel> openChannels = new CopyOnWriteArraySet<>(); - private final Semaphore openChannelsCounter = new Semaphore(0); - private final Collection<Channel> failedChannels = new CopyOnWriteArraySet<>(); - private final Semaphore failedChannelsCounter = new Semaphore(0); - private final Map<Channel, Collection<String>> channelStateHints = new ConcurrentHashMap<>(); - private final Semaphore chanelStateCounter = new Semaphore(0); - private final Semaphore modificationsCounter = new Semaphore(0); - private final Semaphore closedChannelsCounter = new Semaphore(0); - - public TestChannelListener(String discriminator) { - super(discriminator); - name = discriminator; - } - - public boolean waitForModification(long timeout, TimeUnit unit) throws InterruptedException { - return modificationsCounter.tryAcquire(timeout, unit); - } - - @Override - public String getName() { - return name; - } - - public Collection<Channel> getActiveChannels() { - return activeChannels; - } - - @Override - public void channelInitialized(Channel channel) { - Assert.assertTrue("Same channel instance re-initialized: " + channel, activeChannels.add(channel)); - activeChannelsCounter.release(); - modificationsCounter.release(); - log.info("channelInitialized({})", channel); - } - - public boolean waitForActiveChannelsChange(long timeout, TimeUnit unit) throws InterruptedException { - return activeChannelsCounter.tryAcquire(timeout, unit); - } - - public Collection<Channel> getOpenChannels() { - return openChannels; - } - - @Override - public void channelOpenSuccess(Channel channel) { - Assert.assertTrue("Open channel not activated: " + channel, activeChannels.contains(channel)); - Assert.assertTrue("Same channel instance re-opened: " + channel, openChannels.add(channel)); - openChannelsCounter.release(); - modificationsCounter.release(); - log.info("channelOpenSuccess({})", channel); - } - - public boolean waitForOpenChannelsChange(long timeout, TimeUnit unit) throws InterruptedException { - return openChannelsCounter.tryAcquire(timeout, unit); - } - - public Collection<Channel> getFailedChannels() { - return failedChannels; - } - - @Override - public void channelOpenFailure(Channel channel, Throwable reason) { - Assert.assertTrue("Failed channel not activated: " + channel, activeChannels.contains(channel)); - Assert.assertTrue("Same channel instance re-failed: " + channel, failedChannels.add(channel)); - failedChannelsCounter.release(); - modificationsCounter.release(); - log.warn("channelOpenFailure({}) {} : {}", channel, reason.getClass().getSimpleName(), reason.getMessage()); - if (log.isDebugEnabled()) { - log.debug("channelOpenFailure(" + channel + ") details", reason); - } - } - - public boolean waitForFailedChannelsChange(long timeout, TimeUnit unit) throws InterruptedException { - return failedChannelsCounter.tryAcquire(timeout, unit); - } - - @Override - public void channelClosed(Channel channel, Throwable reason) { - Assert.assertTrue("Unknown closed channel instance: " + channel, activeChannels.remove(channel)); - activeChannelsCounter.release(); - closedChannelsCounter.release(); - modificationsCounter.release(); - log.info("channelClosed({})", channel); - } - - public boolean waitForClosedChannelsChange(long timeout, TimeUnit unit) throws InterruptedException { - return closedChannelsCounter.tryAcquire(timeout, unit); - } - - public Map<Channel, Collection<String>> getChannelStateHints() { - return channelStateHints; - } - - @Override - public void channelStateChanged(Channel channel, String hint) { - Collection<String> hints; - synchronized (channelStateHints) { - hints = channelStateHints.get(channel); - if (hints == null) { - hints = new CopyOnWriteArrayList<>(); - channelStateHints.put(channel, hints); - } - } - - hints.add(hint); - chanelStateCounter.release(); - modificationsCounter.release(); - } - - @Override - public String toString() { - return getClass().getSimpleName() + "[" + getName() + "]"; - } -} \ No newline at end of file