mirror of https://github.com/ginuerzh/gost
16 changed files with 577 additions and 171 deletions
@ -0,0 +1,150 @@ |
|||
package gost |
|||
|
|||
import ( |
|||
"testing" |
|||
"time" |
|||
) |
|||
|
|||
func TestRoundStrategy(t *testing.T) { |
|||
nodes := []Node{ |
|||
Node{ID: 1}, |
|||
Node{ID: 2}, |
|||
Node{ID: 3}, |
|||
} |
|||
s := NewStrategy("round") |
|||
t.Log(s.String()) |
|||
|
|||
if node := s.Apply(nil); node.ID > 0 { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
for i := 0; i <= len(nodes); i++ { |
|||
node := s.Apply(nodes) |
|||
if node.ID != nodes[i%len(nodes)].ID { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
} |
|||
} |
|||
|
|||
func TestRandomStrategy(t *testing.T) { |
|||
nodes := []Node{ |
|||
Node{ID: 1}, |
|||
Node{ID: 2}, |
|||
Node{ID: 3}, |
|||
} |
|||
s := NewStrategy("random") |
|||
t.Log(s.String()) |
|||
|
|||
if node := s.Apply(nil); node.ID > 0 { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
for i := 0; i <= len(nodes); i++ { |
|||
node := s.Apply(nodes) |
|||
if node.ID == 0 { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
} |
|||
} |
|||
|
|||
func TestFIFOStrategy(t *testing.T) { |
|||
nodes := []Node{ |
|||
Node{ID: 1}, |
|||
Node{ID: 2}, |
|||
Node{ID: 3}, |
|||
} |
|||
s := NewStrategy("fifo") |
|||
t.Log(s.String()) |
|||
|
|||
if node := s.Apply(nil); node.ID > 0 { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
for i := 0; i <= len(nodes); i++ { |
|||
node := s.Apply(nodes) |
|||
if node.ID != 1 { |
|||
t.Error("unexpected node", node.String()) |
|||
} |
|||
} |
|||
} |
|||
|
|||
func TestFailFilter(t *testing.T) { |
|||
nodes := []Node{ |
|||
Node{ID: 1, marker: &failMarker{}}, |
|||
Node{ID: 2, marker: &failMarker{}}, |
|||
Node{ID: 3, marker: &failMarker{}}, |
|||
} |
|||
filter := &FailFilter{} |
|||
t.Log(filter.String()) |
|||
|
|||
isEqual := func(a, b []Node) bool { |
|||
if a == nil && b == nil { |
|||
return true |
|||
} |
|||
if a == nil || b == nil || len(a) != len(b) { |
|||
return false |
|||
} |
|||
|
|||
for i := range a { |
|||
if a[i].ID != b[i].ID { |
|||
return false |
|||
} |
|||
} |
|||
return true |
|||
} |
|||
if v := filter.Filter(nil); v != nil { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
if v := filter.Filter(nodes); !isEqual(v, nodes) { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
filter.MaxFails = 1 |
|||
if v := filter.Filter(nodes); !isEqual(v, nodes) { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
nodes[0].MarkDead() |
|||
if v := filter.Filter(nodes); !isEqual(v, nodes) { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
filter.FailTimeout = 5 * time.Second |
|||
if v := filter.Filter(nodes); isEqual(v, nodes) { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
nodes[1].MarkDead() |
|||
nodes[2].MarkDead() |
|||
if v := filter.Filter(nodes); len(v) > 0 { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
|
|||
for i := range nodes { |
|||
nodes[i].ResetDead() |
|||
} |
|||
if v := filter.Filter(nodes); !isEqual(v, nodes) { |
|||
t.Error("unexpected node", v) |
|||
} |
|||
} |
|||
|
|||
func TestSelector(t *testing.T) { |
|||
nodes := []Node{ |
|||
Node{ID: 1, marker: &failMarker{}}, |
|||
Node{ID: 2, marker: &failMarker{}}, |
|||
Node{ID: 3, marker: &failMarker{}}, |
|||
} |
|||
selector := &defaultSelector{} |
|||
if _, err := selector.Select(nil); err != ErrNoneAvailable { |
|||
t.Error("got unexpected error:", err) |
|||
} |
|||
|
|||
if node, _ := selector.Select(nodes); node.ID != 1 { |
|||
t.Error("unexpected node:", node) |
|||
} |
|||
|
|||
if node, _ := selector.Select(nodes, |
|||
WithStrategy(NewStrategy("")), |
|||
WithFilter(&FailFilter{MaxFails: 1, FailTimeout: 3 * time.Second}), |
|||
); node.ID != 1 { |
|||
t.Error("unexpected node:", node) |
|||
} |
|||
} |
|||
Loading…
Reference in new issue