97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
package model
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func TestDefaultDBPoolConfig(t *testing.T) {
|
|
// 默认兜底测试
|
|
cfg := DefaultDBPoolConfig()
|
|
if cfg.MaxOpenConns <= 0 || cfg.MaxIdleConns <= 0 {
|
|
t.Fatalf("连接池默认值非法: %+v", cfg)
|
|
}
|
|
if cfg.MaxIdleConns > cfg.MaxOpenConns {
|
|
t.Fatalf("MaxIdleConns 不能大于 MaxOpenConns: %+v", cfg)
|
|
}
|
|
|
|
// 环境变量覆盖测试
|
|
os.Setenv("DB_MAX_OPEN_CONNS", "120")
|
|
os.Setenv("DB_MAX_IDLE_CONNS", "30")
|
|
os.Setenv("DB_CONN_MAX_LIFETIME_MINUTES", "120")
|
|
os.Setenv("DB_CONN_MAX_IDLE_MINUTES", "30")
|
|
defer func() {
|
|
os.Unsetenv("DB_MAX_OPEN_CONNS")
|
|
os.Unsetenv("DB_MAX_IDLE_CONNS")
|
|
os.Unsetenv("DB_CONN_MAX_LIFETIME_MINUTES")
|
|
os.Unsetenv("DB_CONN_MAX_IDLE_MINUTES")
|
|
}()
|
|
|
|
customCfg := DefaultDBPoolConfig()
|
|
if customCfg.MaxOpenConns != 120 {
|
|
t.Errorf("期望 MaxOpenConns=120, 实际=%d", customCfg.MaxOpenConns)
|
|
}
|
|
if customCfg.MaxIdleConns != 30 {
|
|
t.Errorf("期望 MaxIdleConns=30, 实际=%d", customCfg.MaxIdleConns)
|
|
}
|
|
if customCfg.ConnMaxLifetime != 120*time.Minute {
|
|
t.Errorf("期望 ConnMaxLifetime=120m, 实际=%v", customCfg.ConnMaxLifetime)
|
|
}
|
|
if customCfg.ConnMaxIdleTime != 30*time.Minute {
|
|
t.Errorf("期望 ConnMaxIdleTime=30m, 实际=%v", customCfg.ConnMaxIdleTime)
|
|
}
|
|
}
|
|
|
|
func TestApplyPoolConfig(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:pool_test_%d?mode=memory&cache=shared", time.Now().UnixNano())), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatalf("打开 sqlite 失败: %v", err)
|
|
}
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
t.Fatalf("获取 sql.DB 失败: %v", err)
|
|
}
|
|
|
|
cfg := DBPoolConfig{
|
|
MaxOpenConns: 25,
|
|
MaxIdleConns: 5,
|
|
ConnMaxLifetime: 30 * time.Minute,
|
|
ConnMaxIdleTime: 10 * time.Minute,
|
|
}
|
|
ApplyPoolConfig(sqlDB, cfg)
|
|
ApplyPoolConfig(nil, cfg) // 防空指针保护
|
|
|
|
stats := sqlDB.Stats()
|
|
if stats.MaxOpenConnections != 25 {
|
|
t.Errorf("期望 MaxOpenConnections=25, 实际=%d", stats.MaxOpenConnections)
|
|
}
|
|
}
|
|
|
|
func TestBuildGormLogger(t *testing.T) {
|
|
os.Setenv("GIN_MODE", "release")
|
|
relLog := BuildGormLogger()
|
|
if relLog == nil {
|
|
t.Fatal("release logger 为空")
|
|
}
|
|
|
|
os.Setenv("GIN_MODE", "debug")
|
|
debLog := BuildGormLogger()
|
|
if debLog == nil {
|
|
t.Fatal("debug logger 为空")
|
|
}
|
|
os.Unsetenv("GIN_MODE")
|
|
}
|
|
|
|
func init() {
|
|
// 避免测试时与真实 sql.DB 产生类型告警
|
|
var _ *sql.DB
|
|
var _ = logger.Warn
|
|
}
|