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