| package ipc |
| |
| import ( |
| "testing" |
| "time" |
| |
| "v.io/core/veyron2/context" |
| ) |
| |
| type fakeContext struct{} |
| |
| func (*fakeContext) Deadline() (deadline time.Time, ok bool) { return } |
| func (*fakeContext) Done() <-chan struct{} { return nil } |
| func (*fakeContext) Err() error { return nil } |
| func (*fakeContext) Value(key interface{}) interface{} { return nil } |
| func (*fakeContext) Runtime() interface{} { return nil } |
| func (*fakeContext) WithCancel() (context.T, context.CancelFunc) { |
| return &fakeContext{}, func() {} |
| } |
| func (*fakeContext) WithDeadline(time.Time) (context.T, context.CancelFunc) { |
| return &fakeContext{}, func() {} |
| } |
| func (*fakeContext) WithTimeout(time.Duration) (context.T, context.CancelFunc) { |
| return &fakeContext{}, func() {} |
| } |
| func (*fakeContext) WithValue(k, v interface{}) context.T { |
| return &fakeContext{} |
| } |
| |
| func TestSuccessfulCalls(t *testing.T) { |
| |
| method1ExpectedResult := []interface{}{"one", 2} |
| method2ExpectedResult := []interface{}{"one"} |
| method3ExpectedResult := []interface{}{nil} |
| |
| client := NewSimpleClient(map[string][]interface{}{ |
| "method1": method1ExpectedResult, |
| "method2": method2ExpectedResult, |
| "method3": method3ExpectedResult, |
| }) |
| |
| ctx := &fakeContext{} |
| |
| // method1 |
| method1Call, err := client.StartCall(ctx, "name/obj", "method1", []interface{}{}) |
| if err != nil { |
| t.Errorf("StartCall: did not expect an error return") |
| return |
| } |
| var resultOne string |
| var resultTwo int |
| method1Call.Finish(&resultOne, &resultTwo) |
| if resultOne != "one" { |
| t.Errorf(`FinishCall: first result was "%v", want "one"`, resultOne) |
| return |
| } |
| if resultTwo != 2 { |
| t.Errorf(`FinishCall: second result was "%v", want 2`, resultTwo) |
| return |
| } |
| |
| // method2 |
| method2Call, err := client.StartCall(ctx, "name/obj", "method2", []interface{}{}) |
| if err != nil { |
| t.Errorf(`StartCall: did not expect an error return`) |
| return |
| } |
| method2Call.Finish(&resultOne) |
| if resultOne != "one" { |
| t.Errorf(`FinishCall: result "%v", want "one"`, resultOne) |
| return |
| } |
| |
| // method3 |
| var result interface{} |
| method3Call, err := client.StartCall(ctx, "name/obj", "method3", []interface{}{}) |
| if err != nil { |
| t.Errorf(`StartCall: did not expect an error return`) |
| return |
| } |
| method3Call.Finish(&result) |
| if result != nil { |
| t.Errorf(`FinishCall: result "%v", want nil`, result) |
| return |
| } |
| } |
| |
| type sampleStruct struct { |
| name string |
| } |
| |
| func TestStructResult(t *testing.T) { |
| client := NewSimpleClient(map[string][]interface{}{ |
| "foo": []interface{}{ |
| sampleStruct{name: "bar"}, |
| }, |
| }) |
| call, _ := client.StartCall(&fakeContext{}, "name/obj", "foo", []interface{}{}) |
| var result sampleStruct |
| call.Finish(&result) |
| if result.name != "bar" { |
| t.Errorf(`FinishCall: second result was "%v", want "bar"`, result.name) |
| return |
| } |
| } |
| |
| func TestErrorCall(t *testing.T) { |
| client := NewSimpleClient(map[string][]interface{}{ |
| "bar": []interface{}{}, |
| }) |
| _, err := client.StartCall(&fakeContext{}, "name/obj", "wrongMethodName", []interface{}{}) |
| if err == nil { |
| t.Errorf(`StartCall: should have returned an error on invalid method name`) |
| return |
| } |
| } |
| |
| func TestNumberOfCalls(t *testing.T) { |
| client := NewSimpleClient(map[string][]interface{}{ |
| "method1": []interface{}{}, |
| "method2": []interface{}{}, |
| }) |
| |
| errMsg := "Expected method to be called %d times but it was called %d" |
| ctx := &fakeContext{} |
| |
| // method 1 |
| if n := client.TimesCalled("method1"); n != 0 { |
| t.Errorf(errMsg, 0, n) |
| return |
| } |
| client.StartCall(ctx, "name/of/object", "method1", []interface{}{}) |
| if n := client.TimesCalled("method1"); n != 1 { |
| t.Errorf(errMsg, 1, n) |
| return |
| } |
| client.StartCall(ctx, "name/of/object", "method1", []interface{}{}) |
| if n := client.TimesCalled("method1"); n != 2 { |
| t.Errorf(errMsg, 2, n) |
| return |
| } |
| |
| // method 2 |
| if n := client.TimesCalled("method2"); n != 0 { |
| t.Errorf(errMsg, 0, n) |
| return |
| } |
| client.StartCall(ctx, "name/of/object", "method2", []interface{}{}) |
| if n := client.TimesCalled("method2"); n != 1 { |
| t.Errorf(errMsg, 1, n) |
| return |
| } |
| } |