arblant
firefox-vpn-client / core / internal / proxy / pick_test.go
pick_test.go35 lines · 1.2 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
package proxy

import "testing"

// Like Firefox's server list: the first city that matches, one of its
// servers at random, never a server of another city.
func TestPickInFirstCityPicksAServerOfTheFirstCity(t *testing.T) {
	t.Parallel()

	candidates := []Candidate{
		{Addr: "fr1:443", CountryCode: "FR", CityCode: "par"},
		{Addr: "de1:443", CountryCode: "DE", CityCode: "ber"},
		{Addr: "de2:443", CountryCode: "DE", CityCode: "ber"},
		{Addr: "de3:443", CountryCode: "DE", CityCode: "fra"},
		{Addr: "de4:443", CountryCode: "DE", CityCode: "ber"},
	}
	german := func(c Candidate) bool { return c.CountryCode == "DE" }
	seen := map[string]bool{}
	for i := 0; i < 200; i++ {
		pick, ok := pickInFirstCity(candidates, german)
		if !ok {
			t.Fatal("expected a German server")
		}
		seen[pick.Addr] = true
	}
	if seen["fr1:443"] || seen["de3:443"] {
		t.Fatalf("picked outside Berlin: %v", seen)
	}
	if !seen["de1:443"] || !seen["de2:443"] || !seen["de4:443"] {
		t.Fatalf("expected every Berlin server in 200 picks: %v", seen)
	}
	if _, ok := pickInFirstCity(candidates, func(c Candidate) bool { return c.CountryCode == "US" }); ok {
		t.Fatal("no match must report false")
	}
}