blob: b27c6713b3c71c3477b62a53e38543b0367a54c0 [file] [log] [blame]
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07001package impl
2
3import (
4 "reflect"
5 "sort"
6 "testing"
7
Jing Jin18d6ec12014-11-03 10:12:42 -08008 "veyron.io/veyron/veyron2/ipc"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07009 "veyron.io/veyron/veyron2/naming"
10 "veyron.io/veyron/veyron2/rt"
11 "veyron.io/veyron/veyron2/security"
12 "veyron.io/veyron/veyron2/services/mgmt/stats"
13 "veyron.io/veyron/veyron2/services/mounttable"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070014)
15
16func TestProxyInvoker(t *testing.T) {
17 r := rt.R()
18
19 // server1 is a normal server with a nil dispatcher.
20 server1, err := r.NewServer()
21 if err != nil {
22 t.Fatalf("NewServer: %v", err)
23 }
24 defer server1.Stop()
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070025 localSpec := ipc.ListenSpec{Protocol: "tcp", Address: "127.0.0.1:0"}
26 ep1, err := server1.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070027 if err != nil {
28 t.Fatalf("Listen: %v", err)
29 }
30 if err := server1.Serve("", nil); err != nil {
31 t.Fatalf("server1.Serve: %v", err)
32 }
33
34 // server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
35 server2, err := r.NewServer()
36 if err != nil {
37 t.Fatalf("NewServer: %v", err)
38 }
39 defer server2.Stop()
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070040 ep2, err := server2.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070041 if err != nil {
42 t.Fatalf("Listen: %v", err)
43 }
44 disp := &proxyDispatcher{
45 naming.JoinAddressName(ep1.String(), "__debug/stats"),
46 security.Label(security.AllLabels),
47 &stats.ServerStubStats{},
48 }
49 if err := server2.Serve("", disp); err != nil {
50 t.Fatalf("server2.Serve: %v", err)
51 }
52
53 // Call Value()
54 name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123")
55 c, err := stats.BindStats(name)
56 if err != nil {
57 t.Fatalf("BindStats error: %v", err)
58 }
59 if _, err := c.Value(r.NewContext()); err != nil {
60 t.Errorf("%q.Value() error: %v", name, err)
61 }
62
63 // Call Glob()
64 results := doGlob(t, naming.JoinAddressName(ep2.String(), "system"), "start-time-*")
65 expected := []string{
66 "start-time-rfc1123",
67 "start-time-unix",
68 }
69 if !reflect.DeepEqual(results, expected) {
70 t.Errorf("unexpected results. Got %q, want %q", results, expected)
71 }
72}
73
74func doGlob(t *testing.T, name, pattern string) []string {
75 c, err := mounttable.BindGlobbable(name)
76 if err != nil {
77 t.Fatalf("BindGlobbable failed: %v", err)
78 }
79 stream, err := c.Glob(rt.R().NewContext(), pattern)
80 if err != nil {
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070081 t.Fatalf("Glob failed: %v", err)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070082 }
83 results := []string{}
84 iterator := stream.RecvStream()
85 for iterator.Advance() {
86 results = append(results, iterator.Value().Name)
87 }
88 if err := iterator.Err(); err != nil {
89 t.Errorf("unexpected stream error: %v", err)
90 }
91 if err := stream.Finish(); err != nil {
92 t.Errorf("Finish failed: %v", err)
93 }
94 sort.Strings(results)
95 return results
96}
97
98type proxyDispatcher struct {
99 remote string
100 label security.Label
101 sigStub signatureStub
102}
103
Cosmos Nicolaou1ee5e1a2014-11-02 10:20:30 -0800104func (d *proxyDispatcher) Lookup(suffix, method string) (interface{}, security.Authorizer, error) {
Robin Thellendb9dd9bb2014-10-29 13:54:08 -0700105 return &proxyInvoker{naming.Join(d.remote, suffix), d.label, d.sigStub}, nil, nil
106}