userspace_ext_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package wgengine_test
  4. import (
  5. "testing"
  6. "github.com/tailscale/wireguard-go/tun"
  7. "tailscale.com/net/tstun"
  8. "tailscale.com/tsd"
  9. "tailscale.com/tstest"
  10. "tailscale.com/types/logger"
  11. "tailscale.com/wgengine"
  12. "tailscale.com/wgengine/router"
  13. )
  14. func TestIsNetstack(t *testing.T) {
  15. sys := tsd.NewSystem()
  16. e, err := wgengine.NewUserspaceEngine(
  17. tstest.WhileTestRunningLogger(t),
  18. wgengine.Config{
  19. SetSubsystem: sys.Set,
  20. HealthTracker: sys.HealthTracker.Get(),
  21. Metrics: sys.UserMetricsRegistry(),
  22. EventBus: sys.Bus.Get(),
  23. },
  24. )
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. defer e.Close()
  29. if !sys.IsNetstack() {
  30. t.Errorf("IsNetstack = false; want true")
  31. }
  32. }
  33. func TestIsNetstackRouter(t *testing.T) {
  34. tests := []struct {
  35. name string
  36. conf wgengine.Config
  37. setNetstackRouter bool
  38. want bool
  39. }{
  40. {
  41. name: "no_netstack",
  42. conf: wgengine.Config{
  43. Tun: newFakeOSTUN(),
  44. Router: newFakeOSRouter(),
  45. },
  46. want: false,
  47. },
  48. {
  49. name: "netstack",
  50. conf: wgengine.Config{},
  51. want: true,
  52. },
  53. {
  54. name: "hybrid_netstack",
  55. conf: wgengine.Config{
  56. Tun: newFakeOSTUN(),
  57. Router: newFakeOSRouter(),
  58. },
  59. setNetstackRouter: true,
  60. want: true,
  61. },
  62. }
  63. for _, tt := range tests {
  64. t.Run(tt.name, func(t *testing.T) {
  65. sys := tsd.NewSystem()
  66. if tt.setNetstackRouter {
  67. sys.NetstackRouter.Set(true)
  68. }
  69. conf := tt.conf
  70. conf.SetSubsystem = sys.Set
  71. conf.HealthTracker = sys.HealthTracker.Get()
  72. conf.Metrics = sys.UserMetricsRegistry()
  73. conf.EventBus = sys.Bus.Get()
  74. e, err := wgengine.NewUserspaceEngine(logger.Discard, conf)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. defer e.Close()
  79. if got := sys.IsNetstackRouter(); got != tt.want {
  80. t.Errorf("IsNetstackRouter = %v; want %v", got, tt.want)
  81. }
  82. })
  83. }
  84. }
  85. func newFakeOSRouter() router.Router {
  86. return someRandoOSRouter{router.NewFake(logger.Discard)}
  87. }
  88. type someRandoOSRouter struct {
  89. router.Router
  90. }
  91. func newFakeOSTUN() tun.Device {
  92. return someRandoOSTUN{tstun.NewFake()}
  93. }
  94. type someRandoOSTUN struct {
  95. tun.Device
  96. }
  97. // Name returns something that is not FakeTUN.
  98. func (t someRandoOSTUN) Name() (string, error) { return "some_os_tun0", nil }