blob: 547d3502fb9600d13ecc7db841af810081d9abf4 [file] [log] [blame]
Robin Thellendd24f0842014-09-23 10:27:29 -07001package ipc
2
3import (
Bogdan Caprita1ec40522014-12-10 14:56:33 -08004 "io"
Robin Thellendd24f0842014-09-23 10:27:29 -07005 "reflect"
6 "sort"
7 "testing"
8
Jiri Simsa764efb72014-12-25 20:57:03 -08009 "v.io/core/veyron2/ipc"
10 "v.io/core/veyron2/naming"
11 "v.io/core/veyron2/options"
12 "v.io/core/veyron2/vlog"
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070013
Jiri Simsa764efb72014-12-25 20:57:03 -080014 "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 Simsa764efb72014-12-25 20:57:03 -080019 "v.io/core/veyron/services/mgmt/debug"
Robin Thellendd24f0842014-09-23 10:27:29 -070020)
21
22func TestDebugServer(t *testing.T) {
Asim Shankar8f05c222014-10-06 22:08:19 -070023 // Setup the client and server principals, with the client willing to share its
24 // blessing with the server.
25 var (
Ankure49a86a2014-11-11 18:52:43 -080026 pclient = tsecurity.NewPrincipal("client")
27 pserver = tsecurity.NewPrincipal("server")
Asim Shankar8f05c222014-10-06 22:08:19 -070028 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 Rosencrantz5f98d942015-01-08 13:48:30 -080033 debugDisp := debug.NewDispatcher(vlog.Log.LogDir(), nil)
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070034
Robin Thellendd24f0842014-09-23 10:27:29 -070035 sm := manager.InternalNew(naming.FixedRoutingID(0x555555555))
36 defer sm.Shutdown()
37 ns := tnaming.NewSimpleNamespace()
Matt Rosencrantzfa3082c2015-01-22 21:39:04 -080038 ctx := testContext()
Suharsh Sivakumard7a65192015-01-27 22:57:15 -080039 server, err := InternalNewServer(ctx, sm, ns, nil, ReservedNameDispatcher{debugDisp}, vc.LocalPrincipal{pserver})
Robin Thellendd24f0842014-09-23 10:27:29 -070040 if err != nil {
41 t.Fatalf("InternalNewServer failed: %v", err)
42 }
43 defer server.Stop()
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080044 eps, err := server.Listen(listenSpec)
Robin Thellendd24f0842014-09-23 10:27:29 -070045 if err != nil {
46 t.Fatalf("server.Listen failed: %v", err)
47 }
Cosmos Nicolaou9fbe7d22015-01-25 22:13:13 -080048 if err := server.Serve("", &testObject{}, nil); err != nil {
49 t.Fatalf("server.Serve failed: %v", err)
50 }
Asim Shankar8f05c222014-10-06 22:08:19 -070051 client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pclient})
Robin Thellendd24f0842014-09-23 10:27:29 -070052 if err != nil {
53 t.Fatalf("InternalNewClient failed: %v", err)
54 }
55 defer client.Close()
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080056 ep := eps[0]
Robin Thellendd24f0842014-09-23 10:27:29 -070057 // Call the Foo method on ""
58 {
Cosmos Nicolaou8bd8e102015-01-13 21:52:53 -080059 call, err := client.StartCall(ctx, ep.Name(), "Foo", nil)
Robin Thellendd24f0842014-09-23 10:27:29 -070060 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 Thellendd24f0842014-09-23 10:27:29 -070071 // 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 Presotto3da1c792014-10-03 11:15:53 -070075 addr := naming.JoinAddressName(ep.String(), "__debug/stats/testing/foo")
Suharsh Sivakumarb59a96d2015-01-09 16:39:54 -080076 call, err := client.StartCall(ctx, addr, "Value", nil, options.NoResolve{})
Robin Thellendd24f0842014-09-23 10:27:29 -070077 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 Thellendc26c32e2014-10-06 17:44:04 -070091
92 // Call Glob
93 testcases := []struct {
94 name, pattern string
95 expected []string
96 }{
97 {"", "*", []string{}},
98 {"", "__*", []string{"__debug"}},
Matt Rosencrantzb30286b2014-11-10 14:52:17 -080099 {"", "__*/*", []string{"__debug/logs", "__debug/pprof", "__debug/stats", "__debug/vtrace"}},
100 {"__debug", "*", []string{"logs", "pprof", "stats", "vtrace"}},
Robin Thellendc26c32e2014-10-06 17:44:04 -0700101 }
102 for _, tc := range testcases {
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800103 addr := naming.JoinAddressName(ep.String(), tc.name)
Suharsh Sivakumarb59a96d2015-01-09 16:39:54 -0800104 call, err := client.StartCall(ctx, addr, ipc.GlobMethod, []interface{}{tc.pattern}, options.NoResolve{})
Robin Thellendc26c32e2014-10-06 17:44:04 -0700105 if err != nil {
Robin Thellend877ac012014-12-10 14:19:28 -0800106 t.Fatalf("client.StartCall failed for %q: %v", tc.name, err)
Robin Thellendc26c32e2014-10-06 17:44:04 -0700107 }
108 results := []string{}
109 for {
Todd Wang1aa57692014-11-11 13:53:29 -0800110 var me naming.VDLMountEntry
Robin Thellendc26c32e2014-10-06 17:44:04 -0700111 if err := call.Recv(&me); err != nil {
Bogdan Caprita1ec40522014-12-10 14:56:33 -0800112 if err != io.EOF {
113 t.Fatalf("Recv failed for %q: %v. Results received thus far: %q", tc.name, err, results)
114 }
Robin Thellendc26c32e2014-10-06 17:44:04 -0700115 break
116 }
117 results = append(results, me.Name)
118 }
119 if ferr := call.Finish(&err); ferr != nil {
Robin Thellend877ac012014-12-10 14:19:28 -0800120 t.Fatalf("call.Finish failed for %q: %v", tc.name, ferr)
Robin Thellendc26c32e2014-10-06 17:44:04 -0700121 }
122 sort.Strings(results)
123 if !reflect.DeepEqual(tc.expected, results) {
Robin Thellend877ac012014-12-10 14:19:28 -0800124 t.Errorf("unexpected results for %q. Got %v, want %v", tc.name, results, tc.expected)
Robin Thellendc26c32e2014-10-06 17:44:04 -0700125 }
126 }
Robin Thellendd24f0842014-09-23 10:27:29 -0700127}
128
129type testObject struct {
130}
131
Todd Wang1fe7cdd2014-11-12 12:51:49 -0800132func (o testObject) Foo(ipc.ServerContext) string {
Robin Thellendd24f0842014-09-23 10:27:29 -0700133 return "BAR"
134}