Ensure that metadata cache streams get closed
This commit is contained in:
parent
4387353227
commit
1d2c74bf2c
2 changed files with 50 additions and 4 deletions
|
@ -66,6 +66,8 @@ class MetadataManager(
|
||||||
*
|
*
|
||||||
* It updates the packages' metadata
|
* It updates the packages' metadata
|
||||||
* and writes it encrypted to the given [OutputStream] as well as the internal cache.
|
* and writes it encrypted to the given [OutputStream] as well as the internal cache.
|
||||||
|
*
|
||||||
|
* Closing the [OutputStream] is the responsibility of the caller.
|
||||||
*/
|
*/
|
||||||
@Synchronized
|
@Synchronized
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
|
@ -112,6 +114,8 @@ class MetadataManager(
|
||||||
*
|
*
|
||||||
* It updates the packages' metadata
|
* It updates the packages' metadata
|
||||||
* and writes it encrypted to the given [OutputStream] as well as the internal cache.
|
* and writes it encrypted to the given [OutputStream] as well as the internal cache.
|
||||||
|
*
|
||||||
|
* Closing the [OutputStream] is the responsibility of the caller.
|
||||||
*/
|
*/
|
||||||
@Synchronized
|
@Synchronized
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
|
@ -221,8 +225,8 @@ class MetadataManager(
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
private fun getMetadataFromCache(): BackupMetadata? {
|
private fun getMetadataFromCache(): BackupMetadata? {
|
||||||
try {
|
try {
|
||||||
with(context.openFileInput(METADATA_CACHE_FILE)) {
|
context.openFileInput(METADATA_CACHE_FILE).use { stream ->
|
||||||
return metadataReader.decode(readBytes())
|
return metadataReader.decode(stream.readBytes())
|
||||||
}
|
}
|
||||||
} catch (e: SecurityException) {
|
} catch (e: SecurityException) {
|
||||||
Log.e(TAG, "Error parsing cached metadata", e)
|
Log.e(TAG, "Error parsing cached metadata", e)
|
||||||
|
@ -237,8 +241,8 @@ class MetadataManager(
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
private fun writeMetadataToCache() {
|
private fun writeMetadataToCache() {
|
||||||
with(context.openFileOutput(METADATA_CACHE_FILE, MODE_PRIVATE)) {
|
context.openFileOutput(METADATA_CACHE_FILE, MODE_PRIVATE).use { stream ->
|
||||||
write(metadataWriter.encode(metadata))
|
stream.write(metadataWriter.encode(metadata))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ import io.mockk.Runs
|
||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
import io.mockk.just
|
import io.mockk.just
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
|
import io.mockk.verify
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.fail
|
import org.junit.Assert.fail
|
||||||
|
@ -74,6 +75,11 @@ class MetadataManagerTest {
|
||||||
|
|
||||||
assertEquals(token, manager.getBackupToken())
|
assertEquals(token, manager.getBackupToken())
|
||||||
assertEquals(0L, manager.getLastBackupTime())
|
assertEquals(0L, manager.getLastBackupTime())
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -91,6 +97,11 @@ class MetadataManagerTest {
|
||||||
manager.onApkBackedUp(packageInfo, packageMetadata, storageOutputStream)
|
manager.onApkBackedUp(packageInfo, packageMetadata, storageOutputStream)
|
||||||
|
|
||||||
assertEquals(packageMetadata, manager.getPackageMetadata(packageName))
|
assertEquals(packageMetadata, manager.getPackageMetadata(packageName))
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -109,6 +120,11 @@ class MetadataManagerTest {
|
||||||
manager.onApkBackedUp(packageInfo, packageMetadata, storageOutputStream)
|
manager.onApkBackedUp(packageInfo, packageMetadata, storageOutputStream)
|
||||||
|
|
||||||
assertEquals(packageMetadata.copy(system = true), manager.getPackageMetadata(packageName))
|
assertEquals(packageMetadata.copy(system = true), manager.getPackageMetadata(packageName))
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -133,6 +149,11 @@ class MetadataManagerTest {
|
||||||
manager.onApkBackedUp(packageInfo, updatedPackageMetadata, storageOutputStream)
|
manager.onApkBackedUp(packageInfo, updatedPackageMetadata, storageOutputStream)
|
||||||
|
|
||||||
assertEquals(updatedPackageMetadata, manager.getPackageMetadata(packageName))
|
assertEquals(updatedPackageMetadata, manager.getPackageMetadata(packageName))
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -187,6 +208,11 @@ class MetadataManagerTest {
|
||||||
packageMetadata.copy(state = WAS_STOPPED),
|
packageMetadata.copy(state = WAS_STOPPED),
|
||||||
manager.getPackageMetadata(packageName)
|
manager.getPackageMetadata(packageName)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -210,6 +236,11 @@ class MetadataManagerTest {
|
||||||
manager.getPackageMetadata(packageName)
|
manager.getPackageMetadata(packageName)
|
||||||
)
|
)
|
||||||
assertEquals(time, manager.getLastBackupTime())
|
assertEquals(time, manager.getLastBackupTime())
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -237,6 +268,8 @@ class MetadataManagerTest {
|
||||||
initialMetadata.packageMetadataMap[packageName],
|
initialMetadata.packageMetadataMap[packageName],
|
||||||
manager.getPackageMetadata(packageName)
|
manager.getPackageMetadata(packageName)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
verify { cacheInputStream.close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -265,6 +298,11 @@ class MetadataManagerTest {
|
||||||
updatedMetadata.packageMetadataMap[packageName],
|
updatedMetadata.packageMetadataMap[packageName],
|
||||||
manager.getPackageMetadata(packageName)
|
manager.getPackageMetadata(packageName)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
verify {
|
||||||
|
cacheInputStream.close()
|
||||||
|
cacheOutputStream.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -289,6 +327,8 @@ class MetadataManagerTest {
|
||||||
|
|
||||||
assertEquals(initialMetadata.time, manager.getLastBackupTime())
|
assertEquals(initialMetadata.time, manager.getLastBackupTime())
|
||||||
assertEquals(initialMetadata.token, manager.getBackupToken())
|
assertEquals(initialMetadata.token, manager.getBackupToken())
|
||||||
|
|
||||||
|
verify { cacheInputStream.close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun expectModifyMetadata(metadata: BackupMetadata) {
|
private fun expectModifyMetadata(metadata: BackupMetadata) {
|
||||||
|
@ -301,6 +341,7 @@ class MetadataManagerTest {
|
||||||
)
|
)
|
||||||
} returns cacheOutputStream
|
} returns cacheOutputStream
|
||||||
every { cacheOutputStream.write(encodedMetadata) } just Runs
|
every { cacheOutputStream.write(encodedMetadata) } just Runs
|
||||||
|
every { cacheOutputStream.close() } just Runs
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun expectReadFromCache() {
|
private fun expectReadFromCache() {
|
||||||
|
@ -309,6 +350,7 @@ class MetadataManagerTest {
|
||||||
every { cacheInputStream.available() } returns byteArray.size andThen 0
|
every { cacheInputStream.available() } returns byteArray.size andThen 0
|
||||||
every { cacheInputStream.read(byteArray) } returns -1
|
every { cacheInputStream.read(byteArray) } returns -1
|
||||||
every { metadataReader.decode(ByteArray(0)) } returns initialMetadata
|
every { metadataReader.decode(ByteArray(0)) } returns initialMetadata
|
||||||
|
every { cacheInputStream.close() } just Runs
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue