blob: 5e58f1fc092f50c8f830599040c35dacd5c35d9c [file] [log] [blame]
package impl
import (
"reflect"
"testing"
"v.io/core/veyron2"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/naming"
"v.io/core/veyron2/rt"
"v.io/core/veyron2/security"
"v.io/core/veyron2/services/mgmt/stats"
"v.io/core/veyron2/services/security/access"
"v.io/core/veyron2/vlog"
"v.io/core/veyron/lib/testutil"
)
// TODO(toddw): Add tests of Signature and MethodSignature.
func TestProxyInvoker(t *testing.T) {
runtime, err := rt.New()
if err != nil {
t.Fatalf("Could not initialize runtime: %v", err)
}
defer runtime.Cleanup()
// server1 is a normal server
server1, err := runtime.NewServer()
if err != nil {
t.Fatalf("NewServer: %v", err)
}
defer server1.Stop()
localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
eps1, err := server1.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
if err := server1.Serve("", &dummy{}, nil); err != nil {
t.Fatalf("server1.Serve: %v", err)
}
// server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
server2, err := runtime.NewServer()
if err != nil {
t.Fatalf("NewServer: %v", err)
}
defer server2.Stop()
eps2, err := server2.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
disp := &proxyDispatcher{
runtime,
naming.JoinAddressName(eps1[0].String(), "__debug/stats"),
stats.StatsServer(nil),
}
if err := server2.ServeDispatcher("", disp); err != nil {
t.Fatalf("server2.Serve: %v", err)
}
// Call Value()
name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123")
c := stats.StatsClient(name)
if _, err := c.Value(runtime.NewContext()); err != nil {
t.Fatalf("%q.Value() error: %v", name, err)
}
// Call Glob()
results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
if err != nil {
t.Fatalf("Glob failed: %v", err)
}
expected := []string{
"start-time-rfc1123",
"start-time-unix",
}
if !reflect.DeepEqual(results, expected) {
t.Errorf("unexpected results. Got %q, want %q", results, expected)
}
}
type dummy struct{}
func (*dummy) Method(_ ipc.ServerContext) error { return nil }
type proxyDispatcher struct {
runtime veyron2.Runtime
remote string
sigStub signatureStub
}
func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
vlog.Infof("LOOKUP(%s): remote .... %s", suffix, d.remote)
invoker := &proxyInvoker{
remote: naming.Join(d.remote, suffix),
access: access.Debug,
sigStub: d.sigStub,
}
return invoker, nil, nil
}