stardb/testing/pool_test.go

299 lines
6.4 KiB
Go
Raw Normal View History

2026-03-07 19:27:44 +08:00
package testing
import (
"testing"
"time"
"b612.me/stardb"
_ "modernc.org/sqlite"
)
func TestDefaultPoolConfig(t *testing.T) {
config := stardb.DefaultPoolConfig()
if config.MaxOpenConns != 25 {
t.Errorf("Expected MaxOpenConns 25, got %d", config.MaxOpenConns)
}
if config.MaxIdleConns != 5 {
t.Errorf("Expected MaxIdleConns 5, got %d", config.MaxIdleConns)
}
if config.ConnMaxLifetime != time.Hour {
t.Errorf("Expected ConnMaxLifetime 1 hour, got %v", config.ConnMaxLifetime)
}
if config.ConnMaxIdleTime != 10*time.Minute {
t.Errorf("Expected ConnMaxIdleTime 10 minutes, got %v", config.ConnMaxIdleTime)
}
}
func TestStarDB_SetPoolConfig(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
config := &stardb.PoolConfig{
MaxOpenConns: 50,
MaxIdleConns: 10,
ConnMaxLifetime: 30 * time.Minute,
ConnMaxIdleTime: 5 * time.Minute,
}
db.SetPoolConfig(config)
stats := db.Stats()
if stats.MaxOpenConnections != 50 {
t.Errorf("Expected MaxOpenConnections 50, got %d", stats.MaxOpenConnections)
}
}
func TestStarDB_SetPoolConfig_Partial(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
// Only set MaxOpenConns
config := &stardb.PoolConfig{
MaxOpenConns: 100,
}
db.SetPoolConfig(config)
stats := db.Stats()
if stats.MaxOpenConnections != 100 {
t.Errorf("Expected MaxOpenConnections 100, got %d", stats.MaxOpenConnections)
}
}
func TestStarDB_SetPoolConfig_Zero(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
// Zero values should be ignored
config := &stardb.PoolConfig{
MaxOpenConns: 0,
MaxIdleConns: 0,
}
db.SetPoolConfig(config)
// Should not panic or error
err = db.Ping()
if err != nil {
t.Errorf("Ping failed after SetPoolConfig with zero values: %v", err)
}
}
func TestStarDB_SetPoolConfig_NilConfig(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
db.SetPoolConfig(nil)
err = db.Ping()
if err != nil {
t.Errorf("Ping failed after SetPoolConfig(nil): %v", err)
}
}
func TestStarDB_SetPoolConfig_BeforeOpen(t *testing.T) {
db := stardb.NewStarDB()
db.SetPoolConfig(&stardb.PoolConfig{
MaxOpenConns: 10,
})
// should not panic when called before Open
}
2026-03-07 19:27:44 +08:00
func TestOpenWithPool_Default(t *testing.T) {
db, err := stardb.OpenWithPool("sqlite", ":memory:", nil)
if err != nil {
t.Fatalf("OpenWithPool failed: %v", err)
}
defer db.Close()
err = db.Ping()
if err != nil {
t.Errorf("Ping failed: %v", err)
}
stats := db.Stats()
if stats.MaxOpenConnections != 25 {
t.Errorf("Expected default MaxOpenConnections 25, got %d", stats.MaxOpenConnections)
}
}
func TestOpenWithPool_Custom(t *testing.T) {
config := &stardb.PoolConfig{
MaxOpenConns: 15,
MaxIdleConns: 3,
ConnMaxLifetime: 20 * time.Minute,
ConnMaxIdleTime: 3 * time.Minute,
}
db, err := stardb.OpenWithPool("sqlite", ":memory:", config)
if err != nil {
t.Fatalf("OpenWithPool failed: %v", err)
}
defer db.Close()
err = db.Ping()
if err != nil {
t.Errorf("Ping failed: %v", err)
}
stats := db.Stats()
if stats.MaxOpenConnections != 15 {
t.Errorf("Expected MaxOpenConnections 15, got %d", stats.MaxOpenConnections)
}
}
func TestOpenWithPool_InvalidDriver(t *testing.T) {
config := stardb.DefaultPoolConfig()
db, err := stardb.OpenWithPool("invalid_driver", "invalid_conn", config)
if err == nil {
db.Close()
t.Error("Expected error with invalid driver, got nil")
}
}
func TestOpenWithPool_Query(t *testing.T) {
db, err := stardb.OpenWithPool("sqlite", ":memory:", nil)
if err != nil {
t.Fatalf("OpenWithPool failed: %v", err)
}
defer db.Close()
// Create table
_, err = db.Exec(`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)`)
if err != nil {
t.Fatalf("Failed to create table: %v", err)
}
// Insert data
_, err = db.Exec(`INSERT INTO test (name) VALUES (?)`, "Alice")
if err != nil {
t.Fatalf("Failed to insert data: %v", err)
}
// Query data
rows, err := db.Query("SELECT * FROM test")
if err != nil {
t.Fatalf("Query failed: %v", err)
}
defer rows.Close()
if rows.Length() != 1 {
t.Errorf("Expected 1 row, got %d", rows.Length())
}
}
func TestPoolConfig_AllFields(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
config := &stardb.PoolConfig{
MaxOpenConns: 30,
MaxIdleConns: 8,
ConnMaxLifetime: 45 * time.Minute,
ConnMaxIdleTime: 7 * time.Minute,
}
db.SetPoolConfig(config)
// Verify by checking stats
stats := db.Stats()
if stats.MaxOpenConnections != 30 {
t.Errorf("Expected MaxOpenConnections 30, got %d", stats.MaxOpenConnections)
}
// Test that connections work
err = db.Ping()
if err != nil {
t.Errorf("Ping failed after SetPoolConfig: %v", err)
}
}
func TestPoolConfig_NegativeValues(t *testing.T) {
db := stardb.NewStarDB()
err := db.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
// Negative values should be ignored
config := &stardb.PoolConfig{
MaxOpenConns: -1,
MaxIdleConns: -1,
}
db.SetPoolConfig(config)
// Should not panic or error
err = db.Ping()
if err != nil {
t.Errorf("Ping failed after SetPoolConfig with negative values: %v", err)
}
}
func TestOpenWithPool_MultipleConnections(t *testing.T) {
config := &stardb.PoolConfig{
MaxOpenConns: 5,
MaxIdleConns: 2,
}
db, err := stardb.OpenWithPool("sqlite", ":memory:", config)
if err != nil {
t.Fatalf("OpenWithPool failed: %v", err)
}
defer db.Close()
// Create table
_, err = db.Exec(`CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)`)
if err != nil {
t.Fatalf("Failed to create table: %v", err)
}
// Perform multiple operations
for i := 0; i < 10; i++ {
_, err = db.Exec(`INSERT INTO test (value) VALUES (?)`, "test")
if err != nil {
t.Errorf("Insert %d failed: %v", i, err)
}
}
// Verify
rows, err := db.Query("SELECT COUNT(*) as count FROM test")
if err != nil {
t.Fatalf("Query failed: %v", err)
}
defer rows.Close()
count := rows.Row(0).MustInt("count")
if count != 10 {
t.Errorf("Expected 10 rows, got %d", count)
}
}