Skip to content

Commit

Permalink
Support multi instance
Browse files Browse the repository at this point in the history
Change-Id: Ifbddb7d781f5127bd5ed4bc6f88db4e161d4bd14
Signed-off-by: kexuan.yang <kexuan.yang@gmail.com>
  • Loading branch information
yangkx1024 committed Apr 24, 2024
1 parent ade37f4 commit 85dd5d6
Show file tree
Hide file tree
Showing 37 changed files with 889 additions and 824 deletions.
14 changes: 7 additions & 7 deletions Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "mmkv"
version = "0.4.4"
version = "0.5.0"
edition = "2021"
authors = ["Kexuan Yang <kexuan.yang@gmail.com>"]
description = "Rust version of MMKV"
Expand All @@ -16,18 +16,18 @@ exclude = [
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
protobuf = "3.3.0"
libc = "0.2.152"
crc = "3.0.1"
protobuf = "3.4.0"
libc = "0.2.153"
crc = "3.2.1"
eax = { version = "0.5.0", features = ["stream"], optional = true }
aes = { version = "0.8.3", optional = true }
aes = { version = "0.8.4", optional = true }
hex = { version = "0.4.3", optional = true }
mmkv-proc-macro-lib = { version = "0.0.3" }
chrono = { version = "0.4" }
chrono = { version = "0.4.38" }
once_cell = { version = "1.19.0" }

[build-dependencies]
protobuf-codegen = "3.3.0"
protobuf-codegen = "3.4.0"
protoc-bin-vendored = "3.0.0"

[features]
Expand Down
1 change: 1 addition & 0 deletions Package.swift
Expand Up @@ -32,6 +32,7 @@ let package = Package(
"build.sh",
"Cargo.lock",
"Cargo.toml",
"cbindgen.toml",
"README.md",
"LICENSE-APACHE",
"ios/MMKVDemo",
Expand Down
111 changes: 56 additions & 55 deletions android/app/src/androidTest/java/net/yangkx/mmkv/test/MMKVTest.kt
Expand Up @@ -19,164 +19,165 @@ import kotlin.random.Random
class MMKVTest {
private val appContext: Context
get() = InstrumentationRegistry.getInstrumentation().targetContext
private var mmkv: MMKV? = null

@Before
fun setUp() {
MMKVInitializer.init(appContext)
MMKV.clearData()
mmkv = MMKVInitializer.init(appContext)
mmkv!!.clearData()
}

@After
fun clean() {
MMKVInitializer.init(appContext)
MMKV.clearData()
mmkv?.clearData()
}

private fun initSdk() {
MMKVInitializer.init(appContext)
mmkv = null
System.runFinalization()
mmkv = MMKVInitializer.init(appContext)
}

@Test
fun testStringAndBoolApi() {
initSdk()
MMKV.putString("str_key", "test_str_value")
MMKV.putBool("bool_key", true)
mmkv!!.putString("str_key", "test_str_value")
mmkv!!.putBool("bool_key", true)
initSdk()
assertEquals(MMKV.getString("str_key"), "test_str_value")
assertEquals(MMKV.getBool("bool_key"), true)
MMKV.putBool("bool_key", false)
assertEquals(mmkv!!.getString("str_key"), "test_str_value")
assertEquals(mmkv!!.getBool("bool_key"), true)
mmkv!!.putBool("bool_key", false)
initSdk()
assertEquals(MMKV.getBool("bool_key"), false)
assertEquals(mmkv!!.getBool("bool_key"), false)
}

@Test
fun testIntApi() {
initSdk()
val random = Random.nextInt()
MMKV.putInt("int_random_key", random)
MMKV.putInt("int_max_key", Int.MAX_VALUE)
MMKV.putInt("int_min_key", Int.MIN_VALUE)
mmkv!!.putInt("int_random_key", random)
mmkv!!.putInt("int_max_key", Int.MAX_VALUE)
mmkv!!.putInt("int_min_key", Int.MIN_VALUE)
initSdk()
assertEquals(MMKV.getInt("int_random_key"), random)
assertEquals(MMKV.getInt("int_max_key"), Int.MAX_VALUE)
assertEquals(MMKV.getInt("int_min_key"), Int.MIN_VALUE)
assertEquals(mmkv!!.getInt("int_random_key"), random)
assertEquals(mmkv!!.getInt("int_max_key"), Int.MAX_VALUE)
assertEquals(mmkv!!.getInt("int_min_key"), Int.MIN_VALUE)
}

@Test
fun testLongApi() {
initSdk()
val random = Random.nextLong()
MMKV.putLong("long_random_key", random)
MMKV.putLong("long_max_key", Long.MAX_VALUE)
MMKV.putLong("long_min_key", Long.MIN_VALUE)
mmkv!!.putLong("long_random_key", random)
mmkv!!.putLong("long_max_key", Long.MAX_VALUE)
mmkv!!.putLong("long_min_key", Long.MIN_VALUE)
initSdk()
assertEquals(MMKV.getLong("long_random_key"), random)
assertEquals(MMKV.getLong("long_max_key"), Long.MAX_VALUE)
assertEquals(MMKV.getLong("long_min_key"), Long.MIN_VALUE)
assertEquals(mmkv!!.getLong("long_random_key"), random)
assertEquals(mmkv!!.getLong("long_max_key"), Long.MAX_VALUE)
assertEquals(mmkv!!.getLong("long_min_key"), Long.MIN_VALUE)
}

@Test
fun testFloatApi() {
initSdk()
val random = Random.nextFloat()
MMKV.putFloat("float_random_key", random)
MMKV.putFloat("float_max_key", Float.MAX_VALUE)
MMKV.putFloat("float_min_key", Float.MIN_VALUE)
mmkv!!.putFloat("float_random_key", random)
mmkv!!.putFloat("float_max_key", Float.MAX_VALUE)
mmkv!!.putFloat("float_min_key", Float.MIN_VALUE)
initSdk()
assertEquals(MMKV.getFloat("float_random_key"), random)
assertEquals(MMKV.getFloat("float_max_key"), Float.MAX_VALUE, 0f)
assertEquals(MMKV.getFloat("float_min_key"), Float.MIN_VALUE, 0f)
assertEquals(mmkv!!.getFloat("float_random_key"), random)
assertEquals(mmkv!!.getFloat("float_max_key"), Float.MAX_VALUE, 0f)
assertEquals(mmkv!!.getFloat("float_min_key"), Float.MIN_VALUE, 0f)
}

@Test
fun testDoubleApi() {
initSdk()
val random = Random.nextDouble()
MMKV.putDouble("double_random_key", random)
MMKV.putDouble("double_max_key", Double.MAX_VALUE)
MMKV.putDouble("double_min_key", Double.MIN_VALUE)
mmkv!!.putDouble("double_random_key", random)
mmkv!!.putDouble("double_max_key", Double.MAX_VALUE)
mmkv!!.putDouble("double_min_key", Double.MIN_VALUE)
initSdk()
assertEquals(MMKV.getDouble("double_random_key"), random, 0.0)
assertEquals(MMKV.getDouble("double_max_key"), Double.MAX_VALUE, 0.0)
assertEquals(MMKV.getDouble("double_min_key"), Double.MIN_VALUE, 0.0)
assertEquals(mmkv!!.getDouble("double_random_key"), random, 0.0)
assertEquals(mmkv!!.getDouble("double_max_key"), Double.MAX_VALUE, 0.0)
assertEquals(mmkv!!.getDouble("double_min_key"), Double.MIN_VALUE, 0.0)
}

@Test
fun testByteArrayApi() {
initSdk()
val random = Random.nextBytes(1)[0]
val array = byteArrayOf(Byte.MIN_VALUE, random, Byte.MAX_VALUE)
MMKV.putByteArray("byte_array_key", array)
mmkv!!.putByteArray("byte_array_key", array)
initSdk()
assertArrayEquals(MMKV.getByteArray("byte_array_key"), array)
assertArrayEquals(mmkv!!.getByteArray("byte_array_key"), array)
}

@Test
fun testIntArrayApi() {
initSdk()
val random = Random.nextInt()
val array = intArrayOf(Int.MIN_VALUE, random, Int.MAX_VALUE)
MMKV.putIntArray("int_array_key", array)
mmkv!!.putIntArray("int_array_key", array)
initSdk()
assertArrayEquals(MMKV.getIntArray("int_array_key"), array)
assertArrayEquals(mmkv!!.getIntArray("int_array_key"), array)
}

@Test
fun testLongArrayApi() {
initSdk()
val random = Random.nextLong()
val array = longArrayOf(Long.MIN_VALUE, random, Long.MAX_VALUE)
MMKV.putLongArray("long_array_key", array)
mmkv!!.putLongArray("long_array_key", array)
initSdk()
assertArrayEquals(MMKV.getLongArray("long_array_key"), array)
assertArrayEquals(mmkv!!.getLongArray("long_array_key"), array)
}

@Test
fun testFloatArrayApi() {
initSdk()
val random = Random.nextFloat()
val array = floatArrayOf(Float.MIN_VALUE, random, Float.MAX_VALUE)
MMKV.putFloatArray("float_array_key", array)
mmkv!!.putFloatArray("float_array_key", array)
initSdk()
assertArrayEquals(MMKV.getFloatArray("float_array_key"), array, 0f)
assertArrayEquals(mmkv!!.getFloatArray("float_array_key"), array, 0f)
}

@Test
fun testDoubleArrayApi() {
initSdk()
val random = Random.nextDouble()
val array = doubleArrayOf(Double.MIN_VALUE, random, Double.MAX_VALUE)
MMKV.putDoubleArray("double_array_key", array)
mmkv!!.putDoubleArray("double_array_key", array)
initSdk()
assertArrayEquals(MMKV.getDoubleArray("double_array_key"), array, 0.0)
assertArrayEquals(mmkv!!.getDoubleArray("double_array_key"), array, 0.0)
}

@Test
fun testPutAndDelete() {
val key = "key_to_delete"
initSdk()
MMKV.putInt(key, 1)
mmkv!!.putInt(key, 1)
initSdk()
MMKV.delete(key)
assertEquals(MMKV.getInt(key, -1), -1)
mmkv!!.delete(key)
assertEquals(mmkv!!.getInt(key, -1), -1)
initSdk()
assertEquals(MMKV.getInt(key, -1), -1)
assertEquals(mmkv!!.getInt(key, -1), -1)
}

@Test
fun testMultiThread() {
clean()
initSdk()
MMKV.setLogLevel(LogLevel.VERBOSE)
val threadArray = mutableListOf<Thread>()
val repeatCount = 1000
Thread {
val key = "multi_thread_repeat_key"
repeat(repeatCount) {
if (it % 2 == 0) {
MMKV.putInt(key, it)
mmkv!!.putInt(key, it)
} else {
MMKV.delete(key)
mmkv!!.delete(key)
}
}
}.apply {
Expand All @@ -186,7 +187,7 @@ class MMKVTest {
repeat(2) { i ->
Thread {
repeat(repeatCount) {
MMKV.putInt("task_${i}_key_$it", it)
mmkv!!.putInt("task_${i}_key_$it", it)
}
}.apply {
threadArray.add(this)
Expand All @@ -198,11 +199,11 @@ class MMKVTest {
threadArray.clear()

MMKV.setLogLevel(LogLevel.INFO)
assertEquals(MMKV.getInt("multi_thread_repeat_key", -1), -1)
assertEquals(mmkv!!.getInt("multi_thread_repeat_key", -1), -1)
repeat(2) { i ->
Thread {
repeat(repeatCount) {
assertEquals(MMKV.getInt("task_${i}_key_$it"), it)
assertEquals(mmkv!!.getInt("task_${i}_key_$it"), it)
}
}.apply {
threadArray.add(this)
Expand Down
Expand Up @@ -4,9 +4,9 @@ import android.content.Context
import net.yangkx.mmkv.log.LogLevel

object MMKVInitializer {
fun init(context: Context) {
fun init(context: Context): MMKV {
val dir = context.getDir("mmkv", Context.MODE_PRIVATE)
MMKV.initialize(dir.absolutePath)
MMKV.setLogLevel(LogLevel.VERBOSE)
return MMKV(dir.absolutePath)
}
}
Expand Up @@ -4,9 +4,9 @@ import android.content.Context
import net.yangkx.mmkv.log.LogLevel

object MMKVInitializer {
fun init(context: Context) {
fun init(context: Context): MMKV {
val dir = context.getDir("mmkv", Context.MODE_PRIVATE)
MMKV.initialize(dir.absolutePath, "88C51C536176AD8A8EE4A06F62EE897E")
MMKV.setLogLevel(LogLevel.DEBUG)
return MMKV(dir.absolutePath, "88C51C536176AD8A8EE4A06F62EE897E")
}
}

0 comments on commit 85dd5d6

Please sign in to comment.