blob: 28b62b25197bd5f67a0d6c6dc2952934058ce05b [file] [log] [blame]
Robin Thellend18205cf2014-10-21 13:53:59 -07001package main
Jiri Simsa5293dcb2014-05-10 09:56:38 -07002
3import (
4 "bytes"
Jiri Simsa51d78fc2014-07-09 18:34:08 -07005 "crypto/md5"
6 "encoding/hex"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07007 "fmt"
8 "io/ioutil"
9 "os"
10 "path"
11 "strings"
12 "testing"
13
Jiri Simsa764efb72014-12-25 20:57:03 -080014 "v.io/core/veyron2"
Matt Rosencrantzf541b772015-01-13 07:58:59 -080015 "v.io/core/veyron2/context"
Jiri Simsa764efb72014-12-25 20:57:03 -080016 "v.io/core/veyron2/ipc"
17 "v.io/core/veyron2/naming"
Jiri Simsa764efb72014-12-25 20:57:03 -080018 "v.io/core/veyron2/security"
19 "v.io/core/veyron2/services/mgmt/binary"
20 "v.io/core/veyron2/services/mgmt/repository"
Robert Kroeger8d7a0ef2015-01-14 17:38:40 -080021 "v.io/core/veyron2/services/security/access"
Jiri Simsa764efb72014-12-25 20:57:03 -080022 "v.io/core/veyron2/vlog"
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070023
Ankur0003fdc2015-01-22 10:59:41 -080024 tsecurity "v.io/core/veyron/lib/testutil/security"
Jiri Simsa764efb72014-12-25 20:57:03 -080025 "v.io/core/veyron/profiles"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070026)
27
28type server struct {
29 suffix string
30}
31
Robin Thellende2627892014-11-26 09:34:37 -080032func (s *server) Create(ipc.ServerContext, int32, repository.MediaInfo) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070033 vlog.Infof("Create() was called. suffix=%v", s.suffix)
Jiri Simsab04fbb22014-06-27 17:38:04 -070034 return nil
35}
36
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070037func (s *server) Delete(ipc.ServerContext) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070038 vlog.Infof("Delete() was called. suffix=%v", s.suffix)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070039 if s.suffix != "exists" {
Jiri Simsab04fbb22014-06-27 17:38:04 -070040 return fmt.Errorf("binary doesn't exist: %v", s.suffix)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070041 }
42 return nil
43}
44
Todd Wang702385a2014-11-07 01:54:08 -080045func (s *server) Download(ctx repository.BinaryDownloadContext, _ int32) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070046 vlog.Infof("Download() was called. suffix=%v", s.suffix)
Todd Wang702385a2014-11-07 01:54:08 -080047 sender := ctx.SendStream()
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070048 sender.Send([]byte("Hello"))
49 sender.Send([]byte("World"))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070050 return nil
51}
52
Jiri Simsab04fbb22014-06-27 17:38:04 -070053func (s *server) DownloadURL(ipc.ServerContext) (string, int64, error) {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070054 vlog.Infof("DownloadURL() was called. suffix=%v", s.suffix)
Jiri Simsa432cc2e2014-12-08 15:53:38 -080055 if s.suffix != "" {
56 return "", 0, fmt.Errorf("non-empty suffix: %v", s.suffix)
57 }
58 return "test-download-url", 0, nil
Jiri Simsab04fbb22014-06-27 17:38:04 -070059}
60
Robin Thellende2627892014-11-26 09:34:37 -080061func (s *server) Stat(ipc.ServerContext) ([]binary.PartInfo, repository.MediaInfo, error) {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070062 vlog.Infof("Stat() was called. suffix=%v", s.suffix)
63 h := md5.New()
64 text := "HelloWorld"
65 h.Write([]byte(text))
66 part := binary.PartInfo{Checksum: hex.EncodeToString(h.Sum(nil)), Size: int64(len(text))}
Robin Thellende2627892014-11-26 09:34:37 -080067 return []binary.PartInfo{part}, repository.MediaInfo{Type: "text/plain"}, nil
Jiri Simsab04fbb22014-06-27 17:38:04 -070068}
69
Todd Wang702385a2014-11-07 01:54:08 -080070func (s *server) Upload(ctx repository.BinaryUploadContext, _ int32) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070071 vlog.Infof("Upload() was called. suffix=%v", s.suffix)
Todd Wang702385a2014-11-07 01:54:08 -080072 rStream := ctx.RecvStream()
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070073 for rStream.Advance() {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070074 }
Jiri Simsab04fbb22014-06-27 17:38:04 -070075 return nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070076}
77
Robert Kroeger8d7a0ef2015-01-14 17:38:40 -080078func (s *server) GetACL(ipc.ServerContext) (acl access.TaggedACLMap, etag string, err error) {
79 return nil, "", nil
80}
81
82func (s *server) SetACL(ctx ipc.ServerContext, acl access.TaggedACLMap, etag string) error {
83 return nil
84}
85
Jiri Simsa5293dcb2014-05-10 09:56:38 -070086type dispatcher struct {
87}
88
89func NewDispatcher() *dispatcher {
90 return &dispatcher{}
91}
92
Robin Thellenda02fe8f2014-11-19 09:58:29 -080093func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
Cosmos Nicolaou710daa22014-11-11 19:39:18 -080094 return repository.BinaryServer(&server{suffix: suffix}), nil, nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070095}
96
Matt Rosencrantzf541b772015-01-13 07:58:59 -080097func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070098 dispatcher := NewDispatcher()
Matt Rosencrantzf541b772015-01-13 07:58:59 -080099 server, err := veyron2.NewServer(ctx)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700100 if err != nil {
101 t.Errorf("NewServer failed: %v", err)
102 return nil, nil, err
103 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -0800104 endpoints, err := server.Listen(profiles.LocalListenSpec)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700105 if err != nil {
106 t.Errorf("Listen failed: %v", err)
107 return nil, nil, err
108 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -0800109 if err := server.ServeDispatcher("", dispatcher); err != nil {
110 t.Errorf("ServeDispatcher failed: %v", err)
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -0700111 return nil, nil, err
112 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -0800113 return server, endpoints[0], nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700114}
115
116func stopServer(t *testing.T, server ipc.Server) {
117 if err := server.Stop(); err != nil {
118 t.Errorf("server.Stop failed: %v", err)
119 }
120}
121
Jiri Simsab04fbb22014-06-27 17:38:04 -0700122func TestBinaryClient(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800123 var shutdown veyron2.Shutdown
124 gctx, shutdown = veyron2.Init()
125 defer shutdown()
126 var err error
Ankur0003fdc2015-01-22 10:59:41 -0800127 if gctx, err = veyron2.SetPrincipal(gctx, tsecurity.NewPrincipal("test-blessing")); err != nil {
128 panic(err)
129 }
Matt Rosencrantzc2ed03e2014-11-25 15:40:48 -0800130
Matt Rosencrantzf541b772015-01-13 07:58:59 -0800131 server, endpoint, err := startServer(t, gctx)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700132 if err != nil {
133 return
134 }
135 defer stopServer(t, server)
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800136
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700137 // Setup the command-line.
Robin Thellend18205cf2014-10-21 13:53:59 -0700138 cmd := root()
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800139 var out bytes.Buffer
140 cmd.Init(nil, &out, &out)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700141
142 // Test the 'delete' command.
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800143 if err := cmd.Execute([]string{"delete", naming.JoinAddressName(endpoint.String(), "exists")}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800144 t.Fatalf("%v failed: %v\n%v", "delete", err, out.String())
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700145 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800146 if expected, got := "Binary deleted successfully", strings.TrimSpace(out.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700147 t.Errorf("Got %q, expected %q", got, expected)
148 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800149 out.Reset()
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700150
151 // Test the 'download' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700152 dir, err := ioutil.TempDir("", "binaryimpltest")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700153 if err != nil {
154 t.Fatalf("%v", err)
155 }
Robin Thellendcf140c02014-12-08 14:56:24 -0800156 defer os.RemoveAll(dir)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700157 file := path.Join(dir, "testfile")
158 defer os.Remove(file)
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800159 if err := cmd.Execute([]string{"download", naming.JoinAddressName(endpoint.String(), "exists"), file}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800160 t.Fatalf("%v failed: %v\n%v", "download", err, out.String())
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700161 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800162 if expected, got := "Binary downloaded to file "+file, strings.TrimSpace(out.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700163 t.Errorf("Got %q, expected %q", got, expected)
164 }
165 buf, err := ioutil.ReadFile(file)
166 if err != nil {
167 t.Fatalf("%v", err)
168 }
169 if expected := "HelloWorld"; string(buf) != expected {
170 t.Errorf("Got %q, expected %q", string(buf), expected)
171 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800172 out.Reset()
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700173
174 // Test the 'upload' command.
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800175 if err := cmd.Execute([]string{"upload", naming.JoinAddressName(endpoint.String(), "exists"), file}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800176 t.Fatalf("%v failed: %v\n%v", "upload", err, out.String())
177 }
178 out.Reset()
179
180 // Test the 'url' command.
181 if err := cmd.Execute([]string{"url", naming.JoinAddressName(endpoint.String(), "")}); err != nil {
182 t.Fatalf("%v failed: %v\n%v", "url", err, out.String())
183 }
184 if expected, got := "test-download-url", strings.TrimSpace(out.String()); got != expected {
185 t.Errorf("Got %q, expected %q", got, expected)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700186 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700187}