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

Reply via email to