summaryrefslogtreecommitdiff
path: root/libs/sftp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/sftp')
-rw-r--r--libs/sftp/build.gradle.kts1
-rw-r--r--libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpConnection.kt9
-rw-r--r--libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeLocalSftpTest.kt76
-rw-r--r--libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SingleMergeSftpLocalTest.kt77
4 files changed, 158 insertions, 5 deletions
diff --git a/libs/sftp/build.gradle.kts b/libs/sftp/build.gradle.kts
index 7b1afb9..e7efd26 100644
--- a/libs/sftp/build.gradle.kts
+++ b/libs/sftp/build.gradle.kts
@@ -65,6 +65,7 @@ android {
dependencies {
implementation(project(":libs:io"))
implementation(project(":libs:utils"))
+ testImplementation(project(":libs:local"))
testImplementation(project(":libs:test-utils"))
}
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()
+ }
+ }
+}