userspace_ext_test.go 2.0 KB

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