blob: 0a2554b68eb62e406f32d806e066046ed41bd71f [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 Simsa519c5072014-09-17 21:37:57 -070014 "veyron.io/veyron/veyron2"
15 "veyron.io/veyron/veyron2/ipc"
16 "veyron.io/veyron/veyron2/naming"
17 "veyron.io/veyron/veyron2/rt"
18 "veyron.io/veyron/veyron2/security"
19 "veyron.io/veyron/veyron2/services/mgmt/binary"
20 "veyron.io/veyron/veyron2/services/mgmt/repository"
21 "veyron.io/veyron/veyron2/vlog"
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070022
23 "veyron.io/veyron/veyron/profiles"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070024)
25
26type server struct {
27 suffix string
28}
29
Robin Thellende2627892014-11-26 09:34:37 -080030func (s *server) Create(ipc.ServerContext, int32, repository.MediaInfo) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070031 vlog.Infof("Create() was called. suffix=%v", s.suffix)
Jiri Simsab04fbb22014-06-27 17:38:04 -070032 return nil
33}
34
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070035func (s *server) Delete(ipc.ServerContext) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070036 vlog.Infof("Delete() was called. suffix=%v", s.suffix)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070037 if s.suffix != "exists" {
Jiri Simsab04fbb22014-06-27 17:38:04 -070038 return fmt.Errorf("binary doesn't exist: %v", s.suffix)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070039 }
40 return nil
41}
42
Todd Wang702385a2014-11-07 01:54:08 -080043func (s *server) Download(ctx repository.BinaryDownloadContext, _ int32) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070044 vlog.Infof("Download() was called. suffix=%v", s.suffix)
Todd Wang702385a2014-11-07 01:54:08 -080045 sender := ctx.SendStream()
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070046 sender.Send([]byte("Hello"))
47 sender.Send([]byte("World"))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070048 return nil
49}
50
Jiri Simsab04fbb22014-06-27 17:38:04 -070051func (s *server) DownloadURL(ipc.ServerContext) (string, int64, error) {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070052 vlog.Infof("DownloadURL() was called. suffix=%v", s.suffix)
Jiri Simsa432cc2e2014-12-08 15:53:38 -080053 if s.suffix != "" {
54 return "", 0, fmt.Errorf("non-empty suffix: %v", s.suffix)
55 }
56 return "test-download-url", 0, nil
Jiri Simsab04fbb22014-06-27 17:38:04 -070057}
58
Robin Thellende2627892014-11-26 09:34:37 -080059func (s *server) Stat(ipc.ServerContext) ([]binary.PartInfo, repository.MediaInfo, error) {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070060 vlog.Infof("Stat() was called. suffix=%v", s.suffix)
61 h := md5.New()
62 text := "HelloWorld"
63 h.Write([]byte(text))
64 part := binary.PartInfo{Checksum: hex.EncodeToString(h.Sum(nil)), Size: int64(len(text))}
Robin Thellende2627892014-11-26 09:34:37 -080065 return []binary.PartInfo{part}, repository.MediaInfo{Type: "text/plain"}, nil
Jiri Simsab04fbb22014-06-27 17:38:04 -070066}
67
Todd Wang702385a2014-11-07 01:54:08 -080068func (s *server) Upload(ctx repository.BinaryUploadContext, _ int32) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070069 vlog.Infof("Upload() was called. suffix=%v", s.suffix)
Todd Wang702385a2014-11-07 01:54:08 -080070 rStream := ctx.RecvStream()
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070071 for rStream.Advance() {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070072 }
Jiri Simsab04fbb22014-06-27 17:38:04 -070073 return nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070074}
75
76type dispatcher struct {
77}
78
79func NewDispatcher() *dispatcher {
80 return &dispatcher{}
81}
82
Robin Thellenda02fe8f2014-11-19 09:58:29 -080083func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
Cosmos Nicolaou710daa22014-11-11 19:39:18 -080084 return repository.BinaryServer(&server{suffix: suffix}), nil, nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070085}
86
87func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
88 dispatcher := NewDispatcher()
89 server, err := r.NewServer()
90 if err != nil {
91 t.Errorf("NewServer failed: %v", err)
92 return nil, nil, err
93 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080094 endpoints, err := server.Listen(profiles.LocalListenSpec)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070095 if err != nil {
96 t.Errorf("Listen failed: %v", err)
97 return nil, nil, err
98 }
Cosmos Nicolaou92dba582014-11-05 17:24:10 -080099 if err := server.ServeDispatcher("", dispatcher); err != nil {
100 t.Errorf("ServeDispatcher failed: %v", err)
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -0700101 return nil, nil, err
102 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -0800103 return server, endpoints[0], nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700104}
105
106func stopServer(t *testing.T, server ipc.Server) {
107 if err := server.Stop(); err != nil {
108 t.Errorf("server.Stop failed: %v", err)
109 }
110}
111
Jiri Simsab04fbb22014-06-27 17:38:04 -0700112func TestBinaryClient(t *testing.T) {
Matt Rosencrantzc2ed03e2014-11-25 15:40:48 -0800113 var err error
114 runtime, err = rt.New()
115 if err != nil {
116 t.Fatalf("Unexpected error initializing runtime: %s", err)
117 }
118 defer runtime.Cleanup()
119
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700120 server, endpoint, err := startServer(t, runtime)
121 if err != nil {
122 return
123 }
124 defer stopServer(t, server)
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800125
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700126 // Setup the command-line.
Robin Thellend18205cf2014-10-21 13:53:59 -0700127 cmd := root()
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800128 var out bytes.Buffer
129 cmd.Init(nil, &out, &out)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700130
131 // Test the 'delete' command.
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800132 if err := cmd.Execute([]string{"delete", naming.JoinAddressName(endpoint.String(), "exists")}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800133 t.Fatalf("%v failed: %v\n%v", "delete", err, out.String())
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700134 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800135 if expected, got := "Binary deleted successfully", strings.TrimSpace(out.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700136 t.Errorf("Got %q, expected %q", got, expected)
137 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800138 out.Reset()
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700139
140 // Test the 'download' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700141 dir, err := ioutil.TempDir("", "binaryimpltest")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700142 if err != nil {
143 t.Fatalf("%v", err)
144 }
Robin Thellendcf140c02014-12-08 14:56:24 -0800145 defer os.RemoveAll(dir)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700146 file := path.Join(dir, "testfile")
147 defer os.Remove(file)
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800148 if err := cmd.Execute([]string{"download", naming.JoinAddressName(endpoint.String(), "exists"), file}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800149 t.Fatalf("%v failed: %v\n%v", "download", err, out.String())
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700150 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800151 if expected, got := "Binary downloaded to file "+file, strings.TrimSpace(out.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700152 t.Errorf("Got %q, expected %q", got, expected)
153 }
154 buf, err := ioutil.ReadFile(file)
155 if err != nil {
156 t.Fatalf("%v", err)
157 }
158 if expected := "HelloWorld"; string(buf) != expected {
159 t.Errorf("Got %q, expected %q", string(buf), expected)
160 }
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800161 out.Reset()
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700162
163 // Test the 'upload' command.
David Why Use Two When One Will Do Presottoadf0ca12014-11-13 10:49:01 -0800164 if err := cmd.Execute([]string{"upload", naming.JoinAddressName(endpoint.String(), "exists"), file}); err != nil {
Jiri Simsa432cc2e2014-12-08 15:53:38 -0800165 t.Fatalf("%v failed: %v\n%v", "upload", err, out.String())
166 }
167 out.Reset()
168
169 // Test the 'url' command.
170 if err := cmd.Execute([]string{"url", naming.JoinAddressName(endpoint.String(), "")}); err != nil {
171 t.Fatalf("%v failed: %v\n%v", "url", err, out.String())
172 }
173 if expected, got := "test-download-url", strings.TrimSpace(out.String()); got != expected {
174 t.Errorf("Got %q, expected %q", got, expected)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700175 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700176}