Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 1 | package impl |
| 2 | |
| 3 | import ( |
| 4 | "reflect" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 5 | "testing" |
| 6 | |
Jing Jin | 18d6ec1 | 2014-11-03 10:12:42 -0800 | [diff] [blame] | 7 | "veyron.io/veyron/veyron2/ipc" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 8 | "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 Shankar | 6888519 | 2014-11-26 12:48:35 -0800 | [diff] [blame] | 12 | "veyron.io/veyron/veyron2/services/security/access" |
Robin Thellend | 39ac323 | 2014-12-02 09:50:41 -0800 | [diff] [blame] | 13 | |
| 14 | "veyron.io/veyron/veyron/lib/testutil" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 17 | // TODO(toddw): Add tests of Signature and MethodSignature. |
| 18 | |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 19 | func TestProxyInvoker(t *testing.T) { |
| 20 | r := rt.R() |
| 21 | |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 22 | // server1 is a normal server |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 23 | server1, err := r.NewServer() |
| 24 | if err != nil { |
| 25 | t.Fatalf("NewServer: %v", err) |
| 26 | } |
| 27 | defer server1.Stop() |
Cosmos Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 28 | localSpec := ipc.ListenSpec{Protocol: "tcp", Address: "127.0.0.1:0"} |
| 29 | ep1, err := server1.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 30 | if err != nil { |
| 31 | t.Fatalf("Listen: %v", err) |
| 32 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 33 | if err := server1.Serve("", &dummy{}, nil); err != nil { |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 34 | 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 Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 43 | ep2, err := server2.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 44 | if err != nil { |
| 45 | t.Fatalf("Listen: %v", err) |
| 46 | } |
| 47 | disp := &proxyDispatcher{ |
| 48 | naming.JoinAddressName(ep1.String(), "__debug/stats"), |
Todd Wang | 702385a | 2014-11-07 01:54:08 -0800 | [diff] [blame] | 49 | stats.StatsServer(nil), |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 50 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 51 | if err := server2.ServeDispatcher("", disp); err != nil { |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 52 | t.Fatalf("server2.Serve: %v", err) |
| 53 | } |
| 54 | |
| 55 | // Call Value() |
| 56 | name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123") |
Todd Wang | 702385a | 2014-11-07 01:54:08 -0800 | [diff] [blame] | 57 | c := stats.StatsClient(name) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 58 | if _, err := c.Value(r.NewContext()); err != nil { |
| 59 | t.Errorf("%q.Value() error: %v", name, err) |
| 60 | } |
| 61 | |
| 62 | // Call Glob() |
Robin Thellend | 39ac323 | 2014-12-02 09:50:41 -0800 | [diff] [blame] | 63 | 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 Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 67 | 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 Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 76 | type dummy struct{} |
| 77 | |
Todd Wang | 1fe7cdd | 2014-11-12 12:51:49 -0800 | [diff] [blame] | 78 | func (*dummy) Method(_ ipc.ServerContext) error { return nil } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 79 | |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 80 | type proxyDispatcher struct { |
| 81 | remote string |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 82 | sigStub signatureStub |
| 83 | } |
| 84 | |
Robin Thellend | a02fe8f | 2014-11-19 09:58:29 -0800 | [diff] [blame] | 85 | func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) { |
Asim Shankar | 6888519 | 2014-11-26 12:48:35 -0800 | [diff] [blame] | 86 | return &proxyInvoker{naming.Join(d.remote, suffix), access.Debug, d.sigStub}, nil, nil |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 87 | } |