Him188 5 лет назад
Родитель
Сommit
c6059ab9ec

+ 3 - 2
mirai-core-qqandroid/build.gradle.kts

@@ -46,7 +46,7 @@ kotlin {
             }
             }
         }
         }
 
 
-        commonMain {
+        val commonMain by getting {
             dependencies {
             dependencies {
                 api(kotlin("stdlib", Versions.Kotlin.stdlib))
                 api(kotlin("stdlib", Versions.Kotlin.stdlib))
                 api(kotlinx("serialization-runtime-common", Versions.Kotlin.serialization))
                 api(kotlinx("serialization-runtime-common", Versions.Kotlin.serialization))
@@ -58,7 +58,7 @@ kotlin {
             }
             }
         }
         }
 
 
-        commonTest {
+        val commonTest by getting {
             dependencies {
             dependencies {
                 implementation(kotlin("test-annotations-common"))
                 implementation(kotlin("test-annotations-common"))
                 implementation(kotlin("test-common"))
                 implementation(kotlin("test-common"))
@@ -94,6 +94,7 @@ kotlin {
 
 
         val jvmTest by getting {
         val jvmTest by getting {
             dependencies {
             dependencies {
+                dependsOn(commonTest)
                 implementation(kotlin("test", Versions.Kotlin.stdlib))
                 implementation(kotlin("test", Versions.Kotlin.stdlib))
                 implementation(kotlin("test-junit", Versions.Kotlin.stdlib))
                 implementation(kotlin("test-junit", Versions.Kotlin.stdlib))
                 implementation("org.pcap4j:pcap4j-distribution:1.8.2")
                 implementation("org.pcap4j:pcap4j-distribution:1.8.2")

+ 1 - 1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/AtomicResizeCacheList.kt

@@ -73,7 +73,7 @@ internal class AtomicResizeCacheList<E>(private val retention: Long) {
      * No concurrency guaranteed on same [element]
      * No concurrency guaranteed on same [element]
      */
      */
     private fun removeDuplication(element: E): Boolean {
     private fun removeDuplication(element: E): Boolean {
-        val duplicate = list.firstOrNull { it.element == element } ?: return false
+        val duplicate = list.firstOrNull { it.time.value != 0L && it.element == element } ?: return false
         duplicate.time.value = 0
         duplicate.time.value = 0
         return true
         return true
     }
     }

+ 41 - 0
mirai-core-qqandroid/src/jvmTest/kotlin/net/mamoe/mirai/qqandroid/utils/AtomicResizeCacheListTest.kt

@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/master/LICENSE
+ */
+
+package net.mamoe.mirai.qqandroid.utils
+
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import kotlin.test.Test
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+
+internal class AtomicResizeCacheListTest {
+    @Test
+    fun testDuplication() {
+        val list = AtomicResizeCacheList<Int>(1000)
+        assertTrue { list.ensureNoDuplication(1) }
+        assertFalse { list.ensureNoDuplication(1) }
+        assertTrue { list.ensureNoDuplication(1) }
+    }
+
+    @Test
+    fun testRetention() {
+        val list = AtomicResizeCacheList<Int>(1000)
+        assertTrue { list.ensureNoDuplication(1) }
+        runBlocking {
+            delay(1001)
+            // because no concurrency guaranteed on same elements
+            assertFalse { list.ensureNoDuplication(1) }
+            assertTrue { list.ensureNoDuplication(2) }
+            // outdated elements are now cleaned
+            assertTrue { list.ensureNoDuplication(1) }
+        }
+    }
+}