Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 1 | package impl |
| 2 | |
| 3 | import ( |
| 4 | "reflect" |
| 5 | "sort" |
| 6 | "testing" |
| 7 | |
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" |
| 13 | "veyron.io/veyron/veyron2/services/mounttable" |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 14 | ) |
| 15 | |
| 16 | func 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 Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 25 | localSpec := ipc.ListenSpec{Protocol: "tcp", Address: "127.0.0.1:0"} |
| 26 | ep1, err := server1.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 27 | 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 Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 40 | ep2, err := server2.Listen(localSpec) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 41 | 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 | |
| 74 | func 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 Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 81 | t.Fatalf("Glob failed: %v", err) |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 82 | } |
| 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 | |
| 98 | type proxyDispatcher struct { |
| 99 | remote string |
| 100 | label security.Label |
| 101 | sigStub signatureStub |
| 102 | } |
| 103 | |
Cosmos Nicolaou | 1ee5e1a | 2014-11-02 10:20:30 -0800 | [diff] [blame] | 104 | func (d *proxyDispatcher) Lookup(suffix, method string) (interface{}, security.Authorizer, error) { |
Robin Thellend | b9dd9bb | 2014-10-29 13:54:08 -0700 | [diff] [blame] | 105 | return &proxyInvoker{naming.Join(d.remote, suffix), d.label, d.sigStub}, nil, nil |
| 106 | } |