diff options
Diffstat (limited to 'libs/sftp/src')
3 files changed, 157 insertions, 5 deletions
diff --git a/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpConnection.kt b/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpConnection.kt index ed5889a..6669e13 100644 --- a/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpConnection.kt +++ b/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpConnection.kt @@ -50,11 +50,10 @@ internal class SftpConnection(uri: Uri, credentials: SftpCredentials, hostsStora sftpSession?.unlink(PathUtils.join(baseDir, path)) ?: false fun readLink(path: String): String? { - val target = sftpSession?.readlink(PathUtils.join(baseDir, path)) - if (target?.startsWith(baseDir) == true) { - return target.substring(baseDir.length + 1) - } - return target + val linkPath = PathUtils.join(baseDir, path) + val target = sftpSession?.readlink(linkPath) ?: return null + val parentPath = PathUtils.dirname(linkPath) + return PathUtils.relativeTo(parentPath, target) } fun symlink(target: String, rawTarget: Boolean, path: String): Boolean { diff --git a/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeLocalSftpTest.kt b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeLocalSftpTest.kt new file mode 100644 index 0000000..0e61fa6 --- /dev/null +++ b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeLocalSftpTest.kt @@ -0,0 +1,76 @@ +package org.the_jk.cleversync.sftp + +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.AfterClass +import org.junit.BeforeClass +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.the_jk.cleversync.io.BaseSingleMergeTest +import org.the_jk.cleversync.io.ModifiableTree +import org.the_jk.cleversync.io.sftp.SftpCredentials +import org.the_jk.cleversync.io.sftp.SftpHostsStorage +import org.the_jk.cleversync.local.LocalTreeFactory + +@Config(manifest=Config.NONE) +@RunWith(RobolectricTestRunner::class) +class SingleMergeLocalSftpTest : BaseSingleMergeTest() { + @Rule + @JvmField + val temp = TemporaryFolder() + + private lateinit var hostsStorage: SftpHostsStorage + private lateinit var sftp: ModifiableTree + + @After + fun tearDownTest() { + sftp.close() + + for (file in helper.shareDir.listFiles()!!) { + if (file.isDirectory) { + file.deleteRecursively() + } else { + file.delete() + } + } + } + + override fun source(): ModifiableTree { + return LocalTreeFactory.modifiableTree(temp.root.toPath()) + } + + override fun sourceSupportsSymlinks() = true + + override fun target(): ModifiableTree { + assertThat(helper.shareDir.listFiles()).isEmpty() + + val credentials = SftpCredentials.SftpPasswordCredentials("user", "notverysecret") + + hostsStorage = SftpHostsStorage(ApplicationProvider.getApplicationContext()) + + sftp = SftpTreeFactory.modifiableTree(helper.uri, credentials, hostsStorage).getOrThrow() + return sftp + } + + override fun targetSupportsSymlinks() = true + + companion object { + private val helper = SftpTestHelper() + + @BeforeClass + @JvmStatic + fun setUpClass() { + helper.setUp() + } + + @AfterClass + @JvmStatic + fun tearDownClass() { + helper.tearDown() + } + } +} diff --git a/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeSftpLocalTest.kt b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeSftpLocalTest.kt new file mode 100644 index 0000000..eeb473c --- /dev/null +++ b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeSftpLocalTest.kt @@ -0,0 +1,77 @@ +package org.the_jk.cleversync.sftp + +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.AfterClass +import org.junit.BeforeClass +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.the_jk.cleversync.io.BaseSingleMergeTest +import org.the_jk.cleversync.io.ModifiableTree +import org.the_jk.cleversync.io.sftp.SftpCredentials +import org.the_jk.cleversync.io.sftp.SftpHostsStorage +import org.the_jk.cleversync.local.LocalTreeFactory +import kotlin.time.Duration.Companion.milliseconds + +@Config(manifest=Config.NONE) +@RunWith(RobolectricTestRunner::class) +class SingleMergeSftpLocalTest : BaseSingleMergeTest() { + @Rule + @JvmField + val temp = TemporaryFolder() + + private lateinit var hostsStorage: SftpHostsStorage + private lateinit var sftp: ModifiableTree + + @After + fun tearDownTest() { + sftp.close() + + for (file in helper.shareDir.listFiles()!!) { + if (file.isDirectory) { + file.deleteRecursively() + } else { + file.delete() + } + } + } + + override fun source(): ModifiableTree { + assertThat(helper.shareDir.listFiles()).isEmpty() + + val credentials = SftpCredentials.SftpPasswordCredentials("user", "notverysecret") + + hostsStorage = SftpHostsStorage(ApplicationProvider.getApplicationContext()) + + sftp = SftpTreeFactory.modifiableTree(helper.uri, credentials, hostsStorage).getOrThrow() + return sftp + } + + override fun sourceSupportsSymlinks() = true + + override fun target(): ModifiableTree { + return LocalTreeFactory.modifiableTree(temp.root.toPath()) + } + + override fun targetSupportsSymlinks() = true + + companion object { + private val helper = SftpTestHelper() + + @BeforeClass + @JvmStatic + fun setUpClass() { + helper.setUp() + } + + @AfterClass + @JvmStatic + fun tearDownClass() { + helper.tearDown() + } + } +} |
