blob: 8ef35acc19533d3c38f9166333fcc7edc261b7f7 [file] [log] [blame]
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07001package impl
2
3import (
4 "reflect"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07005 "testing"
6
Matt Rosencrantz5180d162014-12-03 13:48:40 -08007 "veyron.io/veyron/veyron2"
Jing Jin18d6ec12014-11-03 10:12:42 -08008 "veyron.io/veyron/veyron2/ipc"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -07009 "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 Shankar68885192014-11-26 12:48:35 -080013 "veyron.io/veyron/veyron2/services/security/access"
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080014 "veyron.io/veyron/veyron2/vlog"
Robin Thellend39ac3232014-12-02 09:50:41 -080015
16 "veyron.io/veyron/veyron/lib/testutil"
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070017)
18
Todd Wang5739dda2014-11-16 22:44:02 -080019// TODO(toddw): Add tests of Signature and MethodSignature.
20
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070021func TestProxyInvoker(t *testing.T) {
Matt Rosencrantz5180d162014-12-03 13:48:40 -080022 runtime, err := rt.New()
23 if err != nil {
24 t.Fatalf("Could not initialize runtime: %v", err)
25 }
26 defer runtime.Cleanup()
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070027
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080028 // server1 is a normal server
Matt Rosencrantz5180d162014-12-03 13:48:40 -080029 server1, err := runtime.NewServer()
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070030 if err != nil {
31 t.Fatalf("NewServer: %v", err)
32 }
33 defer server1.Stop()
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080034 localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080035 eps1, err := server1.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070036 if err != nil {
37 t.Fatalf("Listen: %v", err)
38 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080039 if err := server1.Serve("", &dummy{}, nil); err != nil {
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070040 t.Fatalf("server1.Serve: %v", err)
41 }
42
43 // server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
Matt Rosencrantz5180d162014-12-03 13:48:40 -080044 server2, err := runtime.NewServer()
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070045 if err != nil {
46 t.Fatalf("NewServer: %v", err)
47 }
48 defer server2.Stop()
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080049 eps2, err := server2.Listen(localSpec)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070050 if err != nil {
51 t.Fatalf("Listen: %v", err)
52 }
53 disp := &proxyDispatcher{
Matt Rosencrantz5180d162014-12-03 13:48:40 -080054 runtime,
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080055 naming.JoinAddressName(eps1[0].String(), "__debug/stats"),
Todd Wang702385a2014-11-07 01:54:08 -080056 stats.StatsServer(nil),
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070057 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080058 if err := server2.ServeDispatcher("", disp); err != nil {
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070059 t.Fatalf("server2.Serve: %v", err)
60 }
61
62 // Call Value()
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080063 name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123")
Todd Wang702385a2014-11-07 01:54:08 -080064 c := stats.StatsClient(name)
Matt Rosencrantz5180d162014-12-03 13:48:40 -080065 if _, err := c.Value(runtime.NewContext()); err != nil {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080066 t.Fatalf("%q.Value() error: %v", name, err)
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070067 }
68
69 // Call Glob()
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080070 results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
Robin Thellend39ac3232014-12-02 09:50:41 -080071 if err != nil {
72 t.Fatalf("Glob failed: %v", err)
73 }
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070074 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 Nicolaou92dba582014-11-05 17:24:10 -080083type dummy struct{}
84
Todd Wang1fe7cdd2014-11-12 12:51:49 -080085func (*dummy) Method(_ ipc.ServerContext) error { return nil }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080086
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070087type proxyDispatcher struct {
Matt Rosencrantz5180d162014-12-03 13:48:40 -080088 runtime veyron2.Runtime
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070089 remote string
Robin Thellendb9dd9bb2014-10-29 13:54:08 -070090 sigStub signatureStub
91}
92
Robin Thellenda02fe8f2014-11-19 09:58:29 -080093func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080094 vlog.Infof("LOOKUP(%s): remote .... %s", suffix, d.remote)
Matt Rosencrantz5180d162014-12-03 13:48:40 -080095 invoker := &proxyInvoker{
96 remote: naming.Join(d.remote, suffix),
97 access: access.Debug,
98 sigStub: d.sigStub,
99 }
100 return invoker, nil, nil
Robin Thellendb9dd9bb2014-10-29 13:54:08 -0700101}