mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 11:54:59 -04:00
profile manager tests
This commit is contained in:
parent
b8a02311de
commit
1943a9f331
@ -14,6 +14,7 @@
|
||||
package de.bixilon.minosoft
|
||||
|
||||
import de.bixilon.kutil.latch.SimpleLatch
|
||||
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
|
||||
import de.bixilon.minosoft.assets.meta.MinosoftMeta
|
||||
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
|
||||
import de.bixilon.minosoft.data.registries.fallback.FallbackRegistries
|
||||
@ -28,15 +29,24 @@ import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
import org.testng.annotations.BeforeSuite
|
||||
import java.nio.file.Path
|
||||
|
||||
|
||||
internal object MinosoftSIT {
|
||||
|
||||
private fun setupEnv() {
|
||||
Log.ASYNC_LOGGING = false
|
||||
RunConfiguration.VERBOSE_LOGGING = true
|
||||
RunConfiguration.APPLICATION_NAME = "Minosoft it"
|
||||
RunConfiguration::HOME_DIRECTORY.forceSet(Path.of(System.getProperty("java.io.tmpdir"), "minosoft"))
|
||||
RunConfiguration::CONFIG_DIRECTORY.forceSet(Path.of(System.getProperty("java.io.tmpdir"), "minosoft").resolve("conf"))
|
||||
RunConfiguration.PROFILES_HOT_RELOADING = false
|
||||
}
|
||||
|
||||
@BeforeSuite
|
||||
fun setup() {
|
||||
Log.ASYNC_LOGGING = false
|
||||
setupEnv()
|
||||
Log.log(LogMessageType.OTHER, LogLevels.INFO) { "This is java version ${System.getProperty("java.version")}" }
|
||||
RunConfiguration.VERBOSE_LOGGING = true
|
||||
KUtil.initBootClasses()
|
||||
KUtil.initPlayClasses()
|
||||
disableGC()
|
||||
|
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Minosoft
|
||||
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||
*/
|
||||
|
||||
package de.bixilon.minosoft.config.profile
|
||||
|
||||
class Boxed(val value: Int, val assigned: Boolean) {
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is Boxed) return false
|
||||
return other.value == this.value
|
||||
}
|
||||
}
|
@ -16,11 +16,9 @@ package de.bixilon.minosoft.config.profile.delegate.types
|
||||
import com.fasterxml.jackson.databind.InjectableValues
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode
|
||||
import com.fasterxml.jackson.module.kotlin.convertValue
|
||||
import de.bixilon.kutil.concurrent.lock.Lock
|
||||
import de.bixilon.kutil.json.JsonObject
|
||||
import de.bixilon.minosoft.config.profile.ProfileLock
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import de.bixilon.minosoft.config.profile.storage.ProfileStorage
|
||||
import de.bixilon.minosoft.config.profile.Boxed
|
||||
import de.bixilon.minosoft.config.profile.test.TestProfile
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import org.testng.Assert.assertEquals
|
||||
import org.testng.annotations.Test
|
||||
@ -65,7 +63,8 @@ class RedirectDelegateTest {
|
||||
fun `update redirect property`() {
|
||||
val profile = create()
|
||||
assertEquals(profile.config.prop, null)
|
||||
profile.update(mapOf("config" to mapOf("normal" to 12)))
|
||||
|
||||
profile.update(mapOf("config" to mapOf("prop" to 12)))
|
||||
assertEquals(profile.config.prop, Boxed(12, false))
|
||||
}
|
||||
|
||||
@ -82,23 +81,4 @@ class RedirectDelegateTest {
|
||||
}
|
||||
|
||||
|
||||
class TestProfile(
|
||||
override var storage: ProfileStorage? = null,
|
||||
override val lock: Lock = ProfileLock(),
|
||||
) : Profile {
|
||||
val config = TestConfig(this)
|
||||
}
|
||||
|
||||
class TestConfig(profile: Profile) {
|
||||
var prop by RedirectDelegate<Boxed?, Int?>(profile, { it?.value }, { it?.let { Boxed(it, false) } })
|
||||
var normal by StringDelegate(profile, "test")
|
||||
}
|
||||
|
||||
class Boxed(val value: Int, val unused: Boolean) {
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is Boxed) return false
|
||||
return other.value == this.value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Minosoft
|
||||
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||
*/
|
||||
|
||||
package de.bixilon.minosoft.config.profile.storage
|
||||
|
||||
import de.bixilon.minosoft.config.profile.test.TestProfileManager
|
||||
import de.bixilon.minosoft.protocol.ProtocolUtil.encodeNetwork
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import org.testng.Assert.assertEquals
|
||||
import org.testng.annotations.Test
|
||||
import java.io.FileOutputStream
|
||||
|
||||
@Test(groups = ["profiles"])
|
||||
class StorageProfileManagerTest {
|
||||
private val base by lazy { RunConfiguration.CONFIG_DIRECTORY.resolve("minosoft").resolve("test") }
|
||||
|
||||
|
||||
private fun dump(name: String, data: String) {
|
||||
val path = base.resolve("$name.json")
|
||||
path.parent.toFile().mkdirs()
|
||||
val stream = FileOutputStream(path.toFile())
|
||||
stream.write(data.encodeNetwork())
|
||||
stream.close()
|
||||
}
|
||||
|
||||
fun `load dumped profiles`() {
|
||||
val profile = """{"version": "1", "key_old": 123}"""
|
||||
dump("Dumped", profile)
|
||||
|
||||
val manager = TestProfileManager()
|
||||
assertEquals(manager["Dumped"], null)
|
||||
manager.load()
|
||||
val dumped = manager["Dumped"]!!
|
||||
assertEquals(dumped.key, 123)
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Minosoft
|
||||
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||
*/
|
||||
|
||||
package de.bixilon.minosoft.config.profile.test
|
||||
|
||||
import de.bixilon.kutil.concurrent.lock.Lock
|
||||
import de.bixilon.minosoft.config.profile.ProfileLock
|
||||
import de.bixilon.minosoft.config.profile.ProfileType
|
||||
import de.bixilon.minosoft.config.profile.delegate.primitive.IntDelegate
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import de.bixilon.minosoft.config.profile.storage.ProfileStorage
|
||||
import de.bixilon.minosoft.config.profile.test.config.ConfigC
|
||||
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
|
||||
|
||||
class TestProfile(
|
||||
override var storage: ProfileStorage? = null,
|
||||
override val lock: Lock = ProfileLock(),
|
||||
) : Profile {
|
||||
val config = ConfigC(this)
|
||||
|
||||
var key by IntDelegate(this, 1)
|
||||
|
||||
|
||||
companion object : ProfileType<TestProfile> {
|
||||
override val identifier = minosoft("test")
|
||||
override val clazz = TestProfile::class.java
|
||||
|
||||
override fun create(storage: ProfileStorage?) = TestProfile(storage)
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Minosoft
|
||||
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||
*/
|
||||
|
||||
package de.bixilon.minosoft.config.profile.test
|
||||
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode
|
||||
import de.bixilon.minosoft.config.profile.storage.StorageProfileManager
|
||||
|
||||
class TestProfileManager : StorageProfileManager<TestProfile>() {
|
||||
override val type get() = TestProfile
|
||||
override val latestVersion get() = 2
|
||||
|
||||
|
||||
override fun migrate(version: Int, data: ObjectNode) = when (version) {
|
||||
1 -> migrate1(data)
|
||||
else -> Unit
|
||||
}
|
||||
|
||||
fun migrate1(data: ObjectNode) {
|
||||
data.remove("key_old")?.asInt()?.let { data.put("key", it) }
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Minosoft
|
||||
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||
*/
|
||||
|
||||
package de.bixilon.minosoft.config.profile.test.config
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||
import de.bixilon.minosoft.config.profile.Boxed
|
||||
import de.bixilon.minosoft.config.profile.delegate.types.RedirectDelegate
|
||||
import de.bixilon.minosoft.config.profile.delegate.types.StringDelegate
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
|
||||
class ConfigC(profile: Profile) {
|
||||
@get:JsonDeserialize(using = RedirectDelegate.RedirectDeserializer::class)
|
||||
var prop by RedirectDelegate<Boxed?, Int?>(profile, { it?.value }, { it?.let { Boxed(it, false) } })
|
||||
var normal by StringDelegate(profile, "test")
|
||||
}
|
@ -13,11 +13,16 @@
|
||||
|
||||
package de.bixilon.minosoft.config.profile.delegate.types
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParser
|
||||
import com.fasterxml.jackson.databind.DeserializationContext
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
|
||||
import de.bixilon.kutil.observer.DataObserver
|
||||
import de.bixilon.minosoft.config.profile.delegate.AbstractProfileDelegate
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
@JsonDeserialize(using = RedirectDelegate.RedirectDeserializer::class)
|
||||
class RedirectDelegate<V, S>(
|
||||
override val profile: Profile,
|
||||
val serializer: (V?) -> S?,
|
||||
@ -33,4 +38,12 @@ class RedirectDelegate<V, S>(
|
||||
// fun setValue(thisRef: Any, property: KProperty<*>, value: S?) {
|
||||
// setValue(thisRef, property, lookup(value))
|
||||
// }
|
||||
|
||||
object RedirectDeserializer : StdDeserializer<Any>(Any::class.java) {
|
||||
|
||||
override fun deserialize(parser: JsonParser, context: DeserializationContext?): Any {
|
||||
return "test"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -146,8 +146,10 @@ abstract class StorageProfileManager<P : Profile> : Iterable<P>, Identified {
|
||||
this.selected = this[selected] ?: create(selected)
|
||||
this::selected.observe(this) { ProfileIOManager.saveSelected(this) }
|
||||
|
||||
if (RunConfiguration.PROFILES_HOT_RELOADING) {
|
||||
observe(root.toPath())
|
||||
}
|
||||
}
|
||||
|
||||
private fun observe(root: Path) {
|
||||
FileWatcherService.watchAsync(root, setOf(ENTRY_MODIFY, ENTRY_CREATE)) { _, path ->
|
||||
|
Loading…
x
Reference in New Issue
Block a user