summaryrefslogtreecommitdiff
path: root/libs/samba
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-08-25 02:30:36 +0200
committerJoel Klinghed <the_jk@spawned.biz>2024-08-25 02:30:36 +0200
commita15cfde0fcbdb29dafdb9ebe39fe53c8da4073be (patch)
treeae7894796099d34381990d5230ebb22be16e897c /libs/samba
parent855a23136973313a656bfaf60afd8b98833a05c0 (diff)
Combine tests from both local and samba
Most the tests test the Tree implementation and thus should work on all such implementations. Current exception is symlinks which Samba backend doesn't (currently?) support. Improve the Samba remove methods to better match the expected behavior.
Diffstat (limited to 'libs/samba')
-rw-r--r--libs/samba/build.gradle.kts1
-rw-r--r--libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaDirectory.kt36
-rw-r--r--libs/samba/src/test/java/org/the_jk/cleversync/samba/SambaTreeTest.kt176
3 files changed, 92 insertions, 121 deletions
diff --git a/libs/samba/build.gradle.kts b/libs/samba/build.gradle.kts
index 7fab391..bae1ec9 100644
--- a/libs/samba/build.gradle.kts
+++ b/libs/samba/build.gradle.kts
@@ -47,6 +47,7 @@ android {
dependencies {
implementation(project(":libs:io"))
testImplementation(project(":libs:utils"))
+ testImplementation(project(":libs:test-utils"))
}
listOf("Debug", "Release").forEach { buildType ->
diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaDirectory.kt b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaDirectory.kt
index f5230b2..fc5b290 100644
--- a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaDirectory.kt
+++ b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaDirectory.kt
@@ -126,15 +126,45 @@ internal open class SambaDirectory(
}
override fun removeDirectory(name: String): Boolean {
- return conn.removeDir(SambaConnection.join(path, name))
+ val removePath = SambaConnection.join(path, name)
+ val entry = conn.entry(removePath) ?: return false
+ if (entry.type != NativeSamba.DirEntryType.DIR) return false
+ return removeRecursive(removePath)
+ }
+
+ private fun removeRecursive(removePath: String): Boolean {
+ val dir = conn.openDir(removePath) ?: return false
+ try {
+ dir.list().forEach { entry ->
+ val entryPath = SambaConnection.join(removePath, entry.name)
+ if (!when (entry.type) {
+ NativeSamba.DirEntryType.FILE,
+ NativeSamba.DirEntryType.LINK,
+ -> conn.unlink(entryPath)
+ NativeSamba.DirEntryType.DIR
+ -> removeRecursive(entryPath)
+ }) {
+ return false
+ }
+ }
+ return conn.removeDir(removePath)
+ } finally {
+ dir.destroy()
+ }
}
override fun removeFile(name: String): Boolean {
- return conn.unlink(SambaConnection.join(path, name))
+ val removePath = SambaConnection.join(path, name)
+ val entry = conn.entry(removePath) ?: return false
+ if (entry.type != NativeSamba.DirEntryType.FILE) return false
+ return conn.unlink(removePath)
}
override fun removeLink(name: String): Boolean {
- return conn.unlink(SambaConnection.join(path, name))
+ val removePath = SambaConnection.join(path, name)
+ val entry = conn.entry(removePath) ?: return false
+ if (entry.type != NativeSamba.DirEntryType.LINK) return false
+ return conn.unlink(removePath)
}
override fun openDir(name: String) = modifiableOpenDir(name)
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 61c8da7..fecd746 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
@@ -12,9 +12,8 @@ import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.robolectric.shadows.ShadowLooper
-import org.the_jk.cleversync.io.Directory
+import org.the_jk.cleversync.TreeAbstractTest
import org.the_jk.cleversync.io.samba.SambaCredentials
-import org.the_jk.cleversync.safeValue
import java.io.File
import java.nio.charset.StandardCharsets
import java.nio.file.Files
@@ -22,14 +21,18 @@ import java.util.concurrent.TimeUnit
@Config(manifest=Config.NONE)
@RunWith(RobolectricTestRunner::class)
-class SambaTreeTest {
+class SambaTreeTest : TreeAbstractTest() {
@Before
fun setUpTest() {
assertThat(shareDir.listFiles()).isEmpty()
+
+ tree = SambaTreeFactory.modifiableTree(uri, credentials).getOrThrow()
}
@After
fun tearDownTest() {
+ tree.close()
+
for (file in shareDir.listFiles()!!) {
if (file.isDirectory) {
file.deleteRecursively()
@@ -48,156 +51,93 @@ class SambaTreeTest {
}
@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 listEmptyRootLive() {
- SambaTreeFactory.tree(uri, credentials).getOrThrow().use { root ->
- val content = root.liveList().safeValue()
- assertThat(content?.directories).isEmpty()
- assertThat(content?.files).isEmpty()
- assertThat(content?.links).isEmpty()
- }
- }
-
- @Test
fun listRootWithSymlink() {
File(shareDir, "dir").mkdir()
File(shareDir, "file").writeText("foo")
Files.createSymbolicLink(File(shareDir, "link").toPath(), File("file").toPath())
- SambaTreeFactory.tree(uri, credentials).getOrThrow().use { root ->
- val content = root.list()
+ val content = tree.list()
- assertThat(content.directories).hasSize(1)
- assertThat(content.directories[0].name).isEqualTo("dir")
- assertThat(content.files).hasSize(2)
- if (content.files[0].name == "file") {
- assertThat(content.files[0].name).isEqualTo("file")
- assertThat(content.files[0].size).isEqualTo(3UL)
- assertThat(content.files[1].name).isEqualTo("link")
- assertThat(content.files[1].size).isEqualTo(3UL)
- } else {
- assertThat(content.files[0].name).isEqualTo("link")
- assertThat(content.files[0].size).isEqualTo(3UL)
- assertThat(content.files[1].name).isEqualTo("file")
- assertThat(content.files[1].size).isEqualTo(3UL)
- }
- // libsmb uses SMB2/SMB3 and unix extensions are SMB1, so no symlinks for now
- assertThat(content.links).isEmpty()
+ assertThat(content.directories).hasSize(1)
+ assertThat(content.directories[0].name).isEqualTo("dir")
+ assertThat(content.files).hasSize(2)
+ if (content.files[0].name == "file") {
+ assertThat(content.files[0].name).isEqualTo("file")
+ assertThat(content.files[0].size).isEqualTo(3UL)
+ assertThat(content.files[1].name).isEqualTo("link")
+ assertThat(content.files[1].size).isEqualTo(3UL)
+ } else {
+ assertThat(content.files[0].name).isEqualTo("link")
+ assertThat(content.files[0].size).isEqualTo(3UL)
+ assertThat(content.files[1].name).isEqualTo("file")
+ assertThat(content.files[1].size).isEqualTo(3UL)
}
+ // libsmb uses SMB2/SMB3 and unix extensions are SMB1, so no symlinks for now
+ assertThat(content.links).isEmpty()
}
@Test
- fun readFile() {
+ fun readExistingFile() {
File(shareDir, "file").writeText("hello world")
- SambaTreeFactory.tree(uri, credentials).getOrThrow().use { root ->
- val file = root.openFile("file")
- assertThat(file?.name).isEqualTo("file")
- assertThat(file?.size).isEqualTo(11UL)
+ val file = tree.openFile("file")
+ assertThat(file?.name).isEqualTo("file")
+ assertThat(file?.size).isEqualTo(11UL)
- file?.read().use { input ->
- assertThat(input?.readAllBytes()?.toString(StandardCharsets.UTF_8)).isEqualTo("hello world")
- }
+ file?.read().use { input ->
+ assertThat(input?.readAllBytes()?.toString(StandardCharsets.UTF_8)).isEqualTo("hello world")
+ }
- file?.read().use { input ->
- assertThat(input?.available()).isEqualTo(11)
- assertThat(input?.markSupported()).isTrue()
- val buffer = ByteArray(10)
- assertThat(input?.read(buffer, 5, 5)).isEqualTo(5)
- input?.mark(100)
- assertThat(buffer.sliceArray(5..<10).toString(StandardCharsets.UTF_8)).isEqualTo("hello")
- assertThat(input?.read(buffer)).isEqualTo(6)
- assertThat(buffer.sliceArray(0..<6).toString(StandardCharsets.UTF_8)).isEqualTo(" world")
- input?.reset()
- assertThat(input?.read(buffer, 3, 5)).isEqualTo(5)
- assertThat(buffer.sliceArray(3..<8).toString(StandardCharsets.UTF_8)).isEqualTo(" worl")
- }
+ file?.read().use { input ->
+ assertThat(input?.available()).isEqualTo(11)
+ assertThat(input?.markSupported()).isTrue()
+ val buffer = ByteArray(10)
+ assertThat(input?.read(buffer, 5, 5)).isEqualTo(5)
+ input?.mark(100)
+ assertThat(buffer.sliceArray(5..<10).toString(StandardCharsets.UTF_8)).isEqualTo("hello")
+ assertThat(input?.read(buffer)).isEqualTo(6)
+ assertThat(buffer.sliceArray(0..<6).toString(StandardCharsets.UTF_8)).isEqualTo(" world")
+ input?.reset()
+ assertThat(input?.read(buffer, 3, 5)).isEqualTo(5)
+ assertThat(buffer.sliceArray(3..<8).toString(StandardCharsets.UTF_8)).isEqualTo(" worl")
}
}
@Test
- fun writeFile() {
- SambaTreeFactory.modifiableTree(uri, credentials).getOrThrow().use { root ->
- val file = root.createFile("file")
- assertThat(file.name).isEqualTo("file")
-
- file.write().writer().use { output ->
- output.write("hello world")
- }
-
- assertThat(file.size).isEqualTo(11UL)
- }
+ override fun createFile() {
+ super.createFile()
- assertThat(File(shareDir, "file").readText()).isEqualTo("hello world")
+ assertThat(File(shareDir, "foo").readBytes()).isEqualTo(byteArrayOf(1, 2, 3, 4))
}
@Test
- fun overwriteFile() {
- File(shareDir, "file").writeText("hello world")
-
- SambaTreeFactory.modifiableTree(uri, credentials).getOrThrow().use { root ->
- val file = root.modifiableOpenFile("file")
- assertThat(file?.name).isEqualTo("file")
- assertThat(file?.size).isEqualTo(11UL)
-
- file?.write().use { output ->
- val buffer = "foobar".toByteArray(StandardCharsets.UTF_8)
- output?.write(buffer, 0, 1)
- output?.write(buffer, 1, 2)
- output?.write(buffer, 3, 3)
- }
-
- assertThat(file?.size).isEqualTo(6UL)
- }
+ override fun overwriteFile() {
+ super.overwriteFile()
- assertThat(File(shareDir, "file").readText()).isEqualTo("foobar")
+ assertThat(File(shareDir, "foo").readBytes()).isEqualTo(byteArrayOf(127, 1))
}
@Test
- fun createDirectory() {
- SambaTreeFactory.modifiableTree(uri, credentials).getOrThrow().use { root ->
- val foo = root.createDirectory("foo")
- assertThat(foo.name).isEqualTo("foo")
- val fooContent = foo.list()
- assertThat(fooContent.directories).isEmpty()
- assertThat(fooContent.files).isEmpty()
- assertThat(fooContent.links).isEmpty()
- val content = root.list()
- assertThat(content.directories).contains(foo)
- assertThat(content.files).isEmpty()
- assertThat(content.links).isEmpty()
- }
+ override fun createDirectory() {
+ super.createDirectory()
assertThat(File(shareDir, "foo").isDirectory).isTrue()
}
@Test(timeout = 10000)
- fun observeCreateDirectory() {
- SambaTreeFactory.modifiableTree(uri, credentials).getOrThrow().use { root ->
- val content = root.liveList()
- var dir: Directory? = null
- content.observeForever {
- if (it.directories.size == 1) dir = it.directories[0]
- }
- root.createDirectory("foo")
- while (dir == null) {
- ShadowLooper.idleMainLooper(10, TimeUnit.SECONDS)
- }
- assertThat(dir?.name).isEqualTo("foo")
- }
+ override fun observeCreateDirectory() {
+ super.observeCreateDirectory()
assertThat(File(shareDir, "foo").isDirectory).isTrue()
}
+ // libsmb uses SMB2/SMB3 and unix extensions are SMB1, so no symlinks for now
+ override fun supportSymlinks() = false
+
+ override fun idle() {
+ ShadowLooper.idleMainLooper(10, TimeUnit.SECONDS)
+ }
+
companion object {
private lateinit var uri: String
private lateinit var credentials: SambaCredentials