From 43b5e710ef8d08cf8ad210a5d2fa3a75e3e52547 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 19 Mar 2023 12:28:35 +0000
Subject: [PATCH] [mock] Fix mockUploadAudio always throws ISE, part of #2548

---
 mirai-core-mock/src/internal/contact/util.kt | 21 +++++++++++---------
 mirai-core-mock/test/AbsoluteFileTest.kt     | 17 ++++++++++++++++
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/mirai-core-mock/src/internal/contact/util.kt b/mirai-core-mock/src/internal/contact/util.kt
index 6a57cd83f..5aaae8c8a 100644
--- a/mirai-core-mock/src/internal/contact/util.kt
+++ b/mirai-core-mock/src/internal/contact/util.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2022 Mamoe Technologies and contributors.
+ * Copyright 2019-2023 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.
@@ -50,14 +50,17 @@ internal fun MessageSource.withMessage(msg: Message): MessageChain = buildMessag
 }
 
 @Suppress("UNUSED_PARAMETER")
-internal suspend fun ExternalResource.mockUploadAudio(bot: MockBot) = inResource {
-    OfflineAudio(
-        filename = md5.toUHexString() + ".amr",
-        fileMd5 = md5,
-        fileSize = size,
-        codec = AudioCodec.SILK,
-        extraData = null,
-    )
+internal suspend fun ExternalResource.mockUploadAudio(bot: MockBot): OfflineAudio {
+    val md5 = md5 // calculate before using resource
+    return inResource {
+        OfflineAudio(
+            filename = md5.toUHexString() + ".amr",
+            fileMd5 = md5,
+            fileSize = size,
+            codec = AudioCodec.SILK,
+            extraData = null,
+        )
+    }
 }
 
 internal suspend fun ExternalResource.mockUploadVoice(bot: MockBot) = kotlin.run {
diff --git a/mirai-core-mock/test/AbsoluteFileTest.kt b/mirai-core-mock/test/AbsoluteFileTest.kt
index 6990adaaa..2ebf345d8 100644
--- a/mirai-core-mock/test/AbsoluteFileTest.kt
+++ b/mirai-core-mock/test/AbsoluteFileTest.kt
@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.toList
 import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.event.events.GroupMessageEvent
 import net.mamoe.mirai.message.data.FileMessage
+import net.mamoe.mirai.mock.internal.contact.mockUploadAudio
 import net.mamoe.mirai.mock.internal.remotefile.absolutefile.MockRemoteFiles
 import net.mamoe.mirai.mock.internal.serverfs.MockServerFileSystemImpl
 import net.mamoe.mirai.mock.utils.simpleMemberInfo
@@ -145,4 +146,20 @@ internal class AbsoluteFileTest : MockBotTestBase() {
         }
         assertEquals(0, group.files.root.resolveFiles("/a").count())
     }
+
+    @Test
+    @Suppress("INVISIBLE_REFERENCE")
+    fun testMockUploadAudio() = runTest {
+        val file = runBIO {
+            kotlin.io.path.createTempFile("test", ".txt").toFile().apply {
+                writeText("test")
+                deleteOnExit()
+            }
+        }
+
+        file.toExternalResource().use {
+            assertIsInstance<net.mamoe.mirai.internal.utils.ExternalResourceImplByFile>(it)
+            it.mockUploadAudio(bot)
+        }
+    }
 }
\ No newline at end of file