tailscale/wgengine/userspace_ext_test.go
M. J. Fromberger 3219e27dff all: construct new System values with an event bus pre-populated
Although, at the moment, we do not yet require an event bus to be present, as
we start to add more pieces we will want to ensure it is always available.  Add
a new constructor and replace existing uses of new(tsd.System) throughout.
Update generated files for import changes.

Updates #15160

Change-Id: Ie5460985571ade87b8eac8b416948c7f49f0f64b
Signed-off-by: M. J. Fromberger <fromberger@tailscale.com>
2025-03-24 14:37:59 -07:00

107 lines
2.2 KiB
Go

// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
package wgengine_test
import (
"testing"
"github.com/tailscale/wireguard-go/tun"
"tailscale.com/net/tstun"
"tailscale.com/tsd"
"tailscale.com/tstest"
"tailscale.com/types/logger"
"tailscale.com/wgengine"
"tailscale.com/wgengine/router"
)
func TestIsNetstack(t *testing.T) {
sys := new(tsd.System)
e, err := wgengine.NewUserspaceEngine(
tstest.WhileTestRunningLogger(t),
wgengine.Config{
SetSubsystem: sys.Set,
HealthTracker: sys.HealthTracker(),
Metrics: sys.UserMetricsRegistry(),
},
)
if err != nil {
t.Fatal(err)
}
defer e.Close()
if !sys.IsNetstack() {
t.Errorf("IsNetstack = false; want true")
}
}
func TestIsNetstackRouter(t *testing.T) {
tests := []struct {
name string
conf wgengine.Config
setNetstackRouter bool
want bool
}{
{
name: "no_netstack",
conf: wgengine.Config{
Tun: newFakeOSTUN(),
Router: newFakeOSRouter(),
},
want: false,
},
{
name: "netstack",
conf: wgengine.Config{},
want: true,
},
{
name: "hybrid_netstack",
conf: wgengine.Config{
Tun: newFakeOSTUN(),
Router: newFakeOSRouter(),
},
setNetstackRouter: true,
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
sys := tsd.NewSystemWithEventBus()
if tt.setNetstackRouter {
sys.NetstackRouter.Set(true)
}
conf := tt.conf
conf.SetSubsystem = sys.Set
conf.HealthTracker = sys.HealthTracker()
conf.Metrics = sys.UserMetricsRegistry()
e, err := wgengine.NewUserspaceEngine(logger.Discard, conf)
if err != nil {
t.Fatal(err)
}
defer e.Close()
if got := sys.IsNetstackRouter(); got != tt.want {
t.Errorf("IsNetstackRouter = %v; want %v", got, tt.want)
}
})
}
}
func newFakeOSRouter() router.Router {
return someRandoOSRouter{router.NewFake(logger.Discard)}
}
type someRandoOSRouter struct {
router.Router
}
func newFakeOSTUN() tun.Device {
return someRandoOSTUN{tstun.NewFake()}
}
type someRandoOSTUN struct {
tun.Device
}
// Name returns something that is not FakeTUN.
func (t someRandoOSTUN) Name() (string, error) { return "some_os_tun0", nil }