1
0

xray_setting_warp_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package controller
  2. import (
  3. "errors"
  4. "net/http"
  5. "net/http/httptest"
  6. "net/url"
  7. "path/filepath"
  8. "strings"
  9. "testing"
  10. "github.com/gin-gonic/gin"
  11. "gorm.io/gorm"
  12. "github.com/mhsanaei/3x-ui/v3/internal/database"
  13. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  14. "github.com/mhsanaei/3x-ui/v3/internal/web/locale"
  15. )
  16. func TestWarpIntervalReportsClockPersistenceFailure(t *testing.T) {
  17. gin.SetMode(gin.TestMode)
  18. dbDir := t.TempDir()
  19. t.Setenv("XUI_DB_FOLDER", dbDir)
  20. if err := database.InitDB(filepath.Join(dbDir, "x-ui.db")); err != nil {
  21. t.Fatalf("InitDB: %v", err)
  22. }
  23. t.Cleanup(func() { _ = database.CloseDB() })
  24. db := database.GetDB()
  25. for _, setting := range []*model.Setting{
  26. {Key: "warpUpdateInterval", Value: "0"},
  27. {Key: "warpLastUpdate", Value: "0"},
  28. } {
  29. if err := db.Create(setting).Error; err != nil {
  30. t.Fatalf("seed %s: %v", setting.Key, err)
  31. }
  32. }
  33. const callback = "test:fail_warp_clock_update"
  34. errInjected := errors.New("injected WARP clock persistence failure")
  35. if err := db.Callback().Update().Before("gorm:update").Register(callback, func(tx *gorm.DB) {
  36. setting, ok := tx.Statement.Model.(*model.Setting)
  37. if ok && setting.Key == "warpLastUpdate" {
  38. tx.AddError(errInjected)
  39. }
  40. }); err != nil {
  41. t.Fatalf("register update callback: %v", err)
  42. }
  43. t.Cleanup(func() {
  44. if err := db.Callback().Update().Remove(callback); err != nil {
  45. t.Errorf("remove update callback: %v", err)
  46. }
  47. })
  48. engine := gin.New()
  49. engine.Use(func(c *gin.Context) {
  50. c.Set("I18n", func(_ locale.I18nType, key string, _ ...string) string { return key })
  51. c.Next()
  52. })
  53. NewXraySettingController(engine.Group("/panel/api"))
  54. form := url.Values{"interval": {"7"}}
  55. req := httptest.NewRequest(http.MethodPost, "/panel/api/xray/warp/interval", strings.NewReader(form.Encode()))
  56. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  57. w := httptest.NewRecorder()
  58. engine.ServeHTTP(w, req)
  59. if !strings.Contains(w.Body.String(), `"success":false`) {
  60. t.Fatalf("interval update reported success after clock persistence failure: %s", w.Body.String())
  61. }
  62. if !strings.Contains(w.Body.String(), errInjected.Error()) {
  63. t.Fatalf("response omitted clock persistence error: %s", w.Body.String())
  64. }
  65. }