Skip to content

Commit 6c39b70

Browse files
committed
Also look for file backups when testing backup location for restore
1 parent d291cb3 commit 6c39b70

File tree

6 files changed

+25
-10
lines changed

6 files changed

+25
-10
lines changed

app/src/main/java/com/stevesoltys/seedvault/backend/saf/SafHandler.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ internal class SafHandler(
5353
}
5454

5555
/**
56-
* Searches if there's really an app backup available in the given storage location.
56+
* Searches if there's really an backup available in the given storage location.
5757
* Returns true if at least one was found and false otherwise.
5858
*/
5959
@WorkerThread
6060
@Throws(IOException::class)
61-
suspend fun hasAppBackup(safProperties: SafProperties): Boolean {
61+
suspend fun hasBackup(safProperties: SafProperties): Boolean {
6262
val context = context.getStorageContext { safProperties.isUsb }
6363
val backend = backendFactory.createSafBackend(context, safProperties)
6464
return backend.getAvailableBackupFileHandles().isNotEmpty()

app/src/main/java/com/stevesoltys/seedvault/backend/webdav/WebDavHandler.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ internal class WebDavHandler(
7373
}
7474

7575
/**
76-
* Searches if there's really an app backup available in the given storage location.
76+
* Searches if there's really a backup available in the given storage location.
7777
* Returns true if at least one was found and false otherwise.
7878
*/
7979
@WorkerThread
8080
@Throws(IOException::class)
81-
suspend fun hasAppBackup(backend: Backend): Boolean {
81+
suspend fun hasBackup(backend: Backend): Boolean {
8282
return backend.getAvailableBackupFileHandles().isNotEmpty()
8383
}
8484

app/src/main/java/com/stevesoltys/seedvault/transport/restore/RestoreCoordinator.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ internal class RestoreCoordinator(
8080
suspend fun getAvailableBackups(): RestorableBackupResult {
8181
Log.i(TAG, "getAvailableBackups")
8282
val fileHandles = try {
83-
backend.getAvailableBackupFileHandles()
83+
backend.getAvailableBackupFileHandles().filter {
84+
it is AppBackupFileType.Snapshot || it is LegacyAppBackupFile.Metadata
85+
}
8486
} catch (e: Exception) {
8587
Log.e(TAG, "Error getting available backups.", e)
8688
return RestorableBackupResult.ErrorResult(e)

app/src/main/java/com/stevesoltys/seedvault/ui/storage/RestoreStorageViewModel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal class RestoreStorageViewModel(
3535
override fun onSafUriSet(safProperties: SafProperties) {
3636
viewModelScope.launch(Dispatchers.IO) {
3737
val hasBackup = try {
38-
safHandler.hasAppBackup(safProperties)
38+
safHandler.hasBackup(safProperties)
3939
} catch (e: Exception) {
4040
Log.e(TAG, "Error reading URI: ${safProperties.uri}", e)
4141
val errorMsg = app.getString(R.string.restore_set_error) + "\n\n$e"
@@ -60,7 +60,7 @@ internal class RestoreStorageViewModel(
6060
override fun onWebDavConfigSet(properties: WebDavProperties, backend: Backend) {
6161
viewModelScope.launch(Dispatchers.IO) {
6262
val hasBackup = try {
63-
webdavHandler.hasAppBackup(backend)
63+
webdavHandler.hasBackup(backend)
6464
} catch (e: Exception) {
6565
Log.e(TAG, "Error reading: ${properties.config.url}", e)
6666
val errorMsg = app.getString(R.string.restore_set_error) + "\n\n$e"

app/src/test/java/com/stevesoltys/seedvault/transport/restore/RestoreCoordinatorTest.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.stevesoltys.seedvault.header.VERSION
2121
import com.stevesoltys.seedvault.metadata.BackupType
2222
import com.stevesoltys.seedvault.metadata.MetadataReader
2323
import com.stevesoltys.seedvault.metadata.PackageMetadata
24+
import com.stevesoltys.seedvault.proto.Snapshot
2425
import com.stevesoltys.seedvault.proto.copy
2526
import com.stevesoltys.seedvault.repo.SnapshotManager
2627
import com.stevesoltys.seedvault.transport.TransportTest
@@ -35,6 +36,7 @@ import io.mockk.verify
3536
import kotlinx.coroutines.runBlocking
3637
import org.calyxos.seedvault.core.backends.AppBackupFileType
3738
import org.calyxos.seedvault.core.backends.Backend
39+
import org.calyxos.seedvault.core.backends.FileBackupFileType
3840
import org.calyxos.seedvault.core.backends.FileInfo
3941
import org.calyxos.seedvault.core.backends.LegacyAppBackupFile
4042
import org.calyxos.seedvault.core.backends.saf.SafProperties
@@ -96,16 +98,22 @@ internal class RestoreCoordinatorTest : TransportTest() {
9698
fun `getAvailableRestoreSets() builds set from plugin response`() = runBlocking {
9799
val handle1 = LegacyAppBackupFile.Metadata(token)
98100
val handle2 = LegacyAppBackupFile.Metadata(token + 1)
101+
val handle3 = AppBackupFileType.Snapshot("foo", "bar")
102+
// last handle should get ignored
103+
val handle4 = FileBackupFileType.Snapshot("foodi", token + 2)
99104

100-
coEvery { backend.getAvailableBackupFileHandles() } returns listOf(handle1, handle2)
105+
coEvery {
106+
backend.getAvailableBackupFileHandles()
107+
} returns listOf(handle1, handle2, handle3, handle4)
101108
coEvery { backend.load(handle1) } returns inputStream
102109
coEvery { backend.load(handle2) } returns inputStream
110+
coEvery { snapshotManager.loadSnapshot(handle3) } returns mockk<Snapshot>(relaxed = true)
103111
every { metadataReader.readMetadata(inputStream, token) } returns metadata
104112
every { metadataReader.readMetadata(inputStream, token + 1) } returns metadata
105113
every { inputStream.close() } just Runs
106114

107115
val sets = restore.getAvailableRestoreSets() ?: fail()
108-
assertEquals(2, sets.size)
116+
assertEquals(3, sets.size) // file backup snapshot handle4 is ignored
109117
assertEquals(metadata.deviceName, sets[0].device)
110118
assertEquals(metadata.deviceName, sets[0].name)
111119
assertEquals(metadata.token, sets[0].token)
@@ -114,7 +122,7 @@ internal class RestoreCoordinatorTest : TransportTest() {
114122
every { metadataReader.readMetadata(inputStream, token + 1) } returns d2dMetadata
115123

116124
val d2dSets = restore.getAvailableRestoreSets() ?: fail()
117-
assertEquals(2, d2dSets.size)
125+
assertEquals(3, d2dSets.size)
118126
assertEquals(D2D_DEVICE_NAME, d2dSets[0].device)
119127
assertEquals(metadata.deviceName, d2dSets[0].name)
120128
assertEquals(metadata.token, d2dSets[0].token)

core/src/main/java/org/calyxos/seedvault/core/backends/Backend.kt

+5
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public interface Backend {
6262
*/
6363
public val providerPackageName: String?
6464

65+
/**
66+
* Returns [AppBackupFileType.Snapshot], [LegacyAppBackupFile.Metadata]
67+
* and [FileBackupFileType.Snapshot].
68+
*/
6569
public suspend fun getAvailableBackupFileHandles(): List<FileHandle> {
6670
// v1 get all restore set tokens in root folder that have a metadata file
6771
// v2 get all snapshots in all repository folders
@@ -70,6 +74,7 @@ public interface Backend {
7074
null,
7175
AppBackupFileType.Snapshot::class,
7276
LegacyAppBackupFile.Metadata::class,
77+
FileBackupFileType.Snapshot::class,
7378
) { fileInfo ->
7479
add(fileInfo.fileHandle)
7580
}

0 commit comments

Comments
 (0)