xray_setting_warp_test.go 2.1 KB

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