summaryrefslogtreecommitdiff
path: root/libs/samba/src
diff options
context:
space:
mode:
Diffstat (limited to 'libs/samba/src')
-rw-r--r--libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt1
-rw-r--r--libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt7
-rw-r--r--libs/samba/src/test/docker/docker-compose.yml22
-rw-r--r--libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt108
4 files changed, 122 insertions, 16 deletions
diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt
index 0b62b61..d7302cd 100644
--- a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt
+++ b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt
@@ -1,6 +1,7 @@
package org.the_jk.cleversync.io.samba
internal class SambaConnection(uri: String, credentials: SambaCredentials) {
+ val description = uri
private val context = NativeSamba.newContext()
private val url = context.parseUrl(uri)
private var destroyed = false
diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt
index 3667a74..91dee56 100644
--- a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt
+++ b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt
@@ -3,9 +3,12 @@ package org.the_jk.cleversync.io.samba
import android.content.res.Resources
import org.the_jk.cleversync.io.ModifiableTree
-internal class SambaTree(conn: SambaConnection, root: String) : SambaDirectory(conn, root, ""), ModifiableTree {
+internal class SambaTree(
+ private val conn: SambaConnection,
+ root: String,
+) : SambaDirectory(conn, root, ""), ModifiableTree {
override fun description(resources: Resources): CharSequence {
- TODO("Not yet implemented")
+ return conn.description
}
override fun close() {
diff --git a/libs/samba/src/test/docker/docker-compose.yml b/libs/samba/src/test/docker/docker-compose.yml
new file mode 100644
index 0000000..c7af330
--- /dev/null
+++ b/libs/samba/src/test/docker/docker-compose.yml
@@ -0,0 +1,22 @@
+services:
+ samba:
+ image: ghcr.io/servercontainers/samba:smbd-only-a3.20.2-s4.19.6-r0
+ restart: always
+ environment:
+ WSDD2_DISABLE: 1
+ AVAHI_DISABLE: 1
+ NETBIOS_DISABLE: 1
+
+ GROUP_family: 1050
+
+ ACCOUNT_test: notverysecret
+ UID_test: 1000
+ GROUPS_test: family
+
+ SAMBA_VOLUME_CONFIG_test: "[Share]; path=/shares/test; valid users = test; guest ok = no; read only = no; browseable = yes"
+
+ volumes:
+ - ../../../build/test-share:/shares/test
+
+ ports:
+ - "127.0.0.1:10445:445"
diff --git a/libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt b/libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt
index 3f1fa04..b581df9 100644
--- a/libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt
+++ b/libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt
@@ -1,39 +1,119 @@
package org.the_jk.cleversync.samba
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
import com.google.common.truth.Truth.assertThat
import org.junit.After
+import org.junit.AfterClass
import org.junit.Before
+import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
+import org.the_jk.cleversync.io.Link
import org.the_jk.cleversync.io.samba.SambaCredentials
+import java.io.File
+import kotlin.io.path.createSymbolicLinkPointingTo
@Config(manifest=Config.NONE)
@RunWith(RobolectricTestRunner::class)
class SambaTreeTest {
- private lateinit var uri: String
- private lateinit var credentials: SambaCredentials
-
@Before
- fun setUp() {
- uri = "smb://127.0.0.1:10445/"
- credentials = SambaCredentials("test", "notverysecret")
+ fun setUpTest() {
+ assertThat(shareDir.listFiles()).isEmpty()
}
@After
- fun tearDown() {
+ fun tearDownTest() {
+ for (file in shareDir.listFiles()!!) {
+ if (file.isDirectory) {
+ file.deleteRecursively()
+ } else {
+ file.delete()
+ }
+ }
+ }
+
+ @Test
+ fun description() {
+ val resources = ApplicationProvider.getApplicationContext<Context>().resources
+ SambaTreeFactory.tree(uri, credentials).getOrThrow().use { tree ->
+ assertThat(tree.description(resources).toString()).contains(uri)
+ }
+ }
+ @Test
+ fun listEmptyRoot() {
+ SambaTreeFactory.tree(uri, credentials).getOrThrow().use { root ->
+ val content = root.list()
+ assertThat(content.directories).isEmpty()
+ assertThat(content.files).isEmpty()
+ assertThat(content.links).isEmpty()
+ }
}
@Test
fun listRoot() {
- val result = SambaTreeFactory.tree(uri, credentials)
- assertThat(result.isSuccess).isTrue()
- val root = result.getOrThrow()
- val content = root.list()
- assertThat(content.directories).hasSize(1)
- assertThat(content.files).isEmpty()
- assertThat(content.links).isEmpty()
+ val dir = File(shareDir, "dir")
+ val file = File(shareDir, "file")
+ val link = File(shareDir, "link")
+ dir.mkdir()
+ file.writeText("foo")
+ link.toPath().createSymbolicLinkPointingTo(file.toPath())
+
+ SambaTreeFactory.tree(uri, credentials).getOrThrow().use { root ->
+ val content = root.list()
+ assertThat(content.directories).hasSize(1)
+ assertThat(content.directories[0].name).isEqualTo("dir")
+ assertThat(content.files).hasSize(1)
+ assertThat(content.files[0].name).isEqualTo("file")
+ assertThat(content.files[0].size).isEqualTo(3U)
+ assertThat(content.links).hasSize(1)
+ assertThat(content.links[0].name).isEqualTo("link")
+ val target = content.links[0].resolve()
+ if (target is Link.FileTarget) {
+ assertThat(target.file.name).isEqualTo("file")
+ } else {
+ assertThat(target).isInstanceOf(Link.FileTarget::class.java)
+ }
+ }
+ }
+
+ companion object {
+ private lateinit var uri: String
+ private lateinit var credentials: SambaCredentials
+ private lateinit var dockerDir: File
+ private lateinit var shareDir: File
+ private var dockerRunning = false
+
+ @BeforeClass
+ @JvmStatic
+ fun setUpClass() {
+ uri = "smb://127.0.0.1:10445/Share"
+ credentials = SambaCredentials("test", "notverysecret")
+ dockerDir = File(System.getProperty("dockerDir")!!)
+ shareDir = File(System.getProperty("shareDir")!!)
+ shareDir.deleteRecursively()
+ shareDir.mkdirs()
+
+ val pb = ProcessBuilder("docker", "compose", "up", "--wait", "--wait-timeout", "60")
+ pb.directory(dockerDir)
+ val exitCode = pb.start().waitFor()
+ assertThat(exitCode).isEqualTo(0)
+ dockerRunning = true
+ }
+
+ @AfterClass
+ @JvmStatic
+ fun tearDownClass() {
+ if (dockerRunning) {
+ val pb = ProcessBuilder("docker", "compose", "down")
+ pb.directory(dockerDir)
+ pb.start().waitFor()
+ dockerRunning = false
+ }
+ shareDir.deleteRecursively()
+ }
}
}