Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 1 | package ipc |
| 2 | |
| 3 | import ( |
Bogdan Caprita | 1ec4052 | 2014-12-10 14:56:33 -0800 | [diff] [blame] | 4 | "io" |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 5 | "reflect" |
| 6 | "sort" |
| 7 | "testing" |
| 8 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 9 | "v.io/core/veyron2/ipc" |
| 10 | "v.io/core/veyron2/naming" |
| 11 | "v.io/core/veyron2/options" |
| 12 | "v.io/core/veyron2/vlog" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 13 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 14 | "v.io/core/veyron/lib/stats" |
| 15 | tsecurity "v.io/core/veyron/lib/testutil/security" |
| 16 | "v.io/core/veyron/runtimes/google/ipc/stream/manager" |
| 17 | "v.io/core/veyron/runtimes/google/ipc/stream/vc" |
| 18 | tnaming "v.io/core/veyron/runtimes/google/testing/mocks/naming" |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 19 | "v.io/core/veyron/services/mgmt/debug" |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 20 | ) |
| 21 | |
| 22 | func TestDebugServer(t *testing.T) { |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 23 | // Setup the client and server principals, with the client willing to share its |
| 24 | // blessing with the server. |
| 25 | var ( |
Ankur | e49a86a | 2014-11-11 18:52:43 -0800 | [diff] [blame] | 26 | pclient = tsecurity.NewPrincipal("client") |
| 27 | pserver = tsecurity.NewPrincipal("server") |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 28 | bclient = bless(pserver, pclient, "client") // server/client blessing. |
| 29 | ) |
| 30 | pclient.AddToRoots(bclient) // Client recognizes "server" as a root of blessings. |
| 31 | pclient.BlessingStore().Set(bclient, "server") // Client presents bclient to server |
| 32 | |
Matt Rosencrantz | 5f98d94 | 2015-01-08 13:48:30 -0800 | [diff] [blame] | 33 | debugDisp := debug.NewDispatcher(vlog.Log.LogDir(), nil) |
Cosmos Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 34 | |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 35 | sm := manager.InternalNew(naming.FixedRoutingID(0x555555555)) |
| 36 | defer sm.Shutdown() |
| 37 | ns := tnaming.NewSimpleNamespace() |
Matt Rosencrantz | fa3082c | 2015-01-22 21:39:04 -0800 | [diff] [blame] | 38 | ctx := testContext() |
Suharsh Sivakumar | d7a6519 | 2015-01-27 22:57:15 -0800 | [diff] [blame^] | 39 | server, err := InternalNewServer(ctx, sm, ns, nil, ReservedNameDispatcher{debugDisp}, vc.LocalPrincipal{pserver}) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 40 | if err != nil { |
| 41 | t.Fatalf("InternalNewServer failed: %v", err) |
| 42 | } |
| 43 | defer server.Stop() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 44 | eps, err := server.Listen(listenSpec) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 45 | if err != nil { |
| 46 | t.Fatalf("server.Listen failed: %v", err) |
| 47 | } |
Cosmos Nicolaou | 9fbe7d2 | 2015-01-25 22:13:13 -0800 | [diff] [blame] | 48 | if err := server.Serve("", &testObject{}, nil); err != nil { |
| 49 | t.Fatalf("server.Serve failed: %v", err) |
| 50 | } |
Asim Shankar | 8f05c22 | 2014-10-06 22:08:19 -0700 | [diff] [blame] | 51 | client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pclient}) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 52 | if err != nil { |
| 53 | t.Fatalf("InternalNewClient failed: %v", err) |
| 54 | } |
| 55 | defer client.Close() |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 56 | ep := eps[0] |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 57 | // Call the Foo method on "" |
| 58 | { |
Cosmos Nicolaou | 8bd8e10 | 2015-01-13 21:52:53 -0800 | [diff] [blame] | 59 | call, err := client.StartCall(ctx, ep.Name(), "Foo", nil) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 60 | if err != nil { |
| 61 | t.Fatalf("client.StartCall failed: %v", err) |
| 62 | } |
| 63 | var value string |
| 64 | if ferr := call.Finish(&value); ferr != nil { |
| 65 | t.Fatalf("call.Finish failed: %v", ferr) |
| 66 | } |
| 67 | if want := "BAR"; value != want { |
| 68 | t.Errorf("unexpected value: Got %v, want %v", value, want) |
| 69 | } |
| 70 | } |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 71 | // Call Value on __debug/stats/testing/foo |
| 72 | { |
| 73 | foo := stats.NewString("testing/foo") |
| 74 | 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] | 75 | addr := naming.JoinAddressName(ep.String(), "__debug/stats/testing/foo") |
Suharsh Sivakumar | b59a96d | 2015-01-09 16:39:54 -0800 | [diff] [blame] | 76 | call, err := client.StartCall(ctx, addr, "Value", nil, options.NoResolve{}) |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 77 | if err != nil { |
| 78 | t.Fatalf("client.StartCall failed: %v", err) |
| 79 | } |
| 80 | var value string |
| 81 | if ferr := call.Finish(&value, &err); ferr != nil { |
| 82 | t.Fatalf("call.Finish failed: %v", ferr) |
| 83 | } |
| 84 | if err != nil { |
| 85 | t.Fatalf("unexpected error: %v", err) |
| 86 | } |
| 87 | if want := foo.Value(); value != want { |
| 88 | t.Errorf("unexpected result: Got %v, want %v", value, want) |
| 89 | } |
| 90 | } |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 91 | |
| 92 | // Call Glob |
| 93 | testcases := []struct { |
| 94 | name, pattern string |
| 95 | expected []string |
| 96 | }{ |
| 97 | {"", "*", []string{}}, |
| 98 | {"", "__*", []string{"__debug"}}, |
Matt Rosencrantz | b30286b | 2014-11-10 14:52:17 -0800 | [diff] [blame] | 99 | {"", "__*/*", []string{"__debug/logs", "__debug/pprof", "__debug/stats", "__debug/vtrace"}}, |
| 100 | {"__debug", "*", []string{"logs", "pprof", "stats", "vtrace"}}, |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 101 | } |
| 102 | for _, tc := range testcases { |
David Why Use Two When One Will Do Presotto | adf0ca1 | 2014-11-13 10:49:01 -0800 | [diff] [blame] | 103 | addr := naming.JoinAddressName(ep.String(), tc.name) |
Suharsh Sivakumar | b59a96d | 2015-01-09 16:39:54 -0800 | [diff] [blame] | 104 | call, err := client.StartCall(ctx, addr, ipc.GlobMethod, []interface{}{tc.pattern}, options.NoResolve{}) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 105 | if err != nil { |
Robin Thellend | 877ac01 | 2014-12-10 14:19:28 -0800 | [diff] [blame] | 106 | t.Fatalf("client.StartCall failed for %q: %v", tc.name, err) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 107 | } |
| 108 | results := []string{} |
| 109 | for { |
Todd Wang | 1aa5769 | 2014-11-11 13:53:29 -0800 | [diff] [blame] | 110 | var me naming.VDLMountEntry |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 111 | if err := call.Recv(&me); err != nil { |
Bogdan Caprita | 1ec4052 | 2014-12-10 14:56:33 -0800 | [diff] [blame] | 112 | if err != io.EOF { |
| 113 | t.Fatalf("Recv failed for %q: %v. Results received thus far: %q", tc.name, err, results) |
| 114 | } |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 115 | break |
| 116 | } |
| 117 | results = append(results, me.Name) |
| 118 | } |
| 119 | if ferr := call.Finish(&err); ferr != nil { |
Robin Thellend | 877ac01 | 2014-12-10 14:19:28 -0800 | [diff] [blame] | 120 | t.Fatalf("call.Finish failed for %q: %v", tc.name, ferr) |
Robin Thellend | c26c32e | 2014-10-06 17:44:04 -0700 | [diff] [blame] | 121 | } |
| 122 | sort.Strings(results) |
| 123 | if !reflect.DeepEqual(tc.expected, results) { |
Robin Thellend | 877ac01 | 2014-12-10 14:19:28 -0800 | [diff] [blame] | 124 | 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] | 125 | } |
| 126 | } |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 127 | } |
| 128 | |
| 129 | type testObject struct { |
| 130 | } |
| 131 | |
Todd Wang | 1fe7cdd | 2014-11-12 12:51:49 -0800 | [diff] [blame] | 132 | func (o testObject) Foo(ipc.ServerContext) string { |
Robin Thellend | d24f084 | 2014-09-23 10:27:29 -0700 | [diff] [blame] | 133 | return "BAR" |
| 134 | } |