mirror of
https://github.com/juanfont/headscale.git
synced 2025-11-10 01:20:58 +01:00
Fix flaky TestShuffleDERPMapDeterministic by ensuring deterministic map iteration (#2848)
Co-authored-by: kradalby <98431+kradalby@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
parent
f9bb88ad24
commit
d23fa26395
@ -12,6 +12,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -126,7 +127,17 @@ func shuffleDERPMap(dm *tailcfg.DERPMap) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for id, region := range dm.Regions {
|
// Collect region IDs and sort them to ensure deterministic iteration order.
|
||||||
|
// Map iteration order is non-deterministic in Go, which would cause the
|
||||||
|
// shuffle to be non-deterministic even with a fixed seed.
|
||||||
|
ids := make([]int, 0, len(dm.Regions))
|
||||||
|
for id := range dm.Regions {
|
||||||
|
ids = append(ids, id)
|
||||||
|
}
|
||||||
|
slices.Sort(ids)
|
||||||
|
|
||||||
|
for _, id := range ids {
|
||||||
|
region := dm.Regions[id]
|
||||||
if len(region.Nodes) == 0 {
|
if len(region.Nodes) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,9 +83,9 @@ func TestShuffleDERPMapDeterministic(t *testing.T) {
|
|||||||
RegionCode: "sea",
|
RegionCode: "sea",
|
||||||
RegionName: "Seattle",
|
RegionName: "Seattle",
|
||||||
Nodes: []*tailcfg.DERPNode{
|
Nodes: []*tailcfg.DERPNode{
|
||||||
{Name: "10b", RegionID: 10, HostName: "derp10b.tailscale.com"},
|
|
||||||
{Name: "10c", RegionID: 10, HostName: "derp10c.tailscale.com"},
|
|
||||||
{Name: "10d", RegionID: 10, HostName: "derp10d.tailscale.com"},
|
{Name: "10d", RegionID: 10, HostName: "derp10d.tailscale.com"},
|
||||||
|
{Name: "10c", RegionID: 10, HostName: "derp10c.tailscale.com"},
|
||||||
|
{Name: "10b", RegionID: 10, HostName: "derp10b.tailscale.com"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
2: {
|
2: {
|
||||||
@ -93,9 +93,9 @@ func TestShuffleDERPMapDeterministic(t *testing.T) {
|
|||||||
RegionCode: "sfo",
|
RegionCode: "sfo",
|
||||||
RegionName: "San Francisco",
|
RegionName: "San Francisco",
|
||||||
Nodes: []*tailcfg.DERPNode{
|
Nodes: []*tailcfg.DERPNode{
|
||||||
{Name: "2f", RegionID: 2, HostName: "derp2f.tailscale.com"},
|
|
||||||
{Name: "2e", RegionID: 2, HostName: "derp2e.tailscale.com"},
|
|
||||||
{Name: "2d", RegionID: 2, HostName: "derp2d.tailscale.com"},
|
{Name: "2d", RegionID: 2, HostName: "derp2d.tailscale.com"},
|
||||||
|
{Name: "2e", RegionID: 2, HostName: "derp2e.tailscale.com"},
|
||||||
|
{Name: "2f", RegionID: 2, HostName: "derp2f.tailscale.com"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -169,6 +169,74 @@ func TestShuffleDERPMapDeterministic(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "same dataset with another base domain",
|
||||||
|
baseDomain: "another.example.com",
|
||||||
|
derpMap: &tailcfg.DERPMap{
|
||||||
|
Regions: map[int]*tailcfg.DERPRegion{
|
||||||
|
4: {
|
||||||
|
RegionID: 4,
|
||||||
|
RegionCode: "fra",
|
||||||
|
RegionName: "Frankfurt",
|
||||||
|
Nodes: []*tailcfg.DERPNode{
|
||||||
|
{Name: "4f", RegionID: 4, HostName: "derp4f.tailscale.com"},
|
||||||
|
{Name: "4g", RegionID: 4, HostName: "derp4g.tailscale.com"},
|
||||||
|
{Name: "4h", RegionID: 4, HostName: "derp4h.tailscale.com"},
|
||||||
|
{Name: "4i", RegionID: 4, HostName: "derp4i.tailscale.com"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &tailcfg.DERPMap{
|
||||||
|
Regions: map[int]*tailcfg.DERPRegion{
|
||||||
|
4: {
|
||||||
|
RegionID: 4,
|
||||||
|
RegionCode: "fra",
|
||||||
|
RegionName: "Frankfurt",
|
||||||
|
Nodes: []*tailcfg.DERPNode{
|
||||||
|
{Name: "4h", RegionID: 4, HostName: "derp4h.tailscale.com"},
|
||||||
|
{Name: "4f", RegionID: 4, HostName: "derp4f.tailscale.com"},
|
||||||
|
{Name: "4g", RegionID: 4, HostName: "derp4g.tailscale.com"},
|
||||||
|
{Name: "4i", RegionID: 4, HostName: "derp4i.tailscale.com"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "same dataset with yet another base domain",
|
||||||
|
baseDomain: "yetanother.example.com",
|
||||||
|
derpMap: &tailcfg.DERPMap{
|
||||||
|
Regions: map[int]*tailcfg.DERPRegion{
|
||||||
|
4: {
|
||||||
|
RegionID: 4,
|
||||||
|
RegionCode: "fra",
|
||||||
|
RegionName: "Frankfurt",
|
||||||
|
Nodes: []*tailcfg.DERPNode{
|
||||||
|
{Name: "4f", RegionID: 4, HostName: "derp4f.tailscale.com"},
|
||||||
|
{Name: "4g", RegionID: 4, HostName: "derp4g.tailscale.com"},
|
||||||
|
{Name: "4h", RegionID: 4, HostName: "derp4h.tailscale.com"},
|
||||||
|
{Name: "4i", RegionID: 4, HostName: "derp4i.tailscale.com"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &tailcfg.DERPMap{
|
||||||
|
Regions: map[int]*tailcfg.DERPRegion{
|
||||||
|
4: {
|
||||||
|
RegionID: 4,
|
||||||
|
RegionCode: "fra",
|
||||||
|
RegionName: "Frankfurt",
|
||||||
|
Nodes: []*tailcfg.DERPNode{
|
||||||
|
{Name: "4i", RegionID: 4, HostName: "derp4i.tailscale.com"},
|
||||||
|
{Name: "4h", RegionID: 4, HostName: "derp4h.tailscale.com"},
|
||||||
|
{Name: "4f", RegionID: 4, HostName: "derp4f.tailscale.com"},
|
||||||
|
{Name: "4g", RegionID: 4, HostName: "derp4g.tailscale.com"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user