blob: b27c6713b3c71c3477b62a53e38543b0367a54c0 [file] [log] [blame]
package impl
import (
"reflect"
"sort"
"testing"
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/naming"
"veyron.io/veyron/veyron2/rt"
"veyron.io/veyron/veyron2/security"
"veyron.io/veyron/veyron2/services/mgmt/stats"
"veyron.io/veyron/veyron2/services/mounttable"
)
func TestProxyInvoker(t *testing.T) {
r := rt.R()
// server1 is a normal server with a nil dispatcher.
server1, err := r.NewServer()
if err != nil {
t.Fatalf("NewServer: %v", err)
}
defer server1.Stop()
localSpec := ipc.ListenSpec{Protocol: "tcp", Address: "127.0.0.1:0"}
ep1, err := server1.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
if err := server1.Serve("", nil); err != nil {
t.Fatalf("server1.Serve: %v", err)
}
// server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
server2, err := r.NewServer()
if err != nil {
t.Fatalf("NewServer: %v", err)
}
defer server2.Stop()
ep2, err := server2.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
disp := &proxyDispatcher{
naming.JoinAddressName(ep1.String(), "__debug/stats"),
security.Label(security.AllLabels),
&stats.ServerStubStats{},
}
if err := server2.Serve("", disp); err != nil {
t.Fatalf("server2.Serve: %v", err)
}
// Call Value()
name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123")
c, err := stats.BindStats(name)
if err != nil {
t.Fatalf("BindStats error: %v", err)
}
if _, err := c.Value(r.NewContext()); err != nil {
t.Errorf("%q.Value() error: %v", name, err)
}
// Call Glob()
results := doGlob(t, naming.JoinAddressName(ep2.String(), "system"), "start-time-*")
expected := []string{
"start-time-rfc1123",
"start-time-unix",
}
if !reflect.DeepEqual(results, expected) {
t.Errorf("unexpected results. Got %q, want %q", results, expected)
}
}
func doGlob(t *testing.T, name, pattern string) []string {
c, err := mounttable.BindGlobbable(name)
if err != nil {
t.Fatalf("BindGlobbable failed: %v", err)
}
stream, err := c.Glob(rt.R().NewContext(), pattern)
if err != nil {
t.Fatalf("Glob failed: %v", err)
}
results := []string{}
iterator := stream.RecvStream()
for iterator.Advance() {
results = append(results, iterator.Value().Name)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", err)
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
sort.Strings(results)
return results
}
type proxyDispatcher struct {
remote string
label security.Label
sigStub signatureStub
}
func (d *proxyDispatcher) Lookup(suffix, method string) (interface{}, security.Authorizer, error) {
return &proxyInvoker{naming.Join(d.remote, suffix), d.label, d.sigStub}, nil, nil
}