blob: 20b3b4188759e073a3a77ba7101137d499b9060b [file] [log] [blame]
package server
import (
"fmt"
"reflect"
"testing"
"veyron.io/veyron/veyron/services/wsprd/lib"
"veyron.io/veyron/veyron/services/wsprd/lib/testwriter"
"veyron.io/veyron/veyron/services/wsprd/signature"
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/rt"
"veyron.io/veyron/veyron2/security"
)
type mockFlowFactory struct {
writer testwriter.Writer
}
func (m *mockFlowFactory) createFlow() *Flow {
return &Flow{ID: 0, Writer: &m.writer}
}
func (*mockFlowFactory) cleanupFlow(int64) {}
type mockInvoker struct {
handle int64
sig signature.JSONServiceSignature
label security.Label
}
func (m mockInvoker) Prepare(string, int) ([]interface{}, security.Label, error) {
return nil, m.label, nil
}
func (mockInvoker) Invoke(string, ipc.ServerCall, []interface{}) ([]interface{}, error) {
return nil, nil
}
type mockInvokerFactory struct{}
func (mockInvokerFactory) createInvoker(handle int64, sig signature.JSONServiceSignature, label security.Label) (ipc.Invoker, error) {
return &mockInvoker{handle: handle, sig: sig, label: label}, nil
}
type mockAuthorizer struct {
handle int64
hasAuthorizer bool
}
func (mockAuthorizer) Authorize(security.Context) error { return nil }
type mockAuthorizerFactory struct{}
func (mockAuthorizerFactory) createAuthorizer(handle int64, hasAuthorizer bool) (security.Authorizer, error) {
return mockAuthorizer{handle: handle, hasAuthorizer: hasAuthorizer}, nil
}
func init() {
rt.Init()
}
func TestSuccessfulLookup(t *testing.T) {
flowFactory := &mockFlowFactory{}
d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, rt.R().Logger())
go func() {
if err := flowFactory.writer.WaitForMessage(1); err != nil {
t.Errorf("failed to get dispatch request %v", err)
t.Fail()
}
signature := `{"add":{"inArgs":["foo","bar"],"numOutArgs":1,"isStreaming":false}}`
jsonResponse := fmt.Sprintf(`{"handle":1,"hasAuthorizer":false,"label":%d,"signature":%s}`, security.WriteLabel, signature)
d.handleLookupResponse(0, jsonResponse)
}()
invoker, auth, err := d.Lookup("a/b", "Read")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
expectedSig := signature.JSONServiceSignature{
"add": signature.JSONMethodSignature{
InArgs: []string{"foo", "bar"},
NumOutArgs: 1,
},
}
expectedInvoker := &mockInvoker{handle: 1, sig: expectedSig, label: security.WriteLabel}
if !reflect.DeepEqual(invoker, expectedInvoker) {
t.Errorf("wrong invoker returned, expected: %v, got :%v", expectedInvoker, invoker)
}
expectedAuth := mockAuthorizer{handle: 1, hasAuthorizer: false}
if !reflect.DeepEqual(auth, expectedAuth) {
t.Errorf("wrong authorizer returned, expected: %v, got :%v", expectedAuth, auth)
}
expectedResponses := []testwriter.Response{
testwriter.Response{
Type: lib.ResponseDispatcherLookup,
Message: map[string]interface{}{
"serverId": 0.0,
"suffix": "a/b",
"method": "read",
},
},
}
testwriter.CheckResponses(&flowFactory.writer, expectedResponses, nil, t)
}
func TestSuccessfulLookupWithAuthorizer(t *testing.T) {
flowFactory := &mockFlowFactory{}
d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, rt.R().Logger())
go func() {
if err := flowFactory.writer.WaitForMessage(1); err != nil {
t.Errorf("failed to get dispatch request %v", err)
t.Fail()
}
signature := `{"add":{"inArgs":["foo","bar"],"numOutArgs":1,"isStreaming":false}}`
jsonResponse := fmt.Sprintf(`{"handle":1,"hasAuthorizer":true,"label":%d,"signature":%s}`, security.ReadLabel, signature)
d.handleLookupResponse(0, jsonResponse)
}()
invoker, auth, err := d.Lookup("a/b", "Read")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
expectedSig := signature.JSONServiceSignature{
"add": signature.JSONMethodSignature{
InArgs: []string{"foo", "bar"},
NumOutArgs: 1,
},
}
expectedInvoker := &mockInvoker{handle: 1, sig: expectedSig, label: security.ReadLabel}
if !reflect.DeepEqual(invoker, expectedInvoker) {
t.Errorf("wrong invoker returned, expected: %v, got :%v", expectedInvoker, invoker)
}
expectedAuth := mockAuthorizer{handle: 1, hasAuthorizer: true}
if !reflect.DeepEqual(auth, expectedAuth) {
t.Errorf("wrong authorizer returned, expected: %v, got :%v", expectedAuth, auth)
}
expectedResponses := []testwriter.Response{
testwriter.Response{
Type: lib.ResponseDispatcherLookup,
Message: map[string]interface{}{
"serverId": 0.0,
"suffix": "a/b",
"method": "read",
},
},
}
testwriter.CheckResponses(&flowFactory.writer, expectedResponses, nil, t)
}
func TestFailedLookup(t *testing.T) {
flowFactory := &mockFlowFactory{}
d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, rt.R().Logger())
go func() {
if err := flowFactory.writer.WaitForMessage(1); err != nil {
t.Errorf("failed to get dispatch request %v", err)
t.Fail()
}
jsonResponse := `{"err":{"id":"veyron2/verror.Exists","msg":"bad stuff"}}`
d.handleLookupResponse(0, jsonResponse)
}()
_, _, err := d.Lookup("a/b", "Read")
if err == nil {
t.Errorf("expected error, but got none", err)
}
expectedResponses := []testwriter.Response{
testwriter.Response{
Type: lib.ResponseDispatcherLookup,
Message: map[string]interface{}{
"serverId": 0.0,
"suffix": "a/b",
"method": "read",
},
},
}
testwriter.CheckResponses(&flowFactory.writer, expectedResponses, nil, t)
}