blob: 031258a99dc9cb4a2198001268d548db71df1ac2 [file] [log] [blame]
Jiri Simsa5293dcb2014-05-10 09:56:38 -07001package unresolve
2
3import (
4 "fmt"
5 "testing"
6
7 "veyron2"
Matt Rosencrantz29147f72014-06-06 12:46:01 -07008 "veyron2/context"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07009 "veyron2/ipc"
10 "veyron2/naming"
11 "veyron2/rt"
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070012 "veyron2/security"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070013 mtidl "veyron2/services/mounttable"
14 "veyron2/vlog"
15
16 _ "veyron/lib/testutil"
17 "veyron/lib/testutil/blackbox"
18 mounttable "veyron/services/mounttable/lib"
19
20 fortuneidl "veyron/examples/fortune"
21)
22
23func initRT(opts ...veyron2.ROpt) func() {
Bogdan Caprita4258d882014-07-02 09:15:22 -070024 return rt.Init(opts...).Cleanup
Jiri Simsa5293dcb2014-05-10 09:56:38 -070025}
26
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070027func createServer(name string, dispatcher ipc.Dispatcher, opts ...ipc.ServerOpt) (ipc.Server, string) {
Cosmos Nicolaoue6e87f12014-06-03 14:29:10 -070028 server, err := rt.R().NewServer(opts...)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070029 if err != nil {
30 panic(fmt.Sprintf("r.NewServer failed with %v", err))
31 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -070032 ep, err := server.Listen("tcp", "127.0.0.1:0")
33 if err != nil {
34 panic(fmt.Sprintf("server.Listen failed with %v", err))
35 }
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070036 if err := server.Serve(name, dispatcher); err != nil {
37 panic(fmt.Sprintf("server.Serve failed with %v", err))
38 }
39 oa := naming.JoinAddressName(ep.String(), "")
40 vlog.Infof("created %s -> %s", name, oa)
41 return server, oa
Jiri Simsa5293dcb2014-05-10 09:56:38 -070042}
43
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070044func childMT(args []string) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070045 defer initRT()()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070046 for _, arg := range args {
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070047 server, _ := createMTServer(arg)
48 defer server.Stop()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070049 }
50 fmt.Println("ready")
51 blackbox.WaitForEOFOnStdin()
52}
53
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070054func createMTServer(mp string) (ipc.Server, string) {
Ryan Brownac972652014-05-19 10:57:32 -070055 mt, err := mounttable.NewMountTable("")
56 if err != nil {
57 panic(fmt.Sprintf("NewMountTable failed with %v", err))
58 }
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070059 return createServer(mp, mt, veyron2.ServesMountTableOpt(true))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070060}
61
62func createMTClient(name string) mtidl.MountTable {
63 client, err := mtidl.BindMountTable(name)
64 if err != nil {
65 panic(fmt.Sprintf("BindMountTable failed with %v", err))
66 }
67 return client
68}
69
70const fixedFortuneMessage = "Sooner than you think, you will be deeply dissatisfied with a fortune."
71
72type fortune struct{}
73
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070074func (*fortune) Get(ipc.ServerContext) (string, error) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070075 return fixedFortuneMessage, nil
76}
77
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070078func (*fortune) Add(ipc.ServerContext, string) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070079 return nil
80}
81
Jiri Simsa5293dcb2014-05-10 09:56:38 -070082func childFortune(args []string) {
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070083 defer initRT()()
84 server, _ := createServer(args[0], ipc.SoloDispatcher(fortuneidl.NewServerFortune(new(fortune)), nil))
85 defer server.Stop()
86 for _, arg := range args[1:] {
87 server.Serve(arg, nil)
88 }
89 fmt.Println("ready")
90 blackbox.WaitForEOFOnStdin()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070091}
92
93type fortuneCustomUnresolve struct {
94 custom string
95}
96
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070097func (*fortuneCustomUnresolve) Get(ipc.ServerContext) (string, error) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070098 return fixedFortuneMessage, nil
99}
100
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -0700101func (*fortuneCustomUnresolve) Add(ipc.ServerContext, string) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700102 return nil
103}
104
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -0700105func (*fortuneCustomUnresolve) UnresolveStep(context ipc.ServerContext) ([]string, error) {
Cosmos Nicolaou4e029972014-06-13 14:53:08 -0700106 servers, err := rt.R().Namespace().ResolveToMountTable(rt.R().NewContext(), "I/want/to/know")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700107 if err != nil {
108 return nil, err
109 }
110 var reply []string
111 for _, s := range servers {
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700112 r := naming.MakeResolvable(s)
113 reply = append(reply, naming.Join(r, "the/future"))
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700114 }
115 return reply, nil
116}
117
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -0700118// Can't use the soloDispatcher (which is a bad name in any case) since it
119// doesn't allow name suffixes (which is also a silly restriction).
120// TODO(cnicolaou): rework soloDispatcher.
121type fortuned struct{ obj interface{} }
122
123func (f *fortuned) Lookup(string) (ipc.Invoker, security.Authorizer, error) {
124 return ipc.ReflectInvoker(f.obj), nil, nil
125}
126
127func createFortuneCustomUnresolve(mp string) (ipc.Server, string) {
128 server, oa := createServer(mp, &fortuned{fortuneidl.NewServerFortune(new(fortuneCustomUnresolve))})
129 rt.R().Namespace().Mount(rt.R().NewContext(), "I/want/to/know", oa+"//", 0)
130 rt.R().Namespace().Mount(rt.R().NewContext(), "tell/me", oa+"//", 0)
131 return server, oa
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700132}
133
134func childFortuneCustomUnresolve(args []string) {
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -0700135 defer initRT()()
136 for _, arg := range args {
137 server, _ := createFortuneCustomUnresolve(arg)
138 defer server.Stop()
139 }
140 fmt.Println("ready")
141 blackbox.WaitForEOFOnStdin()
142}
143
144func childFortuneNoIDL(args []string) {
145 defer initRT()()
146 for _, arg := range args {
147 server, _ := createServer(arg, ipc.SoloDispatcher(new(fortuneNoIDL), nil))
148 defer server.Stop()
149 }
150 fmt.Println("ready")
151 blackbox.WaitForEOFOnStdin()
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700152}
153
154func createFortuneClient(rt veyron2.Runtime, name string) fortuneidl.Fortune {
155 client, err := fortuneidl.BindFortune(name, veyron2.RuntimeOpt{rt})
156 if err != nil {
157 panic(fmt.Sprintf("BindFortune failed with %v", err))
158 }
159 return client
160}
161
162type fortuneNoIDL struct{}
163
164func (*fortuneNoIDL) Get(ipc.ServerCall) (string, error) {
165 return fixedFortuneMessage, nil
166}
167
168func (*fortuneNoIDL) UnresolveStep(ipc.ServerCall) ([]string, error) {
Cosmos Nicolaou4e029972014-06-13 14:53:08 -0700169 servers, err := rt.R().Namespace().ResolveToMountTable(rt.R().NewContext(), "g")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700170 if err != nil {
171 return nil, err
172 }
173 var reply []string
174 for _, s := range servers {
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700175 r := naming.MakeResolvable(s)
176 reply = append(reply, naming.Join(r, "fortune"))
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700177 }
178 return reply, nil
179}
180
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700181func resolveStep(t *testing.T, name string) string {
182 client := createMTClient(name)
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -0700183 results, suffix, err := client.ResolveStep(rt.R().NewContext())
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700184 if err != nil {
185 t.Errorf("ResolveStep on %q failed with %v", name, err)
186 return ""
187 }
188 if len(results) != 1 {
189 t.Errorf("Expected one result when resolving %q, got %q", name, results)
190 return ""
191 }
192 return naming.Join(results[0].Server, suffix)
193}
194
Cosmos Nicolaou4e029972014-06-13 14:53:08 -0700195func resolve(t *testing.T, ns naming.Namespace, name string) string {
196 results, err := ns.Resolve(rt.R().NewContext(), name)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700197 if err != nil {
198 t.Errorf("Resolve failed with %v", err)
199 return ""
200 }
201 if len(results) != 1 {
202 t.Errorf("Expected one result when resolving %q, got %q", name, results)
203 return ""
204 }
205 return results[0]
206}
207
208type unresolver interface {
Matt Rosencrantz29147f72014-06-06 12:46:01 -0700209 UnresolveStep(context.T, ...ipc.CallOpt) ([]string, error)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700210}
211
Matt Rosencrantz29147f72014-06-06 12:46:01 -0700212func unresolveStep(t *testing.T, ctx context.T, c unresolver) string {
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -0700213 unres, err := c.UnresolveStep(ctx)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700214 if err != nil {
215 t.Errorf("UnresolveStep failed with %v", err)
216 return ""
217 }
218 if len(unres) != 1 {
219 t.Errorf("c.UnresolveStep wanted 1 result, got: %q", unres)
220 return ""
221 }
222 return unres[0]
223}
224
Cosmos Nicolaou4e029972014-06-13 14:53:08 -0700225func unresolve(t *testing.T, ns naming.Namespace, name string) string {
226 results, err := ns.Unresolve(rt.R().NewContext(), name)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700227 if err != nil {
228 t.Errorf("Unresolve failed with %v", err)
229 return ""
230 }
231 if len(results) != 1 {
232 t.Errorf("Expected one result when unresolving %q, got %q", name, results)
233 return ""
234 }
235 return results[0]
236}
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -0700237
238func glob(t *testing.T, pattern string) []string {
239 var replies []string
240 rc, err := rt.R().Namespace().Glob(rt.R().NewContext(), pattern)
241 if err != nil {
242 t.Errorf("Glob(%s): err %v", pattern, err)
243 return nil
244 }
245 for s := range rc {
246 replies = append(replies, s.Name)
247 }
248 return replies
249}