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 | |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 7 | "veyron.io/veyron/veyron2" |
Jing Jin | 18d6ec1 | 2014-11-03 10:12:42 -0800 | [diff] [blame] | 8 | "veyron.io/veyron/veyron2/ipc" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 9 | "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" |
Asim Shankar | 6888519 | 2014-11-26 12:48:35 -0800 | [diff] [blame] | 13 | "veyron.io/veyron/veyron2/services/security/access" |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 14 | "veyron.io/veyron/veyron2/vlog" |
Robin Thellend | 39ac323 | 2014-12-02 09:50:41 -0800 | [diff] [blame] | 15 | |
| 16 | "veyron.io/veyron/veyron/lib/testutil" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 17 | ) |
| 18 | |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 19 | // TODO(toddw): Add tests of Signature and MethodSignature. |
| 20 | |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 21 | func TestProxyInvoker(t *testing.T) { |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 22 | runtime, err := rt.New() |
| 23 | if err != nil { |
| 24 | t.Fatalf("Could not initialize runtime: %v", err) |
| 25 | } |
| 26 | defer runtime.Cleanup() |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 27 | |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 28 | // server1 is a normal server |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 29 | server1, err := runtime.NewServer() |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 30 | if err != nil { |
| 31 | t.Fatalf("NewServer: %v", err) |
| 32 | } |
| 33 | defer server1.Stop() |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 34 | localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}} |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 35 | eps1, err := server1.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 36 | if err != nil { |
| 37 | t.Fatalf("Listen: %v", err) |
| 38 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 39 | if err := server1.Serve("", &dummy{}, nil); err != nil { |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 40 | t.Fatalf("server1.Serve: %v", err) |
| 41 | } |
| 42 | |
| 43 | // server2 proxies requests to <suffix> to server1/__debug/stats/<suffix> |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 44 | server2, err := runtime.NewServer() |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 45 | if err != nil { |
| 46 | t.Fatalf("NewServer: %v", err) |
| 47 | } |
| 48 | defer server2.Stop() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 49 | eps2, err := server2.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 50 | if err != nil { |
| 51 | t.Fatalf("Listen: %v", err) |
| 52 | } |
| 53 | disp := &proxyDispatcher{ |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 54 | runtime, |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 55 | naming.JoinAddressName(eps1[0].String(), "__debug/stats"), |
Todd Wang | 702385a | 2014-11-07 01:54:08 -0800 | [diff] [blame] | 56 | stats.StatsServer(nil), |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 57 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 58 | if err := server2.ServeDispatcher("", disp); err != nil { |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 59 | t.Fatalf("server2.Serve: %v", err) |
| 60 | } |
| 61 | |
| 62 | // Call Value() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 63 | name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123") |
Todd Wang | 702385a | 2014-11-07 01:54:08 -0800 | [diff] [blame] | 64 | c := stats.StatsClient(name) |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 65 | if _, err := c.Value(runtime.NewContext()); err != nil { |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 66 | t.Fatalf("%q.Value() error: %v", name, err) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 67 | } |
| 68 | |
| 69 | // Call Glob() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 70 | results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*") |
Robin Thellend | 39ac323 | 2014-12-02 09:50:41 -0800 | [diff] [blame] | 71 | if err != nil { |
| 72 | t.Fatalf("Glob failed: %v", err) |
| 73 | } |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 74 | expected := []string{ |
| 75 | "start-time-rfc1123", |
| 76 | "start-time-unix", |
| 77 | } |
| 78 | if !reflect.DeepEqual(results, expected) { |
| 79 | t.Errorf("unexpected results. Got %q, want %q", results, expected) |
| 80 | } |
| 81 | } |
| 82 | |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 83 | type dummy struct{} |
| 84 | |
Todd Wang | 1fe7cdd | 2014-11-12 12:51:49 -0800 | [diff] [blame] | 85 | func (*dummy) Method(_ ipc.ServerContext) error { return nil } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 86 | |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 87 | type proxyDispatcher struct { |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 88 | runtime veyron2.Runtime |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 89 | remote string |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 90 | sigStub signatureStub |
| 91 | } |
| 92 | |
Robin Thellend | a02fe8f | 2014-11-19 09:58:29 -0800 | [diff] [blame] | 93 | func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) { |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 94 | vlog.Infof("LOOKUP(%s): remote .... %s", suffix, d.remote) |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 95 | invoker := &proxyInvoker{ |
| 96 | remote: naming.Join(d.remote, suffix), |
| 97 | access: access.Debug, |
| 98 | sigStub: d.sigStub, |
| 99 | } |
| 100 | return invoker, nil, nil |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 101 | } |