Remove file storage code from RESTAPI class
This commit is contained in:
parent
67f2d1f9a8
commit
c99c4478f2
|
@ -1,12 +0,0 @@
|
||||||
apply from: bootstrap.kotlinModule
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api project(':core:domain')
|
|
||||||
api other.twitterSerial
|
|
||||||
|
|
||||||
testImplementation testing.kotlinJunit
|
|
||||||
testImplementation testing.mockito
|
|
||||||
testImplementation testing.mockitoInline
|
|
||||||
testImplementation testing.mockitoKotlin
|
|
||||||
testImplementation testing.kluent
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache
|
|
||||||
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides access to generic directories:
|
|
||||||
* - for temporary caches
|
|
||||||
* - for permanent data storage
|
|
||||||
*/
|
|
||||||
interface Directories {
|
|
||||||
fun getInternalCacheDir(): File
|
|
||||||
fun getInternalDataDir(): File
|
|
||||||
fun getExternalCacheDir(): File?
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache
|
|
||||||
|
|
||||||
import com.twitter.serial.serializer.SerializationContext
|
|
||||||
import com.twitter.serial.serializer.Serializer
|
|
||||||
import com.twitter.serial.stream.Serial
|
|
||||||
import com.twitter.serial.stream.bytebuffer.ByteBufferSerial
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
typealias DomainEntitySerializer<T> = Serializer<T>
|
|
||||||
|
|
||||||
internal const val STORAGE_DIR_NAME = "persistent_storage"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides access to permanent file based storage.
|
|
||||||
*
|
|
||||||
* [serverId] is currently active server. Should be unique per server so stored data will not
|
|
||||||
* interfere with other server data.
|
|
||||||
*
|
|
||||||
* Look at [org.moire.ultrasonic.cache.serializers] package for available [DomainEntitySerializer]s.
|
|
||||||
*/
|
|
||||||
class PermanentFileStorage(
|
|
||||||
private val directories: Directories,
|
|
||||||
private val serverId: String,
|
|
||||||
private val debug: Boolean = false
|
|
||||||
) {
|
|
||||||
private val serializationContext = object : SerializationContext {
|
|
||||||
override fun isDebug(): Boolean = debug
|
|
||||||
override fun isRelease(): Boolean = !debug
|
|
||||||
}
|
|
||||||
|
|
||||||
private val serializer: Serial = ByteBufferSerial(serializationContext)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stores given [objectToStore] using [name] as a key and [objectSerializer] as serializer.
|
|
||||||
*/
|
|
||||||
fun <T> store(
|
|
||||||
name: String,
|
|
||||||
objectToStore: T,
|
|
||||||
objectSerializer: DomainEntitySerializer<T>
|
|
||||||
) {
|
|
||||||
val storeFile = getFile(name)
|
|
||||||
if (!storeFile.exists()) storeFile.createNewFile()
|
|
||||||
storeFile.writeBytes(serializer.toByteArray(objectToStore, objectSerializer))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads object with [name] key using [objectDeserializer] deserializer.
|
|
||||||
*/
|
|
||||||
fun <T> load(
|
|
||||||
name: String,
|
|
||||||
objectDeserializer: DomainEntitySerializer<T>
|
|
||||||
): T? {
|
|
||||||
val storeFile = getFile(name)
|
|
||||||
if (!storeFile.exists()) return null
|
|
||||||
|
|
||||||
return serializer.fromByteArray(storeFile.readBytes(), objectDeserializer)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear all files in storage.
|
|
||||||
*/
|
|
||||||
fun clearAll() {
|
|
||||||
val storageDir = getStorageDir()
|
|
||||||
storageDir.listFiles().forEach { it.deleteRecursively() }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getFile(name: String) = File(getStorageDir(), "$name.ser")
|
|
||||||
|
|
||||||
private fun getStorageDir(): File {
|
|
||||||
val mainDir = File(directories.getInternalDataDir(), STORAGE_DIR_NAME)
|
|
||||||
val serverDir = File(mainDir, serverId)
|
|
||||||
if (!serverDir.exists()) serverDir.mkdirs()
|
|
||||||
return serverDir
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
@file:JvmMultifileClass
|
|
||||||
@file:JvmName("DomainSerializers")
|
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import com.twitter.serial.serializer.CollectionSerializers
|
|
||||||
import com.twitter.serial.serializer.ObjectSerializer
|
|
||||||
import com.twitter.serial.serializer.SerializationContext
|
|
||||||
import com.twitter.serial.stream.SerializerDefs
|
|
||||||
import com.twitter.serial.stream.SerializerInput
|
|
||||||
import com.twitter.serial.stream.SerializerOutput
|
|
||||||
import org.moire.ultrasonic.cache.DomainEntitySerializer
|
|
||||||
import org.moire.ultrasonic.domain.Artist
|
|
||||||
|
|
||||||
private const val SERIALIZER_VERSION = 1
|
|
||||||
|
|
||||||
private val artistSerializer get() = object : ObjectSerializer<Artist>(SERIALIZER_VERSION) {
|
|
||||||
override fun serializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
output: SerializerOutput<out SerializerOutput<*>>,
|
|
||||||
item: Artist
|
|
||||||
) {
|
|
||||||
output.writeString(item.id)
|
|
||||||
.writeString(item.name)
|
|
||||||
.writeString(item.index)
|
|
||||||
.writeString(item.coverArt)
|
|
||||||
.apply {
|
|
||||||
val albumCount = item.albumCount
|
|
||||||
if (albumCount != null) writeLong(albumCount) else writeNull()
|
|
||||||
}
|
|
||||||
.writeInt(item.closeness)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun deserializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
input: SerializerInput,
|
|
||||||
versionNumber: Int
|
|
||||||
): Artist? {
|
|
||||||
if (versionNumber != SERIALIZER_VERSION) return null
|
|
||||||
|
|
||||||
val id = input.readString()
|
|
||||||
val name = input.readString()
|
|
||||||
val index = input.readString()
|
|
||||||
val coverArt = input.readString()
|
|
||||||
val albumCount = if (input.peekType() == SerializerDefs.TYPE_NULL) {
|
|
||||||
input.readNull()
|
|
||||||
null
|
|
||||||
} else {
|
|
||||||
input.readLong()
|
|
||||||
}
|
|
||||||
val closeness = input.readInt()
|
|
||||||
return Artist(id, name, index, coverArt, albumCount, closeness)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer/deserializer for [Artist] domain entity.
|
|
||||||
*/
|
|
||||||
fun getArtistsSerializer(): DomainEntitySerializer<Artist> = artistSerializer
|
|
||||||
|
|
||||||
private val artistListSerializer = CollectionSerializers.getListSerializer(artistSerializer)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer/deserializer for list of [Artist] domain entities.
|
|
||||||
*/
|
|
||||||
fun getArtistListSerializer(): DomainEntitySerializer<List<Artist>> = artistListSerializer
|
|
|
@ -1,51 +0,0 @@
|
||||||
@file:JvmMultifileClass
|
|
||||||
@file:JvmName("DomainSerializers")
|
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import com.twitter.serial.serializer.ObjectSerializer
|
|
||||||
import com.twitter.serial.serializer.SerializationContext
|
|
||||||
import com.twitter.serial.stream.SerializerInput
|
|
||||||
import com.twitter.serial.stream.SerializerOutput
|
|
||||||
import org.moire.ultrasonic.cache.DomainEntitySerializer
|
|
||||||
import org.moire.ultrasonic.domain.Artist
|
|
||||||
import org.moire.ultrasonic.domain.Indexes
|
|
||||||
|
|
||||||
private const val SERIALIZATION_VERSION = 1
|
|
||||||
|
|
||||||
private val indexesSerializer get() = object : ObjectSerializer<Indexes>(SERIALIZATION_VERSION) {
|
|
||||||
override fun serializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
output: SerializerOutput<out SerializerOutput<*>>,
|
|
||||||
item: Indexes
|
|
||||||
) {
|
|
||||||
val artistListSerializer = getArtistListSerializer()
|
|
||||||
output.writeLong(item.lastModified)
|
|
||||||
.writeString(item.ignoredArticles)
|
|
||||||
.writeObject<MutableList<Artist>>(context, item.shortcuts, artistListSerializer)
|
|
||||||
.writeObject<MutableList<Artist>>(context, item.artists, artistListSerializer)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("ReturnCount")
|
|
||||||
override fun deserializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
input: SerializerInput,
|
|
||||||
versionNumber: Int
|
|
||||||
): Indexes? {
|
|
||||||
if (versionNumber != SERIALIZATION_VERSION) return null
|
|
||||||
|
|
||||||
val artistListDeserializer = getArtistListSerializer()
|
|
||||||
val lastModified = input.readLong()
|
|
||||||
val ignoredArticles = input.readString() ?: return null
|
|
||||||
val shortcutsList = input.readObject(context, artistListDeserializer) ?: return null
|
|
||||||
val artistsList = input.readObject(context, artistListDeserializer) ?: return null
|
|
||||||
return Indexes(
|
|
||||||
lastModified, ignoredArticles, shortcutsList.toMutableList(),
|
|
||||||
artistsList.toMutableList()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get serializer/deserializer for [Indexes] entity.
|
|
||||||
*/
|
|
||||||
fun getIndexesSerializer(): DomainEntitySerializer<Indexes> = indexesSerializer
|
|
|
@ -1,51 +0,0 @@
|
||||||
@file:JvmMultifileClass
|
|
||||||
@file:JvmName("DomainSerializers")
|
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import com.twitter.serial.serializer.CollectionSerializers
|
|
||||||
import com.twitter.serial.serializer.ObjectSerializer
|
|
||||||
import com.twitter.serial.serializer.SerializationContext
|
|
||||||
import com.twitter.serial.stream.SerializerInput
|
|
||||||
import com.twitter.serial.stream.SerializerOutput
|
|
||||||
import org.moire.ultrasonic.cache.DomainEntitySerializer
|
|
||||||
import org.moire.ultrasonic.domain.MusicFolder
|
|
||||||
|
|
||||||
private const val SERIALIZATION_VERSION = 1
|
|
||||||
|
|
||||||
private val musicFolderSerializer = object : ObjectSerializer<MusicFolder>(SERIALIZATION_VERSION) {
|
|
||||||
|
|
||||||
override fun serializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
output: SerializerOutput<out SerializerOutput<*>>,
|
|
||||||
item: MusicFolder
|
|
||||||
) {
|
|
||||||
output.writeString(item.id).writeString(item.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("ReturnCount")
|
|
||||||
override fun deserializeObject(
|
|
||||||
context: SerializationContext,
|
|
||||||
input: SerializerInput,
|
|
||||||
versionNumber: Int
|
|
||||||
): MusicFolder? {
|
|
||||||
if (versionNumber != SERIALIZATION_VERSION) return null
|
|
||||||
|
|
||||||
val id = input.readString() ?: return null
|
|
||||||
val name = input.readString() ?: return null
|
|
||||||
return MusicFolder(id, name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer/deserializer for [MusicFolder] domain entity.
|
|
||||||
*/
|
|
||||||
fun getMusicFolderSerializer(): DomainEntitySerializer<MusicFolder> = musicFolderSerializer
|
|
||||||
|
|
||||||
private val musicFolderListSerializer =
|
|
||||||
CollectionSerializers.getListSerializer(musicFolderSerializer)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer/deserializer for [List] of [MusicFolder] items.
|
|
||||||
*/
|
|
||||||
fun getMusicFolderListSerializer(): DomainEntitySerializer<List<MusicFolder>> =
|
|
||||||
musicFolderListSerializer
|
|
|
@ -1,42 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache
|
|
||||||
|
|
||||||
import com.twitter.serial.util.SerializationUtils
|
|
||||||
import java.io.File
|
|
||||||
import org.amshove.kluent.`it returns`
|
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.Rule
|
|
||||||
import org.junit.rules.TemporaryFolder
|
|
||||||
import org.mockito.kotlin.mock
|
|
||||||
|
|
||||||
internal const val INTERNAL_DATA_FOLDER = "data"
|
|
||||||
internal const val INTERNAL_CACHE_FOLDER = "cache"
|
|
||||||
internal const val EXTERNAL_CACHE_FOLDER = "external_cache"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base test class that inits the storage
|
|
||||||
*/
|
|
||||||
abstract class BaseStorageTest {
|
|
||||||
@get:Rule val tempFileRule = TemporaryFolder()
|
|
||||||
|
|
||||||
protected lateinit var mockDirectories: Directories
|
|
||||||
protected lateinit var storage: PermanentFileStorage
|
|
||||||
|
|
||||||
open val serverId: String = ""
|
|
||||||
|
|
||||||
@Before
|
|
||||||
fun setUp() {
|
|
||||||
mockDirectories = mock<Directories> {
|
|
||||||
on { getInternalDataDir() } `it returns` tempFileRule.newFolder(INTERNAL_DATA_FOLDER)
|
|
||||||
on { getInternalCacheDir() } `it returns` tempFileRule.newFolder(INTERNAL_CACHE_FOLDER)
|
|
||||||
on { getExternalCacheDir() } `it returns` tempFileRule.newFolder(EXTERNAL_CACHE_FOLDER)
|
|
||||||
}
|
|
||||||
storage = PermanentFileStorage(mockDirectories, serverId, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
protected val storageDir get() = File(mockDirectories.getInternalDataDir(), STORAGE_DIR_NAME)
|
|
||||||
|
|
||||||
protected fun validateSerializedData(index: Int = 0) {
|
|
||||||
val serializedFileBytes = storageDir.listFiles()[index].readBytes()
|
|
||||||
SerializationUtils.validateSerializedData(serializedFileBytes)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache
|
|
||||||
|
|
||||||
import java.io.File
|
|
||||||
import org.amshove.kluent.`should be equal to`
|
|
||||||
import org.amshove.kluent.`should contain`
|
|
||||||
import org.junit.Test
|
|
||||||
import org.moire.ultrasonic.cache.serializers.getMusicFolderSerializer
|
|
||||||
import org.moire.ultrasonic.domain.MusicFolder
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Integration test for [PermanentFileStorage].
|
|
||||||
*/
|
|
||||||
class PermanentFileStorageTest : BaseStorageTest() {
|
|
||||||
override val serverId: String
|
|
||||||
get() = "some-server-id"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should create storage dir if it is not exist`() {
|
|
||||||
val item = MusicFolder("1", "2")
|
|
||||||
storage.store("test", item, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
storageDir.exists() `should be equal to` true
|
|
||||||
getServerStorageDir().exists() `should be equal to` true
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should serialize to file`() {
|
|
||||||
val item = MusicFolder("1", "23")
|
|
||||||
val name = "some-name"
|
|
||||||
|
|
||||||
storage.store(name, item, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
val storageFiles = getServerStorageDir().listFiles()
|
|
||||||
storageFiles.size `should be equal to` 1
|
|
||||||
storageFiles[0].name `should contain` name
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should deserialize stored object`() {
|
|
||||||
val item = MusicFolder("some", "nice")
|
|
||||||
val name = "some-name"
|
|
||||||
storage.store(name, item, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(name, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` item
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should overwrite existing stored object`() {
|
|
||||||
val name = "some-nice-name"
|
|
||||||
val item1 = MusicFolder("1", "1")
|
|
||||||
val item2 = MusicFolder("2", "2")
|
|
||||||
storage.store(name, item1, getMusicFolderSerializer())
|
|
||||||
storage.store(name, item2, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(name, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` item2
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should clear all files when clearAll is called`() {
|
|
||||||
storage.store("name1", MusicFolder("1", "1"), getMusicFolderSerializer())
|
|
||||||
storage.store("name2", MusicFolder("2", "2"), getMusicFolderSerializer())
|
|
||||||
|
|
||||||
storage.clearAll()
|
|
||||||
|
|
||||||
getServerStorageDir().listFiles().size `should be equal to` 0
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should return null if serialized file not available`() {
|
|
||||||
val loadedItem = storage.load("some-name", getMusicFolderSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getServerStorageDir() = File(storageDir, serverId)
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import org.amshove.kluent.`should be equal to`
|
|
||||||
import org.junit.Test
|
|
||||||
import org.moire.ultrasonic.cache.BaseStorageTest
|
|
||||||
import org.moire.ultrasonic.domain.Artist
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [Artist] serializers test.
|
|
||||||
*/
|
|
||||||
class ArtistSerializerTest : BaseStorageTest() {
|
|
||||||
@Test
|
|
||||||
fun `Should correctly serialize Artist object`() {
|
|
||||||
val item = Artist("id", "name", "index", "coverArt", 1, 0)
|
|
||||||
|
|
||||||
storage.store("some-name", item, getArtistsSerializer())
|
|
||||||
|
|
||||||
validateSerializedData()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly deserialize Artist object`() {
|
|
||||||
val itemName = "some-name"
|
|
||||||
val item = Artist("id", "name", "index", "coverArt", null, 0)
|
|
||||||
storage.store(itemName, item, getArtistsSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(itemName, getArtistsSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` item
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly serialize list of Artists`() {
|
|
||||||
val itemsList = listOf(
|
|
||||||
Artist(id = "1"),
|
|
||||||
Artist(id = "2", name = "some")
|
|
||||||
)
|
|
||||||
|
|
||||||
storage.store("some-name", itemsList, getArtistListSerializer())
|
|
||||||
|
|
||||||
validateSerializedData()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly deserialize list of Artists`() {
|
|
||||||
val name = "some-name"
|
|
||||||
val itemsList = listOf(
|
|
||||||
Artist(id = "1"),
|
|
||||||
Artist(id = "2", name = "some")
|
|
||||||
)
|
|
||||||
storage.store(name, itemsList, getArtistListSerializer())
|
|
||||||
|
|
||||||
val loadedItems = storage.load(name, getArtistListSerializer())
|
|
||||||
|
|
||||||
loadedItems `should be equal to` itemsList
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import org.amshove.kluent.`should be equal to`
|
|
||||||
import org.junit.Test
|
|
||||||
import org.moire.ultrasonic.cache.BaseStorageTest
|
|
||||||
import org.moire.ultrasonic.domain.Artist
|
|
||||||
import org.moire.ultrasonic.domain.Indexes
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test [Indexes] domain entity serializer.
|
|
||||||
*/
|
|
||||||
class IndexesSerializerTest : BaseStorageTest() {
|
|
||||||
@Test
|
|
||||||
fun `Should correctly serialize Indexes object`() {
|
|
||||||
val item = Indexes(
|
|
||||||
220L, "", mutableListOf(Artist("12")),
|
|
||||||
mutableListOf(Artist("233", "some"))
|
|
||||||
)
|
|
||||||
|
|
||||||
storage.store("some-name", item, getIndexesSerializer())
|
|
||||||
|
|
||||||
validateSerializedData()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly deserialize Indexes object`() {
|
|
||||||
val name = "some-name"
|
|
||||||
val item = Indexes(
|
|
||||||
220L, "", mutableListOf(Artist("12")),
|
|
||||||
mutableListOf(Artist("233", "some"))
|
|
||||||
)
|
|
||||||
storage.store(name, item, getIndexesSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(name, getIndexesSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` item
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache.serializers
|
|
||||||
|
|
||||||
import org.amshove.kluent.`should be equal to`
|
|
||||||
import org.junit.Test
|
|
||||||
import org.moire.ultrasonic.cache.BaseStorageTest
|
|
||||||
import org.moire.ultrasonic.domain.MusicFolder
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [MusicFolder] serializers test.
|
|
||||||
*/
|
|
||||||
class MusicFolderSerializerTest : BaseStorageTest() {
|
|
||||||
@Test
|
|
||||||
fun `Should correctly serialize MusicFolder object`() {
|
|
||||||
val item = MusicFolder("Music", "Folder")
|
|
||||||
|
|
||||||
storage.store("some-name", item, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
validateSerializedData()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly deserialize MusicFolder object`() {
|
|
||||||
val name = "name"
|
|
||||||
val item = MusicFolder("some", "none")
|
|
||||||
storage.store(name, item, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(name, getMusicFolderSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` item
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly serialize list of MusicFolders objects`() {
|
|
||||||
val itemsList = listOf(
|
|
||||||
MusicFolder("1", "1"),
|
|
||||||
MusicFolder("2", "2")
|
|
||||||
)
|
|
||||||
|
|
||||||
storage.store("some-name", itemsList, getMusicFolderListSerializer())
|
|
||||||
|
|
||||||
validateSerializedData()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Should correctly deserialize list of MusicFolder objects`() {
|
|
||||||
val name = "some-name"
|
|
||||||
val itemsList = listOf(
|
|
||||||
MusicFolder("1", "1"),
|
|
||||||
MusicFolder("2", "2")
|
|
||||||
)
|
|
||||||
storage.store(name, itemsList, getMusicFolderListSerializer())
|
|
||||||
|
|
||||||
val loadedItem = storage.load(name, getMusicFolderListSerializer())
|
|
||||||
|
|
||||||
loadedItem `should be equal to` itemsList
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -28,7 +28,6 @@ ext.versions = [
|
||||||
retrofit : "2.6.4",
|
retrofit : "2.6.4",
|
||||||
jackson : "2.9.5",
|
jackson : "2.9.5",
|
||||||
okhttp : "3.12.13",
|
okhttp : "3.12.13",
|
||||||
twitterSerial : "0.1.6",
|
|
||||||
koin : "3.0.2",
|
koin : "3.0.2",
|
||||||
picasso : "2.71828",
|
picasso : "2.71828",
|
||||||
sortListView : "1.0.1",
|
sortListView : "1.0.1",
|
||||||
|
@ -82,7 +81,6 @@ ext.other = [
|
||||||
jacksonConverter : "com.squareup.retrofit2:converter-jackson:$versions.retrofit",
|
jacksonConverter : "com.squareup.retrofit2:converter-jackson:$versions.retrofit",
|
||||||
jacksonKotlin : "com.fasterxml.jackson.module:jackson-module-kotlin:$versions.jackson",
|
jacksonKotlin : "com.fasterxml.jackson.module:jackson-module-kotlin:$versions.jackson",
|
||||||
okhttpLogging : "com.squareup.okhttp3:logging-interceptor:$versions.okhttp",
|
okhttpLogging : "com.squareup.okhttp3:logging-interceptor:$versions.okhttp",
|
||||||
twitterSerial : "com.twitter.serial:serial:$versions.twitterSerial",
|
|
||||||
koinCore : "io.insert-koin:koin-core:$versions.koin",
|
koinCore : "io.insert-koin:koin-core:$versions.koin",
|
||||||
koinAndroid : "io.insert-koin:koin-android:$versions.koin",
|
koinAndroid : "io.insert-koin:koin-android:$versions.koin",
|
||||||
koinViewModel : "io.insert-koin:koin-android-viewmodel:$versions.koin",
|
koinViewModel : "io.insert-koin:koin-android-viewmodel:$versions.koin",
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
include ':core:domain'
|
include ':core:domain'
|
||||||
include ':core:subsonic-api'
|
include ':core:subsonic-api'
|
||||||
include ':core:cache'
|
|
||||||
include ':ultrasonic'
|
include ':ultrasonic'
|
||||||
|
|
|
@ -70,7 +70,6 @@ tasks.withType(Test) {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':core:domain')
|
implementation project(':core:domain')
|
||||||
implementation project(':core:subsonic-api')
|
implementation project(':core:subsonic-api')
|
||||||
implementation project(':core:cache')
|
|
||||||
|
|
||||||
api(other.picasso) {
|
api(other.picasso) {
|
||||||
exclude group: "com.android.support"
|
exclude group: "com.android.support"
|
||||||
|
|
|
@ -9,7 +9,6 @@ import org.moire.ultrasonic.BuildConfig
|
||||||
import org.moire.ultrasonic.di.appPermanentStorage
|
import org.moire.ultrasonic.di.appPermanentStorage
|
||||||
import org.moire.ultrasonic.di.applicationModule
|
import org.moire.ultrasonic.di.applicationModule
|
||||||
import org.moire.ultrasonic.di.baseNetworkModule
|
import org.moire.ultrasonic.di.baseNetworkModule
|
||||||
import org.moire.ultrasonic.di.directoriesModule
|
|
||||||
import org.moire.ultrasonic.di.featureFlagsModule
|
import org.moire.ultrasonic.di.featureFlagsModule
|
||||||
import org.moire.ultrasonic.di.mediaPlayerModule
|
import org.moire.ultrasonic.di.mediaPlayerModule
|
||||||
import org.moire.ultrasonic.di.musicServiceModule
|
import org.moire.ultrasonic.di.musicServiceModule
|
||||||
|
@ -46,7 +45,6 @@ class UApp : MultiDexApplication() {
|
||||||
// declare modules to use
|
// declare modules to use
|
||||||
modules(
|
modules(
|
||||||
applicationModule,
|
applicationModule,
|
||||||
directoriesModule,
|
|
||||||
appPermanentStorage,
|
appPermanentStorage,
|
||||||
baseNetworkModule,
|
baseNetworkModule,
|
||||||
featureFlagsModule,
|
featureFlagsModule,
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
package org.moire.ultrasonic.cache
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides specific to Android implementation of [Directories].
|
|
||||||
*/
|
|
||||||
class AndroidDirectories(
|
|
||||||
private val context: Context
|
|
||||||
) : Directories {
|
|
||||||
override fun getInternalCacheDir(): File = context.cacheDir
|
|
||||||
|
|
||||||
override fun getInternalDataDir(): File = context.filesDir
|
|
||||||
|
|
||||||
override fun getExternalCacheDir(): File? = context.externalCacheDir
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package org.moire.ultrasonic.di
|
|
||||||
|
|
||||||
import org.koin.dsl.bind
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.moire.ultrasonic.cache.AndroidDirectories
|
|
||||||
import org.moire.ultrasonic.cache.Directories
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This Koin module contains the registration for Directories
|
|
||||||
*/
|
|
||||||
val directoriesModule = module {
|
|
||||||
single { AndroidDirectories(get()) } bind Directories::class
|
|
||||||
}
|
|
|
@ -10,7 +10,6 @@ import org.moire.ultrasonic.BuildConfig
|
||||||
import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient
|
import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient
|
||||||
import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions
|
import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions
|
||||||
import org.moire.ultrasonic.api.subsonic.SubsonicClientConfiguration
|
import org.moire.ultrasonic.api.subsonic.SubsonicClientConfiguration
|
||||||
import org.moire.ultrasonic.cache.PermanentFileStorage
|
|
||||||
import org.moire.ultrasonic.data.ActiveServerProvider
|
import org.moire.ultrasonic.data.ActiveServerProvider
|
||||||
import org.moire.ultrasonic.imageloader.ImageLoader
|
import org.moire.ultrasonic.imageloader.ImageLoader
|
||||||
import org.moire.ultrasonic.log.TimberOkHttpLogger
|
import org.moire.ultrasonic.log.TimberOkHttpLogger
|
||||||
|
@ -43,11 +42,6 @@ val musicServiceModule = module {
|
||||||
return@single abs("$serverUrl$serverInstance".hashCode()).toString()
|
return@single abs("$serverUrl$serverInstance".hashCode()).toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
single {
|
|
||||||
val serverId = get<String>(named("ServerID"))
|
|
||||||
return@single PermanentFileStorage(get(), serverId, BuildConfig.DEBUG)
|
|
||||||
}
|
|
||||||
|
|
||||||
single {
|
single {
|
||||||
val server = get<ActiveServerProvider>().getActiveServer()
|
val server = get<ActiveServerProvider>().getActiveServer()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue