blob: 78b7b5e8cb5f06ae4616cd3dfedb2d495d52a656 [file] [log] [blame]
Jiri Simsa5293dcb2014-05-10 09:56:38 -07001package impl_test
2
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/veyron/tools/binary/impl"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070015
Jiri Simsa519c5072014-09-17 21:37:57 -070016 "veyron.io/veyron/veyron2"
17 "veyron.io/veyron/veyron2/ipc"
18 "veyron.io/veyron/veyron2/naming"
19 "veyron.io/veyron/veyron2/rt"
20 "veyron.io/veyron/veyron2/security"
21 "veyron.io/veyron/veyron2/services/mgmt/binary"
22 "veyron.io/veyron/veyron2/services/mgmt/repository"
23 "veyron.io/veyron/veyron2/vlog"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070024)
25
26type server struct {
27 suffix string
28}
29
Jiri Simsab04fbb22014-06-27 17:38:04 -070030func (s *server) Create(ipc.ServerContext, int32) 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
Jiri Simsab04fbb22014-06-27 17:38:04 -070043func (s *server) Download(_ ipc.ServerContext, _ int32, stream repository.BinaryServiceDownloadStream) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070044 vlog.Infof("Download() was called. suffix=%v", s.suffix)
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070045 sender := stream.SendStream()
46 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 Simsab04fbb22014-06-27 17:38:04 -070053 return "", 0, nil
54}
55
56func (s *server) Stat(ipc.ServerContext) ([]binary.PartInfo, error) {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070057 vlog.Infof("Stat() was called. suffix=%v", s.suffix)
58 h := md5.New()
59 text := "HelloWorld"
60 h.Write([]byte(text))
61 part := binary.PartInfo{Checksum: hex.EncodeToString(h.Sum(nil)), Size: int64(len(text))}
62 return []binary.PartInfo{part}, nil
Jiri Simsab04fbb22014-06-27 17:38:04 -070063}
64
65func (s *server) Upload(_ ipc.ServerContext, _ int32, stream repository.BinaryServiceUploadStream) error {
Jiri Simsa51d78fc2014-07-09 18:34:08 -070066 vlog.Infof("Upload() was called. suffix=%v", s.suffix)
Shyam Jayaraman97b9dca2014-07-31 13:30:46 -070067 rStream := stream.RecvStream()
68 for rStream.Advance() {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070069 }
Jiri Simsab04fbb22014-06-27 17:38:04 -070070 return nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070071}
72
73type dispatcher struct {
74}
75
76func NewDispatcher() *dispatcher {
77 return &dispatcher{}
78}
79
Cosmos Nicolaou8bfacf22014-08-19 11:19:36 -070080func (d *dispatcher) Lookup(suffix, method string) (ipc.Invoker, security.Authorizer, error) {
Jiri Simsab04fbb22014-06-27 17:38:04 -070081 invoker := ipc.ReflectInvoker(repository.NewServerBinary(&server{suffix: suffix}))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070082 return invoker, nil, nil
83}
84
85func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
86 dispatcher := NewDispatcher()
87 server, err := r.NewServer()
88 if err != nil {
89 t.Errorf("NewServer failed: %v", err)
90 return nil, nil, err
91 }
Adam Sadovsky5181bdb2014-08-13 10:29:11 -070092 endpoint, err := server.Listen("tcp", "127.0.0.1:0")
Jiri Simsa5293dcb2014-05-10 09:56:38 -070093 if err != nil {
94 t.Errorf("Listen failed: %v", err)
95 return nil, nil, err
96 }
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070097 if err := server.Serve("", dispatcher); err != nil {
98 t.Errorf("Serve failed: %v", err)
99 return nil, nil, err
100 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700101 return server, endpoint, nil
102}
103
104func stopServer(t *testing.T, server ipc.Server) {
105 if err := server.Stop(); err != nil {
106 t.Errorf("server.Stop failed: %v", err)
107 }
108}
109
Jiri Simsab04fbb22014-06-27 17:38:04 -0700110func TestBinaryClient(t *testing.T) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700111 runtime := rt.Init()
112 server, endpoint, err := startServer(t, runtime)
113 if err != nil {
114 return
115 }
116 defer stopServer(t, server)
117 // Setup the command-line.
118 cmd := impl.Root()
119 var stdout, stderr bytes.Buffer
120 cmd.Init(nil, &stdout, &stderr)
121
122 // Test the 'delete' command.
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700123 if err := cmd.Execute([]string{"delete", naming.JoinAddressName(endpoint.String(), "//exists")}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700124 t.Fatalf("%v", err)
125 }
Jiri Simsab04fbb22014-06-27 17:38:04 -0700126 if expected, got := "Binary deleted successfully", strings.TrimSpace(stdout.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700127 t.Errorf("Got %q, expected %q", got, expected)
128 }
129 stdout.Reset()
130
131 // Test the 'download' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700132 dir, err := ioutil.TempDir("", "binaryimpltest")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700133 if err != nil {
134 t.Fatalf("%v", err)
135 }
136 defer os.Remove(dir)
137 file := path.Join(dir, "testfile")
138 defer os.Remove(file)
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700139 if err := cmd.Execute([]string{"download", naming.JoinAddressName(endpoint.String(), "//exists"), file}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700140 t.Fatalf("%v", err)
141 }
Jiri Simsab04fbb22014-06-27 17:38:04 -0700142 if expected, got := "Binary downloaded to file "+file, strings.TrimSpace(stdout.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700143 t.Errorf("Got %q, expected %q", got, expected)
144 }
145 buf, err := ioutil.ReadFile(file)
146 if err != nil {
147 t.Fatalf("%v", err)
148 }
149 if expected := "HelloWorld"; string(buf) != expected {
150 t.Errorf("Got %q, expected %q", string(buf), expected)
151 }
152 stdout.Reset()
153
154 // Test the 'upload' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700155 if err := cmd.Execute([]string{"upload", naming.JoinAddressName(endpoint.String(), "//exists"), file}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700156 t.Fatalf("%v", err)
157 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700158}