blob: be380470ba7cf312cb16e32280c75494d029eabb [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// 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 Rosencrantz94502cf2015-03-18 09:43:44 -07005package rpc_test
Robin Thellend92b65a42014-12-17 14:30:16 -08006
7import (
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -07008 "flag"
Robin Thellend92b65a42014-12-17 14:30:16 -08009 "fmt"
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070010 "os"
Robin Thellend92b65a42014-12-17 14:30:16 -080011 "testing"
12 "time"
13
Jiri Simsa6ac95222015-02-23 16:11:49 -080014 "v.io/v23"
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070015 "v.io/v23/context"
Jiri Simsa6ac95222015-02-23 16:11:49 -080016 "v.io/v23/naming"
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070017 "v.io/v23/options"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070018 "v.io/v23/rpc"
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070019 "v.io/x/ref/lib/flags"
Suharsh Sivakumardcc11d72015-05-11 12:19:20 -070020 "v.io/x/ref/runtime/factories/fake"
21 "v.io/x/ref/runtime/internal"
22 "v.io/x/ref/runtime/internal/lib/appcycle"
23 inaming "v.io/x/ref/runtime/internal/naming"
24 irpc "v.io/x/ref/runtime/internal/rpc"
25 grt "v.io/x/ref/runtime/internal/rt"
Todd Wang5987a942015-04-06 11:06:17 -070026 "v.io/x/ref/services/mounttable/mounttablelib"
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070027 "v.io/x/ref/test/expect"
28 "v.io/x/ref/test/modules"
Robin Thellend92b65a42014-12-17 14:30:16 -080029)
30
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070031var commonFlags *flags.Flags
32
33func init() {
34 commonFlags = flags.CreateAndRegister(flag.CommandLine, flags.Runtime)
35 if err := internal.ParseFlags(commonFlags); err != nil {
36 panic(err)
37 }
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070038}
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070039
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070040func setupRuntime() {
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070041 ac := appcycle.New()
42
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070043 listenSpec := rpc.ListenSpec{Addrs: rpc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070044
45 rootctx, rootcancel := context.RootContext()
46 ctx, cancel := context.WithCancel(rootctx)
47 runtime, ctx, sd, err := grt.Init(ctx,
48 ac,
49 nil,
50 &listenSpec,
Cosmos Nicolaou00fe9a42015-04-24 14:18:01 -070051 nil,
52 "",
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -070053 commonFlags.RuntimeFlags(),
54 nil)
55 if err != nil {
56 panic(err)
57 }
58 shutdown := func() {
59 ac.Shutdown()
60 cancel()
61 sd()
62 rootcancel()
63 }
64 fake.InjectRuntime(runtime, ctx, shutdown)
65}
66
Todd Wang95873902015-05-22 14:21:30 -070067var rootMT = modules.Register(func(env *modules.Env, args ...string) error {
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070068 setupRuntime()
69 ctx, shutdown := v23.Init()
70 defer shutdown()
71
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070072 mp := ""
Cosmos Nicolaou19a50f62015-06-20 09:15:40 -070073 mt, err := mounttablelib.NewMountTableDispatcher(ctx, "", "", "mounttable")
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070074 if err != nil {
Todd Wang5987a942015-04-06 11:06:17 -070075 return fmt.Errorf("mounttablelib.NewMountTableDispatcher failed: %s", err)
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070076 }
Matt Rosencrantz53ac5852015-09-04 15:14:54 -070077 ctx, server, err := v23.WithNewDispatchingServer(ctx, mp, mt, options.ServesMountTable(true))
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070078 if err != nil {
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -070079 return fmt.Errorf("root failed: %v", err)
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070080 }
Todd Wang95873902015-05-22 14:21:30 -070081 fmt.Fprintf(env.Stdout, "PID=%d\n", os.Getpid())
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -070082 for _, ep := range server.Status().Endpoints {
Todd Wang95873902015-05-22 14:21:30 -070083 fmt.Fprintf(env.Stdout, "MT_NAME=%s\n", ep.Name())
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070084 }
Todd Wang95873902015-05-22 14:21:30 -070085 modules.WaitForEOF(env.Stdin)
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070086 return nil
Todd Wang95873902015-05-22 14:21:30 -070087}, "rootMT")
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -070088
Robin Thellend92b65a42014-12-17 14:30:16 -080089func startMT(t *testing.T, sh *modules.Shell) string {
Todd Wang95873902015-05-22 14:21:30 -070090 h, err := sh.Start(nil, rootMT)
Robin Thellend92b65a42014-12-17 14:30:16 -080091 if err != nil {
92 t.Fatalf("unexpected error for root mt: %s", err)
93 }
94 s := expect.NewSession(t, h.Stdout(), time.Minute)
95 s.ExpectVar("PID")
96 return s.ExpectVar("MT_NAME")
97}
98
Matt Rosencrantz5efd7822015-09-15 18:07:17 -070099type fakeService struct{}
100
101func (f *fakeService) Foo(ctx *context.T, call rpc.ServerCall) error { return nil }
102
Robin Thellend92b65a42014-12-17 14:30:16 -0800103func TestResolveToEndpoint(t *testing.T) {
Suharsh Sivakumar2ad4e102015-03-17 21:23:37 -0700104 setupRuntime()
Asim Shankar263c73b2015-03-19 18:31:26 -0700105 ctx, shutdown := v23.Init()
106 defer shutdown()
107 sh, err := modules.NewShell(ctx, nil, testing.Verbose(), t)
Robin Thellend92b65a42014-12-17 14:30:16 -0800108 if err != nil {
109 t.Fatalf("modules.NewShell failed: %s", err)
110 }
111 defer sh.Cleanup(nil, nil)
112 root := startMT(t, sh)
113
Jiri Simsa6ac95222015-02-23 16:11:49 -0800114 ns := v23.GetNamespace(ctx)
Robin Thellend92b65a42014-12-17 14:30:16 -0800115 ns.SetRoots(root)
116
117 proxyEp, _ := inaming.NewEndpoint("proxy.v.io:123")
118 proxyEpStr := proxyEp.String()
119 proxyAddr := naming.JoinAddressName(proxyEpStr, "")
Matt Rosencrantzd599e382015-01-12 11:13:32 -0800120 if err := ns.Mount(ctx, "proxy", proxyAddr, time.Hour); err != nil {
Robin Thellend92b65a42014-12-17 14:30:16 -0800121 t.Fatalf("ns.Mount failed: %s", err)
122 }
123
Matt Rosencrantz5efd7822015-09-15 18:07:17 -0700124 _, server, err := v23.WithNewServer(ctx, "", &fakeService{}, nil)
Robin Thellend92b65a42014-12-17 14:30:16 -0800125 if err != nil {
126 t.Fatalf("runtime.NewServer failed: %s", err)
127 }
128
129 notfound := fmt.Errorf("not found")
130 testcases := []struct {
131 address string
132 result string
133 err error
134 }{
135 {"/proxy.v.io:123", proxyEpStr, nil},
136 {"proxy.v.io:123", "", notfound},
137 {"proxy", proxyEpStr, nil},
138 {naming.JoinAddressName(root, "proxy"), proxyEpStr, nil},
139 {proxyAddr, proxyEpStr, nil},
140 {proxyEpStr, "", notfound},
141 {"unknown", "", notfound},
142 }
143 for _, tc := range testcases {
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700144 result, err := irpc.InternalServerResolveToEndpoint(server, tc.address)
Robin Thellend92b65a42014-12-17 14:30:16 -0800145 if (err == nil) != (tc.err == nil) {
146 t.Errorf("Unexpected err for %q. Got %v, expected %v", tc.address, err, tc.err)
147 }
148 if result != tc.result {
149 t.Errorf("Unexpected result for %q. Got %q, expected %q", tc.address, result, tc.result)
150 }
151 }
152 if t.Failed() {
153 t.Logf("proxyEpStr: %v", proxyEpStr)
154 t.Logf("proxyAddr: %v", proxyAddr)
155 }
156}