package ipc import ( "errors" "reflect" "testing" ) func TestTypeCheckHandler(t *testing.T) { type testStruct struct{} cases := []interface{}{ "foo", func() {}, func(a, b int) {}, func(a *testStruct, b *Message) {}, func(a, b *int) error { return nil }, func(a *testStruct, b int) error { return nil }, func(a *testStruct, b Message) error { return nil }, func(a *testStruct, b *Message) int { return 0 }, func(a *testStruct, b *Message, c int) error { return nil }, } for i, h := range cases { if _, err := typeCheckHandler(h); err == nil { t.Errorf("typeCheckHandler should return an error for case %d", i) } } } func TestAddHandler(t *testing.T) { hmap := handlerMap(make(map[string]reflect.Value)) type testStruct struct { t int "tst" } legit := func(ts *testStruct, m *Message) error { return nil } if err := hmap.addHandler("bar"); err == nil { t.Error("attempt to register string as handler function did not fail as expected") } if err := hmap.addHandler(legit); err != nil { t.Error("registration of good handler function failed:", err) } if err := hmap.addHandler(legit); err == nil { t.Error("registration of duplicate handler function did not fail") } } func TestDispatch(t *testing.T) { type testStruct struct { t int "tester" } type testStruct2 struct { t int "tester2" } count := 0 h1 := func(ts *testStruct, m *Message) error { count += 1 return nil } h2 := func(ts *testStruct2, m *Message) error { count += 1 return errors.New("...") } hmap := handlerMap(make(map[string]reflect.Value)) if err := hmap.addHandler(h1); err != nil { t.Errorf("unexpected failure to register handler: %v", err) } if err := hmap.addHandler(h2); err != nil { t.Errorf("unexpected failure to register handler: %v", err) } m := new(Message) m.Type = "tester" m.Body = new(testStruct) if err := hmap.dispatch(m); err != nil { t.Error("unexpected error calling dispatch():", err) } m.Type = "tester2" m.Body = new(testStruct2) if err := hmap.dispatch(m); err == nil { t.Errorf("dispatch() did not return error as expected") } if count != 2 { t.Errorf("count was not incremented to 2 as expected. count = %d", count) } }