journal_mode_test.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package database
  2. import (
  3. "bytes"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  8. )
  9. func journalModeOf(t *testing.T) string {
  10. t.Helper()
  11. var mode string
  12. if err := db.Raw("PRAGMA journal_mode;").Scan(&mode).Error; err != nil {
  13. t.Fatalf("read journal_mode: %v", err)
  14. }
  15. return mode
  16. }
  17. func TestSqliteJournalModeDefaultsToWal(t *testing.T) {
  18. t.Setenv("XUI_DB_JOURNAL_MODE", "")
  19. dbDir := t.TempDir()
  20. if err := InitDB(filepath.Join(dbDir, "x-ui.db")); err != nil {
  21. t.Fatalf("InitDB: %v", err)
  22. }
  23. t.Cleanup(func() { _ = CloseDB() })
  24. if got := journalModeOf(t); got != "wal" {
  25. t.Fatalf("journal_mode = %q, want wal", got)
  26. }
  27. }
  28. func TestSqliteJournalModeEnvOverrideDelete(t *testing.T) {
  29. t.Setenv("XUI_DB_JOURNAL_MODE", "delete")
  30. dbDir := t.TempDir()
  31. if err := InitDB(filepath.Join(dbDir, "x-ui.db")); err != nil {
  32. t.Fatalf("InitDB: %v", err)
  33. }
  34. t.Cleanup(func() { _ = CloseDB() })
  35. if got := journalModeOf(t); got != "delete" {
  36. t.Fatalf("journal_mode = %q, want delete", got)
  37. }
  38. }
  39. func TestWalCheckpointMakesRawFileBackupComplete(t *testing.T) {
  40. t.Setenv("XUI_DB_JOURNAL_MODE", "")
  41. dbDir := t.TempDir()
  42. dbPath := filepath.Join(dbDir, "x-ui.db")
  43. if err := InitDB(dbPath); err != nil {
  44. t.Fatalf("InitDB: %v", err)
  45. }
  46. t.Cleanup(func() { _ = CloseDB() })
  47. if err := db.Create(&model.Setting{Key: "walBackupProbe", Value: "42"}).Error; err != nil {
  48. t.Fatalf("write setting: %v", err)
  49. }
  50. if err := Checkpoint(); err != nil {
  51. t.Fatalf("Checkpoint: %v", err)
  52. }
  53. raw, err := os.ReadFile(dbPath)
  54. if err != nil {
  55. t.Fatalf("read db file: %v", err)
  56. }
  57. copyPath := filepath.Join(t.TempDir(), "copy.db")
  58. if err := os.WriteFile(copyPath, raw, 0o600); err != nil {
  59. t.Fatalf("write copy: %v", err)
  60. }
  61. if err := ValidateSQLiteDB(copyPath); err != nil {
  62. t.Fatalf("checkpointed raw copy must be a valid sqlite db: %v", err)
  63. }
  64. dump, err := DumpSQLiteToBytes(copyPath)
  65. if err != nil {
  66. t.Fatalf("dump copy: %v", err)
  67. }
  68. if !bytes.Contains(dump, []byte("walBackupProbe")) {
  69. t.Fatal("raw-file backup taken after Checkpoint must contain the latest write")
  70. }
  71. }