blob: 813e868df968012f12b0a2c3a15dbc50efbb7ff4 [file] [log] [blame]
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07001package impl
2
3import (
4 "reflect"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07005 "testing"
6
Jing Jin18d6ec12014-11-03 10:12:42 -08007 "veyron.io/veyron/veyron2/ipc"
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"
Asim Shankar68885192014-11-26 12:48:35 -080012 "veyron.io/veyron/veyron2/services/security/access"
Robin Thellend39ac3232014-12-02 09:50:41 -080013
14 "veyron.io/veyron/veyron/lib/testutil"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070015)
16
Todd Wang5739dda2014-11-16 22:44:02 -080017// TODO(toddw): Add tests of Signature and MethodSignature.
18
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070019func TestProxyInvoker(t *testing.T) {
20 r := rt.R()
21
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080022 // server1 is a normal server
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070023 server1, err := r.NewServer()
24 if err != nil {
25 t.Fatalf("NewServer: %v", err)
26 }
27 defer server1.Stop()
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070028 localSpec := ipc.ListenSpec{Protocol: "tcp", Address: "127.0.0.1:0"}
29 ep1, err := server1.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070030 if err != nil {
31 t.Fatalf("Listen: %v", err)
32 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080033 if err := server1.Serve("", &dummy{}, nil); err != nil {
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070034 t.Fatalf("server1.Serve: %v", err)
35 }
36
37 // server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
38 server2, err := r.NewServer()
39 if err != nil {
40 t.Fatalf("NewServer: %v", err)
41 }
42 defer server2.Stop()
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070043 ep2, err := server2.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070044 if err != nil {
45 t.Fatalf("Listen: %v", err)
46 }
47 disp := &proxyDispatcher{
48 naming.JoinAddressName(ep1.String(), "__debug/stats"),
Todd Wang702385a2014-11-07 01:54:08 -080049 stats.StatsServer(nil),
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070050 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080051 if err := server2.ServeDispatcher("", disp); err != nil {
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070052 t.Fatalf("server2.Serve: %v", err)
53 }
54
55 // Call Value()
56 name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123")
Todd Wang702385a2014-11-07 01:54:08 -080057 c := stats.StatsClient(name)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070058 if _, err := c.Value(r.NewContext()); err != nil {
59 t.Errorf("%q.Value() error: %v", name, err)
60 }
61
62 // Call Glob()
Robin Thellend39ac3232014-12-02 09:50:41 -080063 results, err := testutil.GlobName(r.NewContext(), naming.JoinAddressName(ep2.String(), "system"), "start-time-*")
64 if err != nil {
65 t.Fatalf("Glob failed: %v", err)
66 }
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070067 expected := []string{
68 "start-time-rfc1123",
69 "start-time-unix",
70 }
71 if !reflect.DeepEqual(results, expected) {
72 t.Errorf("unexpected results. Got %q, want %q", results, expected)
73 }
74}
75
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080076type dummy struct{}
77
Todd Wang1fe7cdd2014-11-12 12:51:49 -080078func (*dummy) Method(_ ipc.ServerContext) error { return nil }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080079
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070080type proxyDispatcher struct {
81 remote string
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070082 sigStub signatureStub
83}
84
Robin Thellenda02fe8f2014-11-19 09:58:29 -080085func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
Asim Shankar68885192014-11-26 12:48:35 -080086 return &proxyInvoker{naming.Join(d.remote, suffix), access.Debug, d.sigStub}, nil, nil
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070087}