Files
MyGoNavi/internal/app/memory_reclaim_test.go
Syngnat ee78b9b57c ️ perf(import-export): 降低大文件导入导出内存占用
- xlsx 导出改为临时 sheet 加 zip 直写,避免整包缓冲到内存
- xlsx 导入改为 zip xml 流式解析,并将 shared strings 落到临时文件
- 大任务完成后按行数和文件大小阈值触发内存回收
- 补充导入导出流式链路的测试与基准覆盖
2026-06-18 09:21:01 +08:00

89 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package app
import (
"os"
"testing"
)
func TestShouldReleaseFileTransferMemory_UsesRowsThreshold(t *testing.T) {
if !shouldReleaseFileTransferMemory(fileTransferMemoryTrimRowsThreshold, "") {
t.Fatal("达到行数阈值时应触发内存回收")
}
if shouldReleaseFileTransferMemory(fileTransferMemoryTrimRowsThreshold-1, "") {
t.Fatal("未达到行数阈值时不应仅凭行数触发内存回收")
}
}
func TestShouldReleaseFileTransferMemory_UsesFileSizeThreshold(t *testing.T) {
f, err := os.CreateTemp("", "gonavi-memory-trim-*.bin")
if err != nil {
t.Fatalf("创建临时文件失败: %v", err)
}
defer os.Remove(f.Name())
defer f.Close()
if err := f.Truncate(fileTransferMemoryTrimFileSizeThreshold); err != nil {
t.Fatalf("设置临时文件大小失败: %v", err)
}
if !shouldReleaseFileTransferMemory(0, f.Name()) {
t.Fatal("达到文件大小阈值时应触发内存回收")
}
}
func TestMaybeReleaseFileTransferMemory_TriggersTrimForLargeJobs(t *testing.T) {
originalAsync := runFileTransferMemoryTrimAsync
originalTrim := fileTransferMemoryTrimFn
t.Cleanup(func() {
runFileTransferMemoryTrimAsync = originalAsync
fileTransferMemoryTrimFn = originalTrim
fileTransferMemoryTrimRunning.Store(false)
fileTransferMemoryTrimLastAt.Store(0)
})
fileTransferMemoryTrimRunning.Store(false)
fileTransferMemoryTrimLastAt.Store(0)
triggered := 0
runFileTransferMemoryTrimAsync = func(fn func()) {
fn()
}
fileTransferMemoryTrimFn = func() {
triggered++
}
maybeReleaseFileTransferMemory("test-large-job", fileTransferMemoryTrimRowsThreshold, "")
if triggered != 1 {
t.Fatalf("大任务完成后应触发一次内存回收got=%d", triggered)
}
}
func TestMaybeReleaseFileTransferMemory_SkipsSmallJobs(t *testing.T) {
originalAsync := runFileTransferMemoryTrimAsync
originalTrim := fileTransferMemoryTrimFn
t.Cleanup(func() {
runFileTransferMemoryTrimAsync = originalAsync
fileTransferMemoryTrimFn = originalTrim
fileTransferMemoryTrimRunning.Store(false)
fileTransferMemoryTrimLastAt.Store(0)
})
fileTransferMemoryTrimRunning.Store(false)
fileTransferMemoryTrimLastAt.Store(0)
triggered := 0
runFileTransferMemoryTrimAsync = func(fn func()) {
fn()
}
fileTransferMemoryTrimFn = func() {
triggered++
}
maybeReleaseFileTransferMemory("test-small-job", 10, "")
if triggered != 0 {
t.Fatalf("小任务不应触发内存回收got=%d", triggered)
}
}