proxy_fallback_test.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //go:build unit
  2. package service
  3. import (
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func mkProxy(id int64, mode string, backup *int64, expiresInDays *int, now time.Time) Proxy {
  9. p := Proxy{ID: id, FallbackMode: mode, BackupProxyID: backup}
  10. if expiresInDays != nil {
  11. t := now.AddDate(0, 0, *expiresInDays)
  12. p.ExpiresAt = &t
  13. }
  14. return p
  15. }
  16. func i64(v int64) *int64 { return &v }
  17. func di(v int) *int { return &v }
  18. func TestResolveFallbackTarget(t *testing.T) {
  19. now := time.Now()
  20. t.Run("none keeps original", func(t *testing.T) {
  21. a := mkProxy(1, FallbackModeNone, nil, di(-1), now)
  22. by := map[int64]Proxy{1: a}
  23. target, change := ResolveProxyFallbackTarget(a, by, now)
  24. require.False(t, change)
  25. require.Nil(t, target)
  26. })
  27. t.Run("direct -> nil target, change", func(t *testing.T) {
  28. a := mkProxy(1, FallbackModeDirect, nil, di(-1), now)
  29. by := map[int64]Proxy{1: a}
  30. target, change := ResolveProxyFallbackTarget(a, by, now)
  31. require.True(t, change)
  32. require.Nil(t, target)
  33. })
  34. t.Run("proxy -> healthy backup", func(t *testing.T) {
  35. b := mkProxy(2, FallbackModeNone, nil, di(30), now)
  36. a := mkProxy(1, FallbackModeProxy, i64(2), di(-1), now)
  37. by := map[int64]Proxy{1: a, 2: b}
  38. target, change := ResolveProxyFallbackTarget(a, by, now)
  39. require.True(t, change)
  40. require.NotNil(t, target)
  41. require.Equal(t, int64(2), *target)
  42. })
  43. t.Run("chain A->B(expired)->C(healthy)", func(t *testing.T) {
  44. c := mkProxy(3, FallbackModeNone, nil, di(30), now)
  45. b := mkProxy(2, FallbackModeProxy, i64(3), di(-1), now)
  46. a := mkProxy(1, FallbackModeProxy, i64(2), di(-1), now)
  47. by := map[int64]Proxy{1: a, 2: b, 3: c}
  48. target, change := ResolveProxyFallbackTarget(a, by, now)
  49. require.True(t, change)
  50. require.Equal(t, int64(3), *target)
  51. })
  52. t.Run("cycle A->B->A keeps original", func(t *testing.T) {
  53. b := mkProxy(2, FallbackModeProxy, i64(1), di(-1), now)
  54. a := mkProxy(1, FallbackModeProxy, i64(2), di(-1), now)
  55. by := map[int64]Proxy{1: a, 2: b}
  56. target, change := ResolveProxyFallbackTarget(a, by, now)
  57. require.False(t, change)
  58. require.Nil(t, target)
  59. })
  60. t.Run("chain tail direct fallback", func(t *testing.T) {
  61. b := mkProxy(2, FallbackModeDirect, nil, di(-1), now)
  62. a := mkProxy(1, FallbackModeProxy, i64(2), di(-1), now)
  63. by := map[int64]Proxy{1: a, 2: b}
  64. target, change := ResolveProxyFallbackTarget(a, by, now)
  65. require.True(t, change)
  66. require.Nil(t, target)
  67. })
  68. }