diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-08-22 00:10:26 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-08-22 00:23:23 +0200 |
| commit | d7eefa8066b8e2ac70e0a4080c52bce20da24a23 (patch) | |
| tree | 2d2ccae50b30f82ced23363a17653e31c0d79804 /libs/samba/src | |
| parent | 275de81f854be66f575e3c8e36a0c1b56281e788 (diff) | |
samba: Add docker server run by tests
Current user needs to be in docker group (or in some other way have
access to the docker.socket) for this to work.
Two current problems:
* listRoot() fails, no directories are found.
* gradle hangs after running the samba tests
Diffstat (limited to 'libs/samba/src')
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() + } } } |
