1
0

manager_convergence_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package runtime
  2. import (
  3. "testing"
  4. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  5. )
  6. func TestManagerRemoteForRefreshesChangedCredential(t *testing.T) {
  7. m := NewManager(LocalDeps{})
  8. first, err := m.RemoteFor(&model.Node{
  9. Id: 1,
  10. Name: "node",
  11. Scheme: "https",
  12. Address: "node.example.com",
  13. Port: 2053,
  14. BasePath: "/",
  15. ApiToken: "old-token",
  16. })
  17. if err != nil {
  18. t.Fatalf("first RemoteFor: %v", err)
  19. }
  20. second, err := m.RemoteFor(&model.Node{
  21. Id: 1,
  22. Name: "node",
  23. Scheme: "https",
  24. Address: "node.example.com",
  25. Port: 2053,
  26. BasePath: "/",
  27. ApiToken: "new-token",
  28. })
  29. if err != nil {
  30. t.Fatalf("second RemoteFor: %v", err)
  31. }
  32. if second == first {
  33. t.Fatal("RemoteFor reused stale Remote after ApiToken changed")
  34. }
  35. if got := second.node.ApiToken; got != "new-token" {
  36. t.Fatalf("cached Remote token = %q, want new-token", got)
  37. }
  38. }
  39. func TestManagerRemoteForIdentityFields(t *testing.T) {
  40. base := model.Node{
  41. Id: 7,
  42. Name: "node-a",
  43. Remark: "old remark",
  44. Scheme: "https",
  45. Address: "node.example.com",
  46. Port: 2053,
  47. BasePath: "/",
  48. ApiToken: "token",
  49. AllowPrivateAddress: true,
  50. TlsVerifyMode: "pin",
  51. PinnedCertSha256: "sha",
  52. OutboundTag: "warp",
  53. Status: "online",
  54. InboundCount: 1,
  55. }
  56. cases := []struct {
  57. name string
  58. mutate func(*model.Node)
  59. refresh bool
  60. }{
  61. {"same", func(*model.Node) {}, false},
  62. {"name does not churn", func(n *model.Node) { n.Name = "renamed" }, false},
  63. {"remark does not churn", func(n *model.Node) { n.Remark = "new remark" }, false},
  64. {"status does not churn", func(n *model.Node) { n.Status = "offline" }, false},
  65. {"metrics do not churn", func(n *model.Node) { n.InboundCount = 99 }, false},
  66. {"scheme", func(n *model.Node) { n.Scheme = "http" }, true},
  67. {"address", func(n *model.Node) { n.Address = "other.example.com" }, true},
  68. {"port", func(n *model.Node) { n.Port = 8443 }, true},
  69. {"base path", func(n *model.Node) { n.BasePath = "/x/" }, true},
  70. {"api token", func(n *model.Node) { n.ApiToken = "next" }, true},
  71. {"allow private", func(n *model.Node) { n.AllowPrivateAddress = false }, true},
  72. {"tls verify mode", func(n *model.Node) { n.TlsVerifyMode = "skip" }, true},
  73. {"pin", func(n *model.Node) { n.PinnedCertSha256 = "other" }, true},
  74. {"outbound tag", func(n *model.Node) { n.OutboundTag = "direct" }, true},
  75. }
  76. for _, tc := range cases {
  77. t.Run(tc.name, func(t *testing.T) {
  78. m := NewManager(LocalDeps{})
  79. firstNode := base
  80. first, err := m.RemoteFor(&firstNode)
  81. if err != nil {
  82. t.Fatalf("first RemoteFor: %v", err)
  83. }
  84. nextNode := base
  85. tc.mutate(&nextNode)
  86. second, err := m.RemoteFor(&nextNode)
  87. if err != nil {
  88. t.Fatalf("second RemoteFor: %v", err)
  89. }
  90. if gotRefresh := second != first; gotRefresh != tc.refresh {
  91. t.Fatalf("refresh = %v, want %v", gotRefresh, tc.refresh)
  92. }
  93. })
  94. }
  95. }
  96. func TestManagerRemoteForClonesInputNode(t *testing.T) {
  97. m := NewManager(LocalDeps{})
  98. n := &model.Node{
  99. Id: 9,
  100. Scheme: "https",
  101. Address: "node.example.com",
  102. Port: 2053,
  103. BasePath: "/",
  104. ApiToken: "original",
  105. }
  106. rt, err := m.RemoteFor(n)
  107. if err != nil {
  108. t.Fatalf("RemoteFor: %v", err)
  109. }
  110. n.ApiToken = "mutated-after-cache"
  111. if got := rt.node.ApiToken; got != "original" {
  112. t.Fatalf("cached Remote observed caller mutation: %q", got)
  113. }
  114. }