wgengine/magicsock: fix data race in TestNetworkSendErrors (#20261)

`TestNetworkSendErrors/network-down` causes a data race because it
tried to `tstest.Replace` the `checkNetworkDownDuringTests` global
while `wgengine.Conn.networkDown` would read from it. This patch moves
this flag into a field within the `wgengine.Conn` struct, so there’s
no chance that two tests could trample on each other.

It also renames this field to `Conn.checkNetworkUpDuringTests`,
because `Conn.networkUp` is the name of the field that gets checked.

Fixes #20260

Signed-off-by: Simon Law <sfllaw@tailscale.com>
This commit is contained in:
Simon Law
2026-06-29 09:38:07 -07:00
committed by GitHub
parent 28e1320906
commit 825b7c479f
2 changed files with 9 additions and 7 deletions
+8 -5
View File
@@ -425,6 +425,13 @@ type Conn struct {
// homeDERPGauge is the usermetric gauge for the home DERP region ID.
// This can be nil when [Options.Metrics] are not enabled.
homeDERPGauge *usermetric.Gauge
// checkNetworkUpDuringTests controls whether [Conn.networkDown]
// will report the value of [Conn.networkUp] while running tests.
//
// This allows tests to pass when the user's machine is offline,
// but allows us to still test network-down behaviour when desired.
checkNetworkUpDuringTests bool
}
// SetDebugLoggingEnabled controls whether spammy debug logging is enabled.
@@ -1482,14 +1489,10 @@ func (c *Conn) LocalPort() uint16 {
var errNetworkDown = errors.New("magicsock: network down")
// This allows tests to pass when the user's machine is offline, but allows us
// to still test network-down behaviour when desired.
var checkNetworkDownDuringTests = false
func (c *Conn) networkDown() bool {
// For tests, always assume the network is up unless we're explicitly
// testing this behaviour.
if envknob.AssumeNetworkUp() || (testenv.InTest() && !checkNetworkDownDuringTests) {
if envknob.AssumeNetworkUp() || (testenv.InTest() && !c.checkNetworkUpDuringTests) {
return false
}
return !c.networkUp.Load()
+1 -2
View File
@@ -3386,9 +3386,8 @@ func TestNetworkSendErrors(t *testing.T) {
t.Skipf("skipping on %s", runtime.GOOS)
}
tstest.Replace(t, &checkNetworkDownDuringTests, true)
conn, reg := newTestConnAndRegistry(t)
conn.checkNetworkUpDuringTests = true
buffs := [][]byte{{00, 00, 00, 00, 00, 00, 00, 00}}
ep := &lazyEndpoint{