blob: 6a091fe2141b4679e1652f9fe137f3284745b377 [file] [log] [blame]
Robin Thellend18205cf2014-10-21 13:53:59 -07001package main
Robin Thellend6b17da72014-05-14 09:55:14 -07002
3import (
4 "bytes"
5 "strings"
6 "testing"
7
Jiri Simsa764efb72014-12-25 20:57:03 -08008 "v.io/core/veyron2"
9 "v.io/core/veyron2/ipc"
10 "v.io/core/veyron2/naming"
11 "v.io/core/veyron2/rt"
12 "v.io/core/veyron2/security"
13 "v.io/core/veyron2/services/mounttable"
David Why Use Two When One Will Do Presottoab2bcf22015-01-05 13:14:01 -080014 "v.io/core/veyron2/services/security/access"
Jiri Simsa764efb72014-12-25 20:57:03 -080015 "v.io/core/veyron2/vlog"
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070016
Jiri Simsa764efb72014-12-25 20:57:03 -080017 "v.io/core/veyron/profiles"
Robin Thellend6b17da72014-05-14 09:55:14 -070018)
19
20type server struct {
21 suffix string
22}
23
Robin Thellend39ac3232014-12-02 09:50:41 -080024func (s *server) Glob__(ctx ipc.ServerContext, pattern string) (<-chan naming.VDLMountEntry, error) {
Robin Thellend6b17da72014-05-14 09:55:14 -070025 vlog.VI(2).Infof("Glob() was called. suffix=%v pattern=%q", s.suffix, pattern)
Robin Thellend39ac3232014-12-02 09:50:41 -080026 ch := make(chan naming.VDLMountEntry, 2)
27 ch <- naming.VDLMountEntry{"name1", []naming.VDLMountedServer{{"server1", 123}}, false}
28 ch <- naming.VDLMountEntry{"name2", []naming.VDLMountedServer{{"server2", 456}, {"server3", 789}}, false}
29 close(ch)
30 return ch, nil
Robin Thellend6b17da72014-05-14 09:55:14 -070031}
32
Todd Wang1aa57692014-11-11 13:53:29 -080033func (s *server) Mount(_ ipc.ServerContext, server string, ttl uint32, flags naming.MountFlag) error {
Robin Thellend6b17da72014-05-14 09:55:14 -070034 vlog.VI(2).Infof("Mount() was called. suffix=%v server=%q ttl=%d", s.suffix, server, ttl)
35 return nil
36}
37
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070038func (s *server) Unmount(_ ipc.ServerContext, server string) error {
Robin Thellend6b17da72014-05-14 09:55:14 -070039 vlog.VI(2).Infof("Unmount() was called. suffix=%v server=%q", s.suffix, server)
40 return nil
41}
42
Todd Wang1aa57692014-11-11 13:53:29 -080043func (s *server) ResolveStep(ipc.ServerContext) (servers []naming.VDLMountedServer, suffix string, err error) {
Robin Thellend6b17da72014-05-14 09:55:14 -070044 vlog.VI(2).Infof("ResolveStep() was called. suffix=%v", s.suffix)
Todd Wang1aa57692014-11-11 13:53:29 -080045 servers = []naming.VDLMountedServer{{"server1", 123}}
Robin Thellend6b17da72014-05-14 09:55:14 -070046 suffix = s.suffix
47 return
48}
49
Todd Wang1aa57692014-11-11 13:53:29 -080050func (s *server) ResolveStepX(ipc.ServerContext) (entry naming.VDLMountEntry, err error) {
David Why Use Two When One Will Do Presotto6f9f5742014-10-20 16:27:05 -070051 vlog.VI(2).Infof("ResolveStepX() was called. suffix=%v", s.suffix)
Todd Wang1aa57692014-11-11 13:53:29 -080052 entry.Servers = []naming.VDLMountedServer{{"server1", 123}}
David Why Use Two When One Will Do Presotto6f9f5742014-10-20 16:27:05 -070053 entry.Name = s.suffix
54 return
55}
56
David Why Use Two When One Will Do Presottoab2bcf22015-01-05 13:14:01 -080057func (s *server) Delete(ipc.ServerContext, bool) error {
58 vlog.VI(2).Infof("Delete() was called. suffix=%v", s.suffix)
59 return nil
60}
61func (s *server) SetACL(ipc.ServerContext, access.TaggedACLMap, string) error {
62 vlog.VI(2).Infof("SetACL() was called. suffix=%v", s.suffix)
63 return nil
64}
65
66func (s *server) GetACL(ipc.ServerContext) (access.TaggedACLMap, string, error) {
67 vlog.VI(2).Infof("GetACL() was called. suffix=%v", s.suffix)
68 return nil, "", nil
69}
70
Robin Thellend6b17da72014-05-14 09:55:14 -070071type dispatcher struct {
72}
73
Robin Thellenda02fe8f2014-11-19 09:58:29 -080074func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
Cosmos Nicolaou710daa22014-11-11 19:39:18 -080075 return mounttable.MountTableServer(&server{suffix: suffix}), nil, nil
Robin Thellend6b17da72014-05-14 09:55:14 -070076}
77
78func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
79 dispatcher := new(dispatcher)
80 server, err := r.NewServer()
81 if err != nil {
82 t.Errorf("NewServer failed: %v", err)
83 return nil, nil, err
84 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080085 endpoints, err := server.Listen(profiles.LocalListenSpec)
Robin Thellend6b17da72014-05-14 09:55:14 -070086 if err != nil {
87 t.Errorf("Listen failed: %v", err)
88 return nil, nil, err
89 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080090 if err := server.ServeDispatcher("", dispatcher); err != nil {
91 t.Errorf("ServeDispatcher failed: %v", err)
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070092 return nil, nil, err
93 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080094 return server, endpoints[0], nil
Robin Thellend6b17da72014-05-14 09:55:14 -070095}
96
97func stopServer(t *testing.T, server ipc.Server) {
98 if err := server.Stop(); err != nil {
99 t.Errorf("server.Stop failed: %v", err)
100 }
101}
102
103func TestMountTableClient(t *testing.T) {
Matt Rosencrantzc2ed03e2014-11-25 15:40:48 -0800104 var err error
105 runtime, err = rt.New()
106 if err != nil {
107 t.Fatalf("Unexpected error initializing runtime: %s", err)
108 }
109 defer runtime.Cleanup()
110
Robin Thellend6b17da72014-05-14 09:55:14 -0700111 server, endpoint, err := startServer(t, runtime)
112 if err != nil {
113 return
114 }
115 defer stopServer(t, server)
116 // Setup the command-line.
Robin Thellend18205cf2014-10-21 13:53:59 -0700117 cmd := root()
Robin Thellend6b17da72014-05-14 09:55:14 -0700118 var stdout, stderr bytes.Buffer
119 cmd.Init(nil, &stdout, &stderr)
120
121 // Test the 'glob' command.
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700122 if err := cmd.Execute([]string{"glob", naming.JoinAddressName(endpoint.String(), ""), "*"}); err != nil {
Robin Thellend6b17da72014-05-14 09:55:14 -0700123 t.Fatalf("%v", err)
124 }
125 if expected, got := "name1 server1 (TTL 2m3s)\nname2 server2 (TTL 7m36s) server3 (TTL 13m9s)", strings.TrimSpace(stdout.String()); got != expected {
126 t.Errorf("Got %q, expected %q", got, expected)
127 }
128 stdout.Reset()
129
130 // Test the 'mount' command.
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700131 if err := cmd.Execute([]string{"mount", naming.JoinAddressName(endpoint.String(), ""), "server", "123s"}); err != nil {
Robin Thellend6b17da72014-05-14 09:55:14 -0700132 t.Fatalf("%v", err)
133 }
134 if expected, got := "Name mounted successfully.", strings.TrimSpace(stdout.String()); got != expected {
135 t.Errorf("Got %q, expected %q", got, expected)
136 }
137 stdout.Reset()
138
139 // Test the 'unmount' command.
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700140 if err := cmd.Execute([]string{"unmount", naming.JoinAddressName(endpoint.String(), ""), "server"}); err != nil {
Robin Thellend6b17da72014-05-14 09:55:14 -0700141 t.Fatalf("%v", err)
142 }
143 if expected, got := "Name unmounted successfully.", strings.TrimSpace(stdout.String()); got != expected {
144 t.Errorf("Got %q, expected %q", got, expected)
145 }
146 stdout.Reset()
147
148 // Test the 'resolvestep' command.
David Why Use Two When One Will Do Presotto8b4dbbf2014-11-06 10:50:14 -0800149 vlog.Infof("resovestep %s", naming.JoinAddressName(endpoint.String(), "name"))
150 if err := cmd.Execute([]string{"resolvestep", naming.JoinAddressName(endpoint.String(), "name")}); err != nil {
Robin Thellend6b17da72014-05-14 09:55:14 -0700151 t.Fatalf("%v", err)
152 }
David Why Use Two When One Will Do Presotto6f9f5742014-10-20 16:27:05 -0700153 if expected, got := `Servers: [{server1 123}] Suffix: "name" MT: false`, strings.TrimSpace(stdout.String()); got != expected {
Robin Thellend6b17da72014-05-14 09:55:14 -0700154 t.Errorf("Got %q, expected %q", got, expected)
155 }
156 stdout.Reset()
157}