veyron/tools: Merge the impl and main packages
This change gets rid of the impl packages and moves the impl.go files to
the main package for each tool under veyron/tools/.
Change-Id: Ieae4bc1dd02296f58f8cb6327b903d025cf833f5
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
new file mode 100644
index 0000000..d188d48
--- /dev/null
+++ b/tools/profile/impl_test.go
@@ -0,0 +1,169 @@
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "strings"
+ "testing"
+
+ "veyron.io/veyron/veyron2"
+ "veyron.io/veyron/veyron2/ipc"
+ "veyron.io/veyron/veyron2/naming"
+ "veyron.io/veyron/veyron2/rt"
+ "veyron.io/veyron/veyron2/security"
+ "veyron.io/veyron/veyron2/services/mgmt/build"
+ "veyron.io/veyron/veyron2/vlog"
+
+ "veyron.io/veyron/veyron/profiles"
+ "veyron.io/veyron/veyron/services/mgmt/profile"
+ "veyron.io/veyron/veyron/services/mgmt/repository"
+)
+
+var (
+ // spec is an example profile specification used throughout the test.
+ spec = profile.Specification{
+ Arch: build.AMD64,
+ Description: "Example profile to test the profile repository implementation.",
+ Format: build.ELF,
+ Libraries: map[profile.Library]struct{}{profile.Library{Name: "foo", MajorVersion: "1", MinorVersion: "0"}: struct{}{}},
+ Label: "example",
+ OS: build.Linux,
+ }
+)
+
+type server struct {
+ suffix string
+}
+
+func (s *server) Label(ipc.ServerContext) (string, error) {
+ vlog.VI(2).Infof("%v.Label() was called", s.suffix)
+ if s.suffix != "exists" {
+ return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
+ }
+ return spec.Label, nil
+}
+
+func (s *server) Description(ipc.ServerContext) (string, error) {
+ vlog.VI(2).Infof("%v.Description() was called", s.suffix)
+ if s.suffix != "exists" {
+ return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
+ }
+ return spec.Description, nil
+}
+
+func (s *server) Specification(ipc.ServerContext) (profile.Specification, error) {
+ vlog.VI(2).Infof("%v.Specification() was called", s.suffix)
+ if s.suffix != "exists" {
+ return profile.Specification{}, fmt.Errorf("profile doesn't exist: %v", s.suffix)
+ }
+ return spec, nil
+}
+
+func (s *server) Put(_ ipc.ServerContext, _ profile.Specification) error {
+ vlog.VI(2).Infof("%v.Put() was called", s.suffix)
+ return nil
+}
+
+func (s *server) Remove(ipc.ServerContext) error {
+ vlog.VI(2).Infof("%v.Remove() was called", s.suffix)
+ if s.suffix != "exists" {
+ return fmt.Errorf("profile doesn't exist: %v", s.suffix)
+ }
+ return nil
+}
+
+type dispatcher struct {
+}
+
+func NewDispatcher() *dispatcher {
+ return &dispatcher{}
+}
+
+func (d *dispatcher) Lookup(suffix, method string) (ipc.Invoker, security.Authorizer, error) {
+ invoker := ipc.ReflectInvoker(repository.NewServerProfile(&server{suffix: suffix}))
+ return invoker, nil, nil
+}
+
+func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
+ dispatcher := NewDispatcher()
+ server, err := r.NewServer()
+ if err != nil {
+ t.Errorf("NewServer failed: %v", err)
+ return nil, nil, err
+ }
+ endpoint, err := server.ListenX(profiles.LocalListenSpec)
+ if err != nil {
+ t.Errorf("Listen failed: %v", err)
+ return nil, nil, err
+ }
+ if err := server.Serve("", dispatcher); err != nil {
+ t.Errorf("Serve failed: %v", err)
+ return nil, nil, err
+ }
+ return server, endpoint, nil
+}
+
+func stopServer(t *testing.T, server ipc.Server) {
+ if err := server.Stop(); err != nil {
+ t.Errorf("server.Stop failed: %v", err)
+ }
+}
+
+func TestProfileClient(t *testing.T) {
+ runtime := rt.Init()
+ server, endpoint, err := startServer(t, runtime)
+ if err != nil {
+ return
+ }
+ defer stopServer(t, server)
+ // Setup the command-line.
+ cmd := root()
+ var stdout, stderr bytes.Buffer
+ cmd.Init(nil, &stdout, &stderr)
+ exists := naming.JoinAddressName(endpoint.String(), "//exists")
+
+ // Test the 'label' command.
+ if err := cmd.Execute([]string{"label", exists}); err != nil {
+ t.Fatalf("%v", err)
+ }
+ if expected, got := spec.Label, strings.TrimSpace(stdout.String()); got != expected {
+ t.Errorf("Got %q, expected %q", got, expected)
+ }
+ stdout.Reset()
+
+ // Test the 'description' command.
+ if err := cmd.Execute([]string{"description", exists}); err != nil {
+ t.Fatalf("%v", err)
+ }
+ if expected, got := spec.Description, strings.TrimSpace(stdout.String()); got != expected {
+ t.Errorf("Got %q, expected %q", got, expected)
+ }
+ stdout.Reset()
+
+ // Test the 'spec' command.
+ if err := cmd.Execute([]string{"spec", exists}); err != nil {
+ t.Fatalf("%v", err)
+ }
+ if expected, got := fmt.Sprintf("%#v", spec), strings.TrimSpace(stdout.String()); got != expected {
+ t.Errorf("Got %q, expected %q", got, expected)
+ }
+ stdout.Reset()
+
+ // Test the 'put' command.
+ if err := cmd.Execute([]string{"put", exists}); err != nil {
+ t.Fatalf("%v", err)
+ }
+ if expected, got := "Profile added successfully.", strings.TrimSpace(stdout.String()); got != expected {
+ t.Errorf("Got %q, expected %q", got, expected)
+ }
+ stdout.Reset()
+
+ // Test the 'remove' command.
+ if err := cmd.Execute([]string{"remove", exists}); err != nil {
+ t.Fatalf("%v", err)
+ }
+ if expected, got := "Profile removed successfully.", strings.TrimSpace(stdout.String()); got != expected {
+ t.Errorf("Got %q, expected %q", got, expected)
+ }
+ stdout.Reset()
+}