Jiri Simsa | d7616c9 | 2015-03-24 23:44:30 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Vanadium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 5 | package rpc |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 6 | |
| 7 | import ( |
Bogdan Caprita | 1ec4052 | 2014-12-10 14:56:33 -0800 | [diff] [blame] | 8 | "io" |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 9 | "reflect" |
| 10 | "sort" |
| 11 | "testing" |
| 12 | |
Suharsh Sivakumar | 2ad4e10 | 2015-03-17 21:23:37 -0700 | [diff] [blame] | 13 | "v.io/v23" |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 14 | "v.io/v23/context" |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 15 | "v.io/v23/naming" |
| 16 | "v.io/v23/options" |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 17 | "v.io/v23/rpc" |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 18 | |
Jiri Simsa | ffceefa | 2015-02-28 11:03:34 -0800 | [diff] [blame] | 19 | "v.io/x/ref/lib/stats" |
Suharsh Sivakumar | dcc11d7 | 2015-05-11 12:19:20 -0700 | [diff] [blame] | 20 | "v.io/x/ref/runtime/internal/rpc/stream/manager" |
| 21 | tnaming "v.io/x/ref/runtime/internal/testing/mocks/naming" |
Todd Wang | 1ea8f19 | 2015-04-03 17:31:51 -0700 | [diff] [blame] | 22 | "v.io/x/ref/services/debug/debuglib" |
Asim Shankar | 4a69828 | 2015-03-21 21:59:18 -0700 | [diff] [blame] | 23 | "v.io/x/ref/test/testutil" |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 24 | ) |
| 25 | |
| 26 | func TestDebugServer(t *testing.T) { |
Suharsh Sivakumar | 2ad4e10 | 2015-03-17 21:23:37 -0700 | [diff] [blame] | 27 | ctx, shutdown := initForTest() |
| 28 | defer shutdown() |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 29 | // Setup the client and server principals, with the client willing to share its |
| 30 | // blessing with the server. |
| 31 | var ( |
Asim Shankar | 4a69828 | 2015-03-21 21:59:18 -0700 | [diff] [blame] | 32 | pclient = testutil.NewPrincipal("client") |
| 33 | pserver = testutil.NewPrincipal("server") |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 34 | bclient = bless(pserver, pclient, "client") // server/client blessing. |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 35 | sctx, _ = v23.WithPrincipal(ctx, pserver) |
| 36 | cctx, _ = v23.WithPrincipal(ctx, pclient) |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 37 | ) |
| 38 | pclient.AddToRoots(bclient) // Client recognizes "server" as a root of blessings. |
| 39 | pclient.BlessingStore().Set(bclient, "server") // Client presents bclient to server |
| 40 | |
Cosmos Nicolaou | 64d573d | 2015-07-13 16:22:18 -0700 | [diff] [blame] | 41 | debugDisp := debuglib.NewDispatcher(nil) |
Cosmos Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 42 | |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 43 | sm := manager.InternalNew(ctx, naming.FixedRoutingID(0x555555555)) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 44 | defer sm.Shutdown() |
| 45 | ns := tnaming.NewSimpleNamespace() |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 46 | |
| 47 | server, err := testInternalNewServer(sctx, sm, ns, ReservedNameDispatcher{debugDisp}) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 48 | if err != nil { |
| 49 | t.Fatalf("InternalNewServer failed: %v", err) |
| 50 | } |
| 51 | defer server.Stop() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 52 | eps, err := server.Listen(listenSpec) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 53 | if err != nil { |
| 54 | t.Fatalf("server.Listen failed: %v", err) |
| 55 | } |
Cosmos Nicolaou | 9fbe7d2 | 2015-01-25 22:13:13 -0800 | [diff] [blame] | 56 | if err := server.Serve("", &testObject{}, nil); err != nil { |
| 57 | t.Fatalf("server.Serve failed: %v", err) |
| 58 | } |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 59 | |
Suharsh Sivakumar | 2ad4e10 | 2015-03-17 21:23:37 -0700 | [diff] [blame] | 60 | client, err := InternalNewClient(sm, ns) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 61 | if err != nil { |
| 62 | t.Fatalf("InternalNewClient failed: %v", err) |
| 63 | } |
| 64 | defer client.Close() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 65 | ep := eps[0] |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 66 | // Call the Foo method on "" |
| 67 | { |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 68 | var value string |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 69 | if err := client.Call(cctx, ep.Name(), "Foo", nil, []interface{}{&value}); err != nil { |
Suharsh Sivakumar | 1abd5a8 | 2015-04-10 00:24:14 -0700 | [diff] [blame] | 70 | t.Fatalf("client.Call failed: %v", err) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 71 | } |
| 72 | if want := "BAR"; value != want { |
| 73 | t.Errorf("unexpected value: Got %v, want %v", value, want) |
| 74 | } |
| 75 | } |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 76 | // Call Value on __debug/stats/testing/foo |
| 77 | { |
| 78 | foo := stats.NewString("testing/foo") |
| 79 | foo.Set("The quick brown fox jumps over the lazy dog") |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 80 | addr := naming.JoinAddressName(ep.String(), "__debug/stats/testing/foo") |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 81 | var value string |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 82 | if err := client.Call(cctx, addr, "Value", nil, []interface{}{&value}, options.NoResolve{}); err != nil { |
Suharsh Sivakumar | 1abd5a8 | 2015-04-10 00:24:14 -0700 | [diff] [blame] | 83 | t.Fatalf("client.Call failed: %v", err) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 84 | } |
| 85 | if want := foo.Value(); value != want { |
| 86 | t.Errorf("unexpected result: Got %v, want %v", value, want) |
| 87 | } |
| 88 | } |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 89 | |
| 90 | // Call Glob |
| 91 | testcases := []struct { |
| 92 | name, pattern string |
| 93 | expected []string |
| 94 | }{ |
| 95 | {"", "*", []string{}}, |
| 96 | {"", "__*", []string{"__debug"}}, |
Matt Rosencrantz | b30286b | 2014-11-10 14:52:17 -0800 | [diff] [blame] | 97 | {"", "__*/*", []string{"__debug/logs", "__debug/pprof", "__debug/stats", "__debug/vtrace"}}, |
| 98 | {"__debug", "*", []string{"logs", "pprof", "stats", "vtrace"}}, |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 99 | } |
| 100 | for _, tc := range testcases { |
David Why Use Two When One Will Do Presotto | adf0ca1 | 2014-11-13 10:49:01 -0800 | [diff] [blame] | 101 | addr := naming.JoinAddressName(ep.String(), tc.name) |
Cosmos Nicolaou | e9c622d | 2015-07-10 11:09:42 -0700 | [diff] [blame] | 102 | call, err := client.StartCall(cctx, addr, rpc.GlobMethod, []interface{}{tc.pattern}, options.NoResolve{}) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 103 | if err != nil { |
Robin Thellend | 877ac01 | 2014-12-10 14:19:28 -0800 | [diff] [blame] | 104 | t.Fatalf("client.StartCall failed for %q: %v", tc.name, err) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 105 | } |
| 106 | results := []string{} |
| 107 | for { |
Todd Wang | 2331dd0 | 2015-03-17 15:38:39 -0700 | [diff] [blame] | 108 | var gr naming.GlobReply |
David Why Use Two When One Will Do Presotto | e5e62d0 | 2015-02-19 14:35:20 -0800 | [diff] [blame] | 109 | if err := call.Recv(&gr); err != nil { |
Bogdan Caprita | 1ec4052 | 2014-12-10 14:56:33 -0800 | [diff] [blame] | 110 | if err != io.EOF { |
| 111 | t.Fatalf("Recv failed for %q: %v. Results received thus far: %q", tc.name, err, results) |
| 112 | } |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 113 | break |
| 114 | } |
David Why Use Two When One Will Do Presotto | e5e62d0 | 2015-02-19 14:35:20 -0800 | [diff] [blame] | 115 | switch v := gr.(type) { |
Todd Wang | 2331dd0 | 2015-03-17 15:38:39 -0700 | [diff] [blame] | 116 | case naming.GlobReplyEntry: |
David Why Use Two When One Will Do Presotto | e5e62d0 | 2015-02-19 14:35:20 -0800 | [diff] [blame] | 117 | results = append(results, v.Value.Name) |
| 118 | } |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 119 | } |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 120 | if err := call.Finish(); err != nil { |
| 121 | t.Fatalf("call.Finish failed for %q: %v", tc.name, err) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 122 | } |
| 123 | sort.Strings(results) |
| 124 | if !reflect.DeepEqual(tc.expected, results) { |
Robin Thellend | 877ac01 | 2014-12-10 14:19:28 -0800 | [diff] [blame] | 125 | t.Errorf("unexpected results for %q. Got %v, want %v", tc.name, results, tc.expected) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 126 | } |
| 127 | } |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 128 | } |
| 129 | |
| 130 | type testObject struct { |
| 131 | } |
| 132 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 133 | func (o testObject) Foo(*context.T, rpc.ServerCall) (string, error) { |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 134 | return "BAR", nil |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 135 | } |