userspace_ext_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 := new(tsd.System)
  16. e, err := wgengine.NewUserspaceEngine(
  17. tstest.WhileTestRunningLogger(t),
  18. wgengine.Config{
  19. SetSubsystem: sys.Set,
  20. HealthTracker: sys.HealthTracker(),
  21. Metrics: sys.UserMetricsRegistry(),
  22. },
  23. )
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. defer e.Close()
  28. if !sys.IsNetstack() {
  29. t.Errorf("IsNetstack = false; want true")
  30. }
  31. }
  32. func TestIsNetstackRouter(t *testing.T) {
  33. tests := []struct {
  34. name string
  35. conf wgengine.Config
  36. setNetstackRouter bool
  37. want bool
  38. }{
  39. {
  40. name: "no_netstack",
  41. conf: wgengine.Config{
  42. Tun: newFakeOSTUN(),
  43. Router: newFakeOSRouter(),
  44. },
  45. want: false,
  46. },
  47. {
  48. name: "netstack",
  49. conf: wgengine.Config{},
  50. want: true,
  51. },
  52. {
  53. name: "hybrid_netstack",
  54. conf: wgengine.Config{
  55. Tun: newFakeOSTUN(),
  56. Router: newFakeOSRouter(),
  57. },
  58. setNetstackRouter: true,
  59. want: true,
  60. },
  61. }
  62. for _, tt := range tests {
  63. t.Run(tt.name, func(t *testing.T) {
  64. sys := &tsd.System{}
  65. if tt.setNetstackRouter {
  66. sys.NetstackRouter.Set(true)
  67. }
  68. conf := tt.conf
  69. conf.SetSubsystem = sys.Set
  70. conf.HealthTracker = sys.HealthTracker()
  71. conf.Metrics = sys.UserMetricsRegistry()
  72. e, err := wgengine.NewUserspaceEngine(logger.Discard, conf)
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. defer e.Close()
  77. if got := sys.IsNetstackRouter(); got != tt.want {
  78. t.Errorf("IsNetstackRouter = %v; want %v", got, tt.want)
  79. }
  80. })
  81. }
  82. }
  83. func newFakeOSRouter() router.Router {
  84. return someRandoOSRouter{router.NewFake(logger.Discard)}
  85. }
  86. type someRandoOSRouter struct {
  87. router.Router
  88. }
  89. func newFakeOSTUN() tun.Device {
  90. return someRandoOSTUN{tstun.NewFake()}
  91. }
  92. type someRandoOSTUN struct {
  93. tun.Device
  94. }
  95. // Name returns something that is not FakeTUN.
  96. func (t someRandoOSTUN) Name() (string, error) { return "some_os_tun0", nil }