package lib import ( "math" "testing" "time" "github.com/hashicorp/serf/coordinate" "github.com/pascaldekloe/goe/verify" ) func TestRTT_ComputeDistance(t *testing.T) { tests := []struct { desc string a *coordinate.Coordinate b *coordinate.Coordinate dist float64 }{ { "10 ms", GenerateCoordinate(0), GenerateCoordinate(10 * time.Millisecond), 0.010, }, { "0 ms", GenerateCoordinate(10 * time.Millisecond), GenerateCoordinate(10 * time.Millisecond), 0.0, }, { "2 ms", GenerateCoordinate(8 * time.Millisecond), GenerateCoordinate(10 * time.Millisecond), 0.002, }, { "2 ms reversed", GenerateCoordinate(10 * time.Millisecond), GenerateCoordinate(8 * time.Millisecond), 0.002, }, { "a nil", nil, GenerateCoordinate(8 * time.Millisecond), math.Inf(1.0), }, { "b nil", GenerateCoordinate(8 * time.Millisecond), nil, math.Inf(1.0), }, { "both nil", nil, nil, math.Inf(1.0), }, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { dist := ComputeDistance(tt.a, tt.b) verify.Values(t, "", dist, tt.dist) }) } } func TestRTT_Intersect(t *testing.T) { // The numbers here don't matter, we just want a unique coordinate for // each one. server_1 := CoordinateSet{ "": GenerateCoordinate(1 * time.Millisecond), "alpha": GenerateCoordinate(2 * time.Millisecond), "beta": GenerateCoordinate(3 * time.Millisecond), } server_2 := CoordinateSet{ "": GenerateCoordinate(4 * time.Millisecond), "alpha": GenerateCoordinate(5 * time.Millisecond), "beta": GenerateCoordinate(6 * time.Millisecond), } client_alpha := CoordinateSet{ "alpha": GenerateCoordinate(7 * time.Millisecond), } client_beta_1 := CoordinateSet{ "beta": GenerateCoordinate(8 * time.Millisecond), } client_beta_2 := CoordinateSet{ "beta": GenerateCoordinate(9 * time.Millisecond), } tests := []struct { desc string a CoordinateSet b CoordinateSet c1 *coordinate.Coordinate c2 *coordinate.Coordinate }{ { "nil maps", nil, nil, nil, nil, }, { "two servers", server_1, server_2, server_1[""], server_2[""], }, { "two clients", client_beta_1, client_beta_2, client_beta_1["beta"], client_beta_2["beta"], }, { "server_1 and client alpha", server_1, client_alpha, server_1["alpha"], client_alpha["alpha"], }, { "server_1 and client beta 1", server_1, client_beta_1, server_1["beta"], client_beta_1["beta"], }, { "server_1 and client alpha reversed", client_alpha, server_1, client_alpha["alpha"], server_1["alpha"], }, { "server_1 and client beta 1 reversed", client_beta_1, server_1, client_beta_1["beta"], server_1["beta"], }, { "nothing in common", client_alpha, client_beta_1, nil, client_beta_1["beta"], }, { "nothing in common reversed", client_beta_1, client_alpha, nil, client_alpha["alpha"], }, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { r1, r2 := tt.a.Intersect(tt.b) verify.Values(t, "", r1, tt.c1) verify.Values(t, "", r2, tt.c2) }) } }