package serf
|
|
import (
|
"reflect"
|
"testing"
|
"time"
|
)
|
|
// testEvents tests that the given node had the given sequence of events
|
// on the event channel.
|
func testEvents(t *testing.T, ch <-chan Event, node string, expected []EventType) {
|
actual := make([]EventType, 0, len(expected))
|
|
TESTEVENTLOOP:
|
for {
|
select {
|
case r := <-ch:
|
e, ok := r.(MemberEvent)
|
if !ok {
|
continue
|
}
|
|
found := false
|
for _, m := range e.Members {
|
if m.Name == node {
|
found = true
|
break
|
}
|
}
|
|
if found {
|
actual = append(actual, e.Type)
|
}
|
case <-time.After(10 * time.Millisecond):
|
break TESTEVENTLOOP
|
}
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
t.Fatalf("expected events: %v. Got: %v", expected, actual)
|
}
|
}
|
|
// testUserEvents tests that the given sequence of usr events
|
// on the event channel took place.
|
func testUserEvents(t *testing.T, ch <-chan Event, expectedName []string, expectedPayload [][]byte) {
|
actualName := make([]string, 0, len(expectedName))
|
actualPayload := make([][]byte, 0, len(expectedPayload))
|
|
TESTEVENTLOOP:
|
for {
|
select {
|
case r, ok := <-ch:
|
if !ok {
|
break TESTEVENTLOOP
|
}
|
u, ok := r.(UserEvent)
|
if !ok {
|
continue
|
}
|
|
actualName = append(actualName, u.Name)
|
actualPayload = append(actualPayload, u.Payload)
|
case <-time.After(10 * time.Millisecond):
|
break TESTEVENTLOOP
|
}
|
}
|
|
if !reflect.DeepEqual(actualName, expectedName) {
|
t.Fatalf("expected names: %v. Got: %v", expectedName, actualName)
|
}
|
if !reflect.DeepEqual(actualPayload, expectedPayload) {
|
t.Fatalf("expected payloads: %v. Got: %v", expectedPayload, actualPayload)
|
}
|
|
}
|
|
// testQueryEvents tests that the given sequence of queries
|
// on the event channel took place.
|
func testQueryEvents(t *testing.T, ch <-chan Event, expectedName []string, expectedPayload [][]byte) {
|
actualName := make([]string, 0, len(expectedName))
|
actualPayload := make([][]byte, 0, len(expectedPayload))
|
|
TESTEVENTLOOP:
|
for {
|
select {
|
case r, ok := <-ch:
|
if !ok {
|
break TESTEVENTLOOP
|
}
|
q, ok := r.(*Query)
|
if !ok {
|
continue
|
}
|
|
actualName = append(actualName, q.Name)
|
actualPayload = append(actualPayload, q.Payload)
|
case <-time.After(10 * time.Millisecond):
|
break TESTEVENTLOOP
|
}
|
}
|
|
if !reflect.DeepEqual(actualName, expectedName) {
|
t.Fatalf("expected names: %v. Got: %v", expectedName, actualName)
|
}
|
if !reflect.DeepEqual(actualPayload, expectedPayload) {
|
t.Fatalf("expected payloads: %v. Got: %v", expectedPayload, actualPayload)
|
}
|
|
}
|
|
func TestMemberEvent(t *testing.T) {
|
me := MemberEvent{
|
Type: EventMemberJoin,
|
Members: nil,
|
}
|
if me.EventType() != EventMemberJoin {
|
t.Fatalf("bad event type")
|
}
|
if me.String() != "member-join" {
|
t.Fatalf("bad string val")
|
}
|
|
me.Type = EventMemberLeave
|
if me.EventType() != EventMemberLeave {
|
t.Fatalf("bad event type")
|
}
|
if me.String() != "member-leave" {
|
t.Fatalf("bad string val")
|
}
|
|
me.Type = EventMemberFailed
|
if me.EventType() != EventMemberFailed {
|
t.Fatalf("bad event type")
|
}
|
if me.String() != "member-failed" {
|
t.Fatalf("bad string val")
|
}
|
|
me.Type = EventMemberUpdate
|
if me.EventType() != EventMemberUpdate {
|
t.Fatalf("bad event type")
|
}
|
if me.String() != "member-update" {
|
t.Fatalf("bad string val")
|
}
|
|
me.Type = EventMemberReap
|
if me.EventType() != EventMemberReap {
|
t.Fatalf("bad event type")
|
}
|
if me.String() != "member-reap" {
|
t.Fatalf("bad string val")
|
}
|
|
defer func() {
|
if r := recover(); r == nil {
|
t.Fatalf("expected panic")
|
}
|
}()
|
me.Type = EventUser
|
_ = me.String()
|
}
|
|
func TestUserEvent(t *testing.T) {
|
ue := UserEvent{
|
Name: "test",
|
Payload: []byte("foobar"),
|
}
|
if ue.EventType() != EventUser {
|
t.Fatalf("bad event type")
|
}
|
if ue.String() != "user-event: test" {
|
t.Fatalf("bad string val")
|
}
|
}
|
|
func TestQuery(t *testing.T) {
|
q := Query{
|
LTime: 42,
|
Name: "update",
|
Payload: []byte("abcd1234"),
|
}
|
if q.EventType() != EventQuery {
|
t.Fatalf("Bad")
|
}
|
if q.String() != "query: update" {
|
t.Fatalf("bad: %v", q.String())
|
}
|
}
|
|
func TestEventType_String(t *testing.T) {
|
events := []EventType{EventMemberJoin, EventMemberLeave, EventMemberFailed,
|
EventMemberUpdate, EventMemberReap, EventUser, EventQuery}
|
expect := []string{"member-join", "member-leave", "member-failed",
|
"member-update", "member-reap", "user", "query"}
|
|
for idx, event := range events {
|
if event.String() != expect[idx] {
|
t.Fatalf("expect %v got %v", expect[idx], event.String())
|
}
|
}
|
|
other := EventType(100)
|
defer func() {
|
if r := recover(); r == nil {
|
t.Fatalf("expected panic")
|
}
|
}()
|
_ = other.String()
|
}
|