blob: 70c0122cf3a039328e84a932a18a6e7234889f59 [file] [log] [blame]
Jiri Simsa5293dcb2014-05-10 09:56:38 -07001package impl_test
2
3import (
4 "bytes"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "path"
9 "strings"
10 "testing"
11
Jiri Simsab04fbb22014-06-27 17:38:04 -070012 "veyron/tools/binary/impl"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070013
14 "veyron2"
15 "veyron2/ipc"
16 "veyron2/naming"
17 "veyron2/rt"
18 "veyron2/security"
Jiri Simsab04fbb22014-06-27 17:38:04 -070019 "veyron2/services/mgmt/binary"
Jiri Simsaddbfebb2014-06-20 15:56:06 -070020 "veyron2/services/mgmt/repository"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070021 "veyron2/vlog"
22)
23
24type server struct {
25 suffix string
26}
27
Jiri Simsab04fbb22014-06-27 17:38:04 -070028func (s *server) Create(ipc.ServerContext, int32) error {
29 vlog.VI(2).Infof("Create() was called. suffix=%v", s.suffix)
30 return nil
31}
32
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070033func (s *server) Delete(ipc.ServerContext) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070034 vlog.VI(2).Infof("Delete() was called. suffix=%v", s.suffix)
35 if s.suffix != "exists" {
Jiri Simsab04fbb22014-06-27 17:38:04 -070036 return fmt.Errorf("binary doesn't exist: %v", s.suffix)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070037 }
38 return nil
39}
40
Jiri Simsab04fbb22014-06-27 17:38:04 -070041func (s *server) Download(_ ipc.ServerContext, _ int32, stream repository.BinaryServiceDownloadStream) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070042 vlog.VI(2).Infof("Download() was called. suffix=%v", s.suffix)
43 stream.Send([]byte("Hello"))
44 stream.Send([]byte("World"))
45 return nil
46}
47
Jiri Simsab04fbb22014-06-27 17:38:04 -070048func (s *server) DownloadURL(ipc.ServerContext) (string, int64, error) {
49 vlog.VI(2).Infof("DownloadURL() was called. suffix=%v", s.suffix)
50 return "", 0, nil
51}
52
53func (s *server) Stat(ipc.ServerContext) ([]binary.PartInfo, error) {
54 vlog.VI(2).Infof("Stat() was called. suffix=%v", s.suffix)
55 return []binary.PartInfo{}, nil
56}
57
58func (s *server) Upload(_ ipc.ServerContext, _ int32, stream repository.BinaryServiceUploadStream) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070059 vlog.VI(2).Infof("Upload() was called. suffix=%v", s.suffix)
60 for {
61 if _, err := stream.Recv(); err != nil {
62 break
63 }
64 }
Jiri Simsab04fbb22014-06-27 17:38:04 -070065 return nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070066}
67
68type dispatcher struct {
69}
70
71func NewDispatcher() *dispatcher {
72 return &dispatcher{}
73}
74
75func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
Jiri Simsab04fbb22014-06-27 17:38:04 -070076 invoker := ipc.ReflectInvoker(repository.NewServerBinary(&server{suffix: suffix}))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070077 return invoker, nil, nil
78}
79
80func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
81 dispatcher := NewDispatcher()
82 server, err := r.NewServer()
83 if err != nil {
84 t.Errorf("NewServer failed: %v", err)
85 return nil, nil, err
86 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -070087 endpoint, err := server.Listen("tcp", "localhost:0")
88 if err != nil {
89 t.Errorf("Listen failed: %v", err)
90 return nil, nil, err
91 }
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070092 if err := server.Serve("", dispatcher); err != nil {
93 t.Errorf("Serve failed: %v", err)
94 return nil, nil, err
95 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -070096 return server, endpoint, nil
97}
98
99func stopServer(t *testing.T, server ipc.Server) {
100 if err := server.Stop(); err != nil {
101 t.Errorf("server.Stop failed: %v", err)
102 }
103}
104
Jiri Simsab04fbb22014-06-27 17:38:04 -0700105func TestBinaryClient(t *testing.T) {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700106 runtime := rt.Init()
107 server, endpoint, err := startServer(t, runtime)
108 if err != nil {
109 return
110 }
111 defer stopServer(t, server)
112 // Setup the command-line.
113 cmd := impl.Root()
114 var stdout, stderr bytes.Buffer
115 cmd.Init(nil, &stdout, &stderr)
116
117 // Test the 'delete' command.
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700118 if err := cmd.Execute([]string{"delete", naming.JoinAddressName(endpoint.String(), "//exists")}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700119 t.Fatalf("%v", err)
120 }
Jiri Simsab04fbb22014-06-27 17:38:04 -0700121 if expected, got := "Binary deleted successfully", strings.TrimSpace(stdout.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700122 t.Errorf("Got %q, expected %q", got, expected)
123 }
124 stdout.Reset()
125
126 // Test the 'download' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700127 dir, err := ioutil.TempDir("", "binaryimpltest")
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700128 if err != nil {
129 t.Fatalf("%v", err)
130 }
131 defer os.Remove(dir)
132 file := path.Join(dir, "testfile")
133 defer os.Remove(file)
Cosmos Nicolaou69335402014-05-20 14:41:58 -0700134 if err := cmd.Execute([]string{"download", naming.JoinAddressName(endpoint.String(), "//exists"), file}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700135 t.Fatalf("%v", err)
136 }
Jiri Simsab04fbb22014-06-27 17:38:04 -0700137 if expected, got := "Binary downloaded to file "+file, strings.TrimSpace(stdout.String()); got != expected {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700138 t.Errorf("Got %q, expected %q", got, expected)
139 }
140 buf, err := ioutil.ReadFile(file)
141 if err != nil {
142 t.Fatalf("%v", err)
143 }
144 if expected := "HelloWorld"; string(buf) != expected {
145 t.Errorf("Got %q, expected %q", string(buf), expected)
146 }
147 stdout.Reset()
148
149 // Test the 'upload' command.
Jiri Simsab04fbb22014-06-27 17:38:04 -0700150 if err := cmd.Execute([]string{"upload", naming.JoinAddressName(endpoint.String(), "//exists"), file}); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700151 t.Fatalf("%v", err)
152 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700153}