xray_balancer_override_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package service
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  6. )
  7. // The core takes any string as an override and closes every connection routed
  8. // to a tag it lacks, so each refused case here is traffic the panel would drop.
  9. func TestResolveOverrideTarget(t *testing.T) {
  10. cfg := &xray.Config{
  11. RouterConfig: []byte(`{
  12. "rules": [
  13. {"type": "field", "inboundTag": ["_bl_b2"], "balancerTag": "b2"},
  14. {"type": "field", "port": "7777", "balancerTag": "b3"},
  15. {"type": "field", "inboundTag": ["_bl_b4"], "balancerTag": "b4"}
  16. ],
  17. "balancers": [
  18. {"tag": "b1", "selector": ["proxy-"]},
  19. {"tag": "b2", "selector": ["proxy-"]},
  20. {"tag": "b3", "selector": ["proxy-"]},
  21. {"tag": "b4", "selector": ["proxy-"]}
  22. ]
  23. }`),
  24. OutboundConfigs: []byte(`[
  25. {"tag": "direct", "protocol": "freedom"},
  26. {"tag": "proxy-a", "protocol": "freedom"},
  27. {"tag": "_bl_b2", "protocol": "loopback", "settings": {"inboundTag": "_bl_b2"}}
  28. ]`),
  29. }
  30. cases := []struct {
  31. name, target, want string
  32. wantErr error
  33. }{
  34. {"outbound is used as is", "proxy-a", "proxy-a", nil},
  35. {"balancer resolves to the loopback outbound feeding it", "b2", "_bl_b2", nil},
  36. {"balancer without a loopback is refused", "b3", "", errOverrideTargetUnknown},
  37. {"loopback rule whose outbound is gone is refused", "b4", "", errOverrideTargetUnknown},
  38. {"unknown tag is refused", "no-such-outbound", "", errOverrideTargetUnknown},
  39. }
  40. for _, tc := range cases {
  41. t.Run(tc.name, func(t *testing.T) {
  42. got, err := resolveOverrideTarget(cfg, tc.target)
  43. if !errors.Is(err, tc.wantErr) {
  44. t.Fatalf("resolveOverrideTarget(%q) error = %v, want %v", tc.target, err, tc.wantErr)
  45. }
  46. if got != tc.want {
  47. t.Fatalf("resolveOverrideTarget(%q) = %q, want %q", tc.target, got, tc.want)
  48. }
  49. })
  50. }
  51. }