You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.8 KiB
70 lines
1.8 KiB
package simulation |
|
|
|
import ( |
|
"systemdesigngame/internal/design" |
|
"testing" |
|
) |
|
|
|
func TestLoadBalancerAlgorithms(t *testing.T) { |
|
t.Run("round-rouble", func(t *testing.T) { |
|
d := design.Design{ |
|
Nodes: []design.Node{ |
|
{ID: "lb", Type: "loadbalancer", Props: map[string]any{"algorithm": "round-robin"}}, |
|
{ID: "a", Type: "webserver", Props: map[string]any{"capacityRPS": 10}}, |
|
{ID: "b", Type: "webserver", Props: map[string]any{"capacityRPS": 10}}, |
|
}, |
|
Connections: []design.Connection{ |
|
{Source: "lb", Target: "a"}, |
|
{Source: "lb", Target: "b"}, |
|
}, |
|
} |
|
|
|
e := NewEngineFromDesign(d, 100) |
|
e.EntryNode = "lb" |
|
e.RPS = 4 |
|
|
|
snaps := e.Run(1, 100) |
|
if len(snaps[0].Emitted["lb"]) != 4 { |
|
t.Errorf("expected lb to emit 4 requests") |
|
} |
|
|
|
path0 := snaps[0].Emitted["lb"][0].Path[1] |
|
path1 := snaps[0].Emitted["lb"][1].Path[1] |
|
|
|
if path0 == path1 { |
|
t.Errorf("expecting alternating targets, got %s and %s", path0, path1) |
|
} |
|
}) |
|
|
|
t.Run("least-connection", func(t *testing.T) { |
|
d := design.Design{ |
|
Nodes: []design.Node{ |
|
{ID: "lb", Type: "loadbalancer", Props: map[string]any{"algorithm": "least-connection"}}, |
|
{ID: "a", Type: "webserver", Props: map[string]any{"capacityRPS": 1}}, |
|
{ID: "b", Type: "webserver", Props: map[string]any{"capacityRPS": 1}}, |
|
}, |
|
Connections: []design.Connection{ |
|
{Source: "lb", Target: "a"}, |
|
{Source: "lb", Target: "b"}, |
|
}, |
|
} |
|
|
|
e := NewEngineFromDesign(d, 100) |
|
e.EntryNode = "lb" |
|
e.RPS = 2 |
|
|
|
snaps := e.Run(1, 100) |
|
if len(snaps[0].Emitted["lb"]) != 2 { |
|
t.Errorf("expected lb to emit 2 requests") |
|
} |
|
|
|
paths := []string{ |
|
snaps[0].Emitted["lb"][0].Path[1], |
|
snaps[0].Emitted["lb"][1].Path[1], |
|
} |
|
|
|
if paths[0] == paths[1] { |
|
t.Errorf("expected requests to be balanced, go %v", paths) |
|
} |
|
}) |
|
}
|
|
|