userspace_ext_test.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package wgengine_test
  5. import (
  6. "testing"
  7. "golang.zx2c4.com/wireguard/tun"
  8. "tailscale.com/net/tstun"
  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. e, err := wgengine.NewUserspaceEngine(t.Logf, wgengine.Config{})
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. defer e.Close()
  20. if !wgengine.IsNetstack(e) {
  21. t.Errorf("IsNetstack = false; want true")
  22. }
  23. }
  24. func TestIsNetstackRouter(t *testing.T) {
  25. tests := []struct {
  26. name string
  27. conf wgengine.Config
  28. want bool
  29. }{
  30. {
  31. name: "no_netstack",
  32. conf: wgengine.Config{
  33. Tun: newFakeOSTUN(),
  34. Router: newFakeOSRouter(),
  35. },
  36. want: false,
  37. },
  38. {
  39. name: "netstack",
  40. conf: wgengine.Config{},
  41. want: true,
  42. },
  43. {
  44. name: "hybrid_netstack",
  45. conf: wgengine.Config{
  46. Tun: newFakeOSTUN(),
  47. Router: netstack.NewSubnetRouterWrapper(newFakeOSRouter()),
  48. },
  49. want: true,
  50. },
  51. }
  52. for _, tt := range tests {
  53. t.Run(tt.name, func(t *testing.T) {
  54. e, err := wgengine.NewUserspaceEngine(logger.Discard, tt.conf)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. defer e.Close()
  59. if got := wgengine.IsNetstackRouter(e); got != tt.want {
  60. t.Errorf("IsNetstackRouter = %v; want %v", got, tt.want)
  61. }
  62. if got := wgengine.IsNetstackRouter(wgengine.NewWatchdog(e)); got != tt.want {
  63. t.Errorf("IsNetstackRouter(watchdog-wrapped) = %v; want %v", got, tt.want)
  64. }
  65. })
  66. }
  67. }
  68. func newFakeOSRouter() router.Router {
  69. return someRandoOSRouter{router.NewFake(logger.Discard)}
  70. }
  71. type someRandoOSRouter struct {
  72. router.Router
  73. }
  74. func newFakeOSTUN() tun.Device {
  75. return someRandoOSTUN{tstun.NewFake()}
  76. }
  77. type someRandoOSTUN struct {
  78. tun.Device
  79. }
  80. // Name returns something that is not FakeTUN.
  81. func (t someRandoOSTUN) Name() (string, error) { return "some_os_tun0", nil }