fix(channelserver): fix flaky integration tests from 3 isolation issues

- testhelpers_db: retry truncateAllTables up to 3 times on deadlock,
  which occurs when previous tests' goroutines still hold DB connections
- handlers_rengoku_integration_test: restore rengoku_score table after
  TestRengokuData_SaveOnDBError drops it, preventing cascading failures
  in all subsequent rengoku tests
- client_connection_simulation_test: fix TestClientConnection_PacketDuringLogout
  to accept both race outcomes (save-wins or logout-wins) since both
  handlers independently load from DB and last-writer-wins is valid
This commit is contained in:
Houmgaor
2026-02-21 00:28:27 +01:00
parent d640bec8af
commit 0a489e7cc5
3 changed files with 47 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ import (
"strings"
"sync"
"testing"
"time"
"erupe-ce/server/channelserver/compression/nullcomp"
"github.com/jmoiron/sqlx"
@@ -250,6 +251,8 @@ func findProjectRoot(t *testing.T) string {
}
// truncateAllTables truncates all tables in the public schema for test isolation.
// It retries on deadlock, which can occur when a previous test's goroutines still
// hold connections with in-flight DB operations.
func truncateAllTables(t *testing.T, db *sqlx.DB) {
t.Helper()
@@ -268,11 +271,22 @@ func truncateAllTables(t *testing.T, db *sqlx.DB) {
tables = append(tables, name)
}
if len(tables) > 0 {
_, err := db.Exec("TRUNCATE " + strings.Join(tables, ", ") + " CASCADE")
if err != nil {
t.Fatalf("Failed to truncate tables: %v", err)
if len(tables) == 0 {
return
}
stmt := "TRUNCATE " + strings.Join(tables, ", ") + " CASCADE"
const maxRetries = 3
for attempt := 1; attempt <= maxRetries; attempt++ {
_, err := db.Exec(stmt)
if err == nil {
return
}
if attempt < maxRetries {
time.Sleep(50 * time.Millisecond)
continue
}
t.Fatalf("Failed to truncate tables after %d attempts: %v", maxRetries, err)
}
}