userspace_ext_test.go 1.9 KB

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