diff --git a/services/mgmt/binary/impl/fs_utils.go b/services/mgmt/binary/impl/fs_utils.go
index 1147d21..9468fb6 100644
--- a/services/mgmt/binary/impl/fs_utils.go
+++ b/services/mgmt/binary/impl/fs_utils.go
@@ -26,10 +26,10 @@
 func checksumExists(path string) error {
 	switch _, err := os.Stat(path); {
 	case os.IsNotExist(err):
-		return verror.Make(errInvalidPart, nil, path)
+		return verror.Make(ErrInvalidPart, nil, path)
 	case err != nil:
 		vlog.Errorf("Stat(%v) failed: %v", path, err)
-		return verror.Make(errOperationFailed, nil, path)
+		return verror.Make(ErrOperationFailed, nil, path)
 	}
 	checksumFile := filepath.Join(path, checksum)
 	_, err := os.Stat(checksumFile)
@@ -38,7 +38,7 @@
 		return verror.Make(verror.NoExist, nil, path)
 	case err != nil:
 		vlog.Errorf("Stat(%v) failed: %v", checksumFile, err)
-		return verror.Make(errOperationFailed, nil, path)
+		return verror.Make(ErrOperationFailed, nil, path)
 	default:
 		return nil
 	}
@@ -58,7 +58,7 @@
 	infos, err := ioutil.ReadDir(path)
 	if err != nil {
 		vlog.Errorf("ReadDir(%v) failed: %v", path, err)
-		return []string{}, verror.Make(errOperationFailed, nil, path)
+		return []string{}, verror.Make(ErrOperationFailed, nil, path)
 	}
 	nDirs := 0
 	for _, info := range infos {
@@ -73,10 +73,10 @@
 			idx, err := strconv.Atoi(partName)
 			if err != nil {
 				vlog.Errorf("Atoi(%v) failed: %v", partName, err)
-				return []string{}, verror.Make(errOperationFailed, nil, path)
+				return []string{}, verror.Make(ErrOperationFailed, nil, path)
 			}
 			if idx < 0 || idx >= len(infos) || result[idx] != "" {
-				return []string{}, verror.Make(errOperationFailed, nil, path)
+				return []string{}, verror.Make(ErrOperationFailed, nil, path)
 			}
 			result[idx] = filepath.Join(path, partName)
 		} else {
@@ -84,7 +84,7 @@
 				continue
 			}
 			// The only entries should correspond to the part dirs.
-			return []string{}, verror.Make(errOperationFailed, nil, path)
+			return []string{}, verror.Make(ErrOperationFailed, nil, path)
 		}
 	}
 	return result, nil
diff --git a/services/mgmt/binary/impl/http.go b/services/mgmt/binary/impl/http.go
index 23363c1..1b34812 100644
--- a/services/mgmt/binary/impl/http.go
+++ b/services/mgmt/binary/impl/http.go
@@ -43,7 +43,7 @@
 		var err error
 		if partFiles[i], err = os.Open(dataPath); err != nil {
 			vlog.Errorf("Open(%v) failed: %v", dataPath, err)
-			return nil, verror.Make(errOperationFailed, nil, dataPath)
+			return nil, verror.Make(ErrOperationFailed, nil, dataPath)
 		}
 	}
 	return multipart.NewFile(name, partFiles)
diff --git a/services/mgmt/binary/impl/http_test.go b/services/mgmt/binary/impl/http_test.go
index 601ddd3..db4b0a5 100644
--- a/services/mgmt/binary/impl/http_test.go
+++ b/services/mgmt/binary/impl/http_test.go
@@ -1,4 +1,4 @@
-package impl
+package impl_test
 
 import (
 	"bytes"
@@ -11,6 +11,7 @@
 	"v.io/core/veyron2/services/mgmt/repository"
 
 	"v.io/core/veyron/lib/testutil"
+	"v.io/core/veyron/services/mgmt/binary/impl"
 )
 
 // TestHTTP checks that HTTP download works.
@@ -24,7 +25,7 @@
 		data := make([][]byte, length)
 		for i := 0; i < length; i++ {
 			// Random size, but at least 1 (avoid empty parts).
-			size := testutil.Rand.Intn(1000*bufferLength) + 1
+			size := testutil.Rand.Intn(1000*impl.BufferLength) + 1
 			data[i] = testutil.RandomBytes(size)
 		}
 		mediaInfo := repository.MediaInfo{Type: "application/octet-stream"}
@@ -32,7 +33,7 @@
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
-			if streamErr, err := invokeUpload(t, binary, data[i], int32(i)); streamErr != nil || err != nil {
+			if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 				t.FailNow()
 			}
 		}
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index 5b52ad3..09fb3a4 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -1,19 +1,15 @@
-package impl
+package impl_test
 
 import (
 	"bytes"
 	"crypto/md5"
 	"encoding/hex"
 	"fmt"
-	"io/ioutil"
 	"net"
 	"net/http"
-	"os"
-	"path/filepath"
 	"reflect"
 	"testing"
 
-	"v.io/core/veyron2"
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -22,7 +18,9 @@
 	"v.io/core/veyron2/vlog"
 
 	"v.io/core/veyron/lib/testutil"
-	"v.io/core/veyron/profiles"
+	_ "v.io/core/veyron/profiles/static"
+	"v.io/core/veyron/services/mgmt/binary/impl"
+	mgmttest "v.io/core/veyron/services/mgmt/lib/testutil"
 )
 
 const (
@@ -41,121 +39,41 @@
 	gctx = runtime.NewContext()
 }
 
-// invokeUpload invokes the Upload RPC using the given client binary
-// <binary> and streams the given binary <binary> to it.
-func invokeUpload(t *testing.T, binary repository.BinaryClientMethods, data []byte, part int32) (error, error) {
-	stream, err := binary.Upload(gctx, part)
-	if err != nil {
-		t.Errorf("Upload() failed: %v", err)
-		return nil, err
-	}
-	sender := stream.SendStream()
-	if streamErr := sender.Send(data); streamErr != nil {
-		err := stream.Finish()
-		if err != nil {
-			t.Logf("Finish() failed: %v", err)
-		}
-		t.Logf("Send() failed: %v", streamErr)
-		return streamErr, err
-	}
-	if streamErr := sender.Close(); streamErr != nil {
-		err := stream.Finish()
-		if err != nil {
-			t.Logf("Finish() failed: %v", err)
-		}
-		t.Logf("Close() failed: %v", streamErr)
-		return streamErr, err
-	}
-	if err := stream.Finish(); err != nil {
-		t.Logf("Finish() failed: %v", err)
-		return nil, err
-	}
-	return nil, nil
-}
-
-// invokeDownload invokes the Download RPC using the given client binary
-// <binary> and streams binary from to it.
-func invokeDownload(t *testing.T, binary repository.BinaryClientMethods, part int32) ([]byte, error, error) {
-	stream, err := binary.Download(gctx, part)
-	if err != nil {
-		t.Errorf("Download() failed: %v", err)
-		return nil, nil, err
-	}
-	output := make([]byte, 0)
-	rStream := stream.RecvStream()
-	for rStream.Advance() {
-		bytes := rStream.Value()
-		output = append(output, bytes...)
-	}
-
-	if streamErr := rStream.Err(); streamErr != nil {
-		err := stream.Finish()
-		if err != nil {
-			t.Logf("Finish() failed: %v", err)
-		}
-		t.Logf("Advance() failed with: %v", streamErr)
-		return nil, streamErr, err
-	}
-
-	if err := stream.Finish(); err != nil {
-		t.Logf("Finish() failed: %v", err)
-		return nil, nil, err
-	}
-	return output, nil, nil
-}
-
 // startServer starts the binary repository server.
 func startServer(t *testing.T, depth int) (repository.BinaryClientMethods, string, string, func()) {
 	// Setup the root of the binary repository.
-	rootDir, err := ioutil.TempDir("", veyronPrefix)
-	if err != nil {
-		t.Fatalf("TempDir() failed: %v", err)
-	}
-	path, perm := filepath.Join(rootDir, VersionFile), os.FileMode(0600)
-	if err := ioutil.WriteFile(path, []byte(Version), perm); err != nil {
-		vlog.Fatalf("WriteFile(%v, %v, %v) failed: %v", path, Version, perm, err)
-	}
+	rootDir, cleanup := mgmttest.SetupRootDir(t, "bindir")
+	prepDirectory(t, rootDir)
+
 	// Setup and start the binary repository server.
-	server, err := veyron2.NewServer(gctx)
-	if err != nil {
-		t.Fatalf("NewServer() failed: %v", err)
-	}
+	server, endpoint := mgmttest.NewServer(gctx)
+
 	listener, err := net.Listen("tcp", "127.0.0.1:0")
 	if err != nil {
 		t.Fatal(err)
 	}
-	state, err := NewState(rootDir, listener.Addr().String(), depth)
+	state, err := impl.NewState(rootDir, listener.Addr().String(), depth)
 	if err != nil {
 		t.Fatalf("NewState(%v, %v) failed: %v", rootDir, listener.Addr().String(), depth, err)
 	}
 	go func() {
-		if err := http.Serve(listener, http.FileServer(NewHTTPRoot(state))); err != nil {
+		if err := http.Serve(listener, http.FileServer(impl.NewHTTPRoot(state))); err != nil {
 			vlog.Fatalf("Serve() failed: %v", err)
 		}
 	}()
-	dispatcher := NewDispatcher(state, nil)
-	endpoints, err := server.Listen(profiles.LocalListenSpec)
-	if err != nil {
-		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
-	}
-	endpoint := endpoints[0]
+	dispatcher := impl.NewDispatcher(state, nil)
 	dontPublishName := ""
 	if err := server.ServeDispatcher(dontPublishName, dispatcher); err != nil {
 		t.Fatalf("Serve(%q) failed: %v", dontPublishName, err)
 	}
-	name := naming.JoinAddressName(endpoint.String(), "test")
+	name := naming.JoinAddressName(endpoint, "test")
 	binary := repository.BinaryClient(name)
-	return binary, endpoint.String(), fmt.Sprintf("http://%s/test", listener.Addr()), func() {
+	return binary, endpoint, fmt.Sprintf("http://%s/test", listener.Addr()), func() {
 		// Shutdown the binary repository server.
 		if err := server.Stop(); err != nil {
 			t.Fatalf("Stop() failed: %v", err)
 		}
-		if err := os.RemoveAll(path); err != nil {
-			t.Fatalf("RemoveAll(%v) failed: %v", path, err)
-		}
-		if err := os.RemoveAll(rootDir); err != nil {
-			t.Fatalf("RemoveAll(%v) failed: %v", rootDir, err)
-		}
+		cleanup()
 	}
 }
 
@@ -166,14 +84,13 @@
 	for i := 0; i < md5.Size; i++ {
 		binary, ep, _, cleanup := startServer(t, i)
 		defer cleanup()
-		// Create up to 4MB of random bytes.
-		size := testutil.Rand.Intn(1000 * bufferLength)
-		data := testutil.RandomBytes(size)
+		data := testData()
+
 		// Test the binary repository interface.
 		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
-		if streamErr, err := invokeUpload(t, binary, data, 0); streamErr != nil || err != nil {
+		if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
 		parts, _, err := binary.Stat(gctx)
@@ -189,7 +106,7 @@
 		if expected, got := len(data), int(parts[0].Size); expected != got {
 			t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 		}
-		output, streamErr, err := invokeDownload(t, binary, 0)
+		output, streamErr, err := invokeDownload(t, gctx, binary, 0)
 		if streamErr != nil || err != nil {
 			t.FailNow()
 		}
@@ -219,15 +136,14 @@
 		// Create <length> chunks of up to 4MB of random bytes.
 		data := make([][]byte, length)
 		for i := 0; i < length; i++ {
-			size := testutil.Rand.Intn(1000 * bufferLength)
-			data[i] = testutil.RandomBytes(size)
+			data[i] = testData()
 		}
 		// Test the binary repository interface.
 		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
-			if streamErr, err := invokeUpload(t, binary, data[i], int32(i)); streamErr != nil || err != nil {
+			if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 				t.FailNow()
 			}
 		}
@@ -237,7 +153,7 @@
 		}
 		for i := 0; i < length; i++ {
 			hpart := md5.New()
-			output, streamErr, err := invokeDownload(t, binary, int32(i))
+			output, streamErr, err := invokeDownload(t, gctx, binary, int32(i))
 			if streamErr != nil || err != nil {
 				t.FailNow()
 			}
@@ -269,8 +185,7 @@
 		// Create <length> chunks of up to 4MB of random bytes.
 		data := make([][]byte, length)
 		for i := 0; i < length; i++ {
-			size := testutil.Rand.Intn(1000 * bufferLength)
-			data[i] = testutil.RandomBytes(size)
+			data[i] = testData()
 		}
 		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
@@ -284,15 +199,15 @@
 			}
 			finished := true
 			for _, part := range parts {
-				finished = finished && (part != MissingPart)
+				finished = finished && (part != impl.MissingPart)
 			}
 			if finished {
 				break
 			}
 			for i := 0; i < length; i++ {
 				fail := testutil.Rand.Intn(2)
-				if parts[i] == MissingPart && fail != 0 {
-					if streamErr, err := invokeUpload(t, binary, data[i], int32(i)); streamErr != nil || err != nil {
+				if parts[i] == impl.MissingPart && fail != 0 {
+					if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 						t.FailNow()
 					}
 				}
@@ -311,9 +226,8 @@
 	const length = 2
 	data := make([][]byte, length)
 	for i := 0; i < length; i++ {
-		size := testutil.Rand.Intn(1000 * bufferLength)
-		data[i] = make([]byte, size)
-		for j := 0; j < size; j++ {
+		data[i] = testData()
+		for j := 0; j < len(data[i]); j++ {
 			data[i][j] = byte(testutil.Rand.Int())
 		}
 	}
@@ -325,36 +239,36 @@
 	} else if want := verror.Exist.ID; !verror.Is(err, want) {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
-	if streamErr, err := invokeUpload(t, binary, data[0], 0); streamErr != nil || err != nil {
+	if streamErr, err := invokeUpload(t, gctx, binary, data[0], 0); streamErr != nil || err != nil {
 		t.Fatalf("Upload() failed: %v", err)
 	}
-	if _, err := invokeUpload(t, binary, data[0], 0); err == nil {
+	if _, err := invokeUpload(t, gctx, binary, data[0], 0); err == nil {
 		t.Fatalf("Upload() did not fail when it should have")
 	} else if want := verror.Exist.ID; !verror.Is(err, want) {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
-	if _, _, err := invokeDownload(t, binary, 1); err == nil {
+	if _, _, err := invokeDownload(t, gctx, binary, 1); err == nil {
 		t.Fatalf("Download() did not fail when it should have")
 	} else if want := verror.NoExist.ID; !verror.Is(err, want) {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
-	if streamErr, err := invokeUpload(t, binary, data[1], 1); streamErr != nil || err != nil {
+	if streamErr, err := invokeUpload(t, gctx, binary, data[1], 1); streamErr != nil || err != nil {
 		t.Fatalf("Upload() failed: %v", err)
 	}
-	if _, streamErr, err := invokeDownload(t, binary, 0); streamErr != nil || err != nil {
+	if _, streamErr, err := invokeDownload(t, gctx, binary, 0); streamErr != nil || err != nil {
 		t.Fatalf("Download() failed: %v", err)
 	}
 	// Upload/Download on a part number that's outside the range set forth in
 	// Create should fail.
 	for _, part := range []int32{-1, length} {
-		if _, err := invokeUpload(t, binary, []byte("dummy"), part); err == nil {
+		if _, err := invokeUpload(t, gctx, binary, []byte("dummy"), part); err == nil {
 			t.Fatalf("Upload() did not fail when it should have")
-		} else if want := errInvalidPart.ID; !verror.Is(err, want) {
+		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
-		if _, _, err := invokeDownload(t, binary, part); err == nil {
+		if _, _, err := invokeDownload(t, gctx, binary, part); err == nil {
 			t.Fatalf("Download() did not fail when it should have")
-		} else if want := errInvalidPart.ID; !verror.Is(err, want) {
+		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
 	}
@@ -371,9 +285,7 @@
 func TestGlob(t *testing.T) {
 	_, ep, _, cleanup := startServer(t, 2)
 	defer cleanup()
-	// Create up to 4MB of random bytes.
-	size := testutil.Rand.Intn(1000 * bufferLength)
-	data := testutil.RandomBytes(size)
+	data := testData()
 
 	objects := []string{"foo", "bar", "hello world", "a/b/c"}
 	for _, obj := range objects {
@@ -383,7 +295,7 @@
 		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
-		if streamErr, err := invokeUpload(t, binary, data, 0); streamErr != nil || err != nil {
+		if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
 	}
diff --git a/services/mgmt/binary/impl/service.go b/services/mgmt/binary/impl/service.go
index 5ec3fc5..0ce7bbe 100644
--- a/services/mgmt/binary/impl/service.go
+++ b/services/mgmt/binary/impl/service.go
@@ -53,10 +53,10 @@
 const pkgPath = "v.io/core/veyron/services/mgmt/binary/impl"
 
 var (
-	errInProgress      = verror.Register(pkgPath+".errInProgress", verror.NoRetry, "{1:}{2:} identical upload already in progress{:_}")
-	errInvalidParts    = verror.Register(pkgPath+".errInvalidParts", verror.NoRetry, "{1:}{2:} invalid number of binary parts{:_}")
-	errInvalidPart     = verror.Register(pkgPath+".errInvalidPart", verror.NoRetry, "{1:}{2:} invalid binary part number{:_}")
-	errOperationFailed = verror.Register(pkgPath+".errOperationFailed", verror.NoRetry, "{1:}{2:} operation failed{:_}")
+	ErrInProgress      = verror.Register(pkgPath+".errInProgress", verror.NoRetry, "{1:}{2:} identical upload already in progress{:_}")
+	ErrInvalidParts    = verror.Register(pkgPath+".errInvalidParts", verror.NoRetry, "{1:}{2:} invalid number of binary parts{:_}")
+	ErrInvalidPart     = verror.Register(pkgPath+".errInvalidPart", verror.NoRetry, "{1:}{2:} invalid binary part number{:_}")
+	ErrOperationFailed = verror.Register(pkgPath+".errOperationFailed", verror.NoRetry, "{1:}{2:} operation failed{:_}")
 )
 
 // TODO(jsimsa): When VDL supports composite literal constants, remove
@@ -75,38 +75,38 @@
 	}
 }
 
-const bufferLength = 4096
+const BufferLength = 4096
 
 func (i *binaryService) Create(context ipc.ServerContext, nparts int32, mediaInfo repository.MediaInfo) error {
 	vlog.Infof("%v.Create(%v, %v)", i.suffix, nparts, mediaInfo)
 	if nparts < 1 {
-		return verror.Make(errInvalidParts, context.Context())
+		return verror.Make(ErrInvalidParts, context.Context())
 	}
 	parent, perm := filepath.Dir(i.path), os.FileMode(0700)
 	if err := os.MkdirAll(parent, perm); err != nil {
 		vlog.Errorf("MkdirAll(%v, %v) failed: %v", parent, perm, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	prefix := "creating-"
 	tmpDir, err := ioutil.TempDir(parent, prefix)
 	if err != nil {
 		vlog.Errorf("TempDir(%v, %v) failed: %v", parent, prefix, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	nameFile := filepath.Join(tmpDir, "name")
 	if err := ioutil.WriteFile(nameFile, []byte(i.suffix), os.FileMode(0600)); err != nil {
 		vlog.Errorf("WriteFile(%q) failed: %v", nameFile)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	infoFile := filepath.Join(tmpDir, "mediainfo")
 	jInfo, err := json.Marshal(mediaInfo)
 	if err != nil {
 		vlog.Errorf("json.Marshal(%v) failed: %v", mediaInfo, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	if err := ioutil.WriteFile(infoFile, jInfo, os.FileMode(0600)); err != nil {
 		vlog.Errorf("WriteFile(%q) failed: %v", infoFile, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	for j := 0; j < int(nparts); j++ {
 		partPath, partPerm := generatePartPath(tmpDir, j), os.FileMode(0700)
@@ -115,7 +115,7 @@
 			if err := os.RemoveAll(tmpDir); err != nil {
 				vlog.Errorf("RemoveAll(%v) failed: %v", tmpDir, err)
 			}
-			return verror.Make(errOperationFailed, context.Context())
+			return verror.Make(ErrOperationFailed, context.Context())
 		}
 	}
 	// Use os.Rename() to atomically create the binary directory
@@ -130,7 +130,7 @@
 			return verror.Make(verror.Exist, context.Context(), i.path)
 		}
 		vlog.Errorf("Rename(%v, %v) failed: %v", tmpDir, i.path, err)
-		return verror.Make(errOperationFailed, context.Context(), i.path)
+		return verror.Make(ErrOperationFailed, context.Context(), i.path)
 	}
 	return nil
 }
@@ -142,18 +142,18 @@
 			return verror.Make(verror.NoExist, context.Context(), i.path)
 		}
 		vlog.Errorf("Stat(%v) failed: %v", i.path, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	// Use os.Rename() to atomically remove the binary directory
 	// structure.
 	path := filepath.Join(filepath.Dir(i.path), "removing-"+filepath.Base(i.path))
 	if err := os.Rename(i.path, path); err != nil {
 		vlog.Errorf("Rename(%v, %v) failed: %v", i.path, path, err)
-		return verror.Make(errOperationFailed, context.Context(), i.path)
+		return verror.Make(ErrOperationFailed, context.Context(), i.path)
 	}
 	if err := os.RemoveAll(path); err != nil {
 		vlog.Errorf("Remove(%v) failed: %v", path, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	for {
 		// Remove the binary and all directories on the path back to the
@@ -167,7 +167,7 @@
 				break
 			}
 			vlog.Errorf("Remove(%v) failed: %v", path, err)
-			return verror.Make(errOperationFailed, context.Context())
+			return verror.Make(ErrOperationFailed, context.Context())
 		}
 	}
 	return nil
@@ -183,23 +183,23 @@
 	file, err := os.Open(dataPath)
 	if err != nil {
 		vlog.Errorf("Open(%v) failed: %v", dataPath, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	defer file.Close()
-	buffer := make([]byte, bufferLength)
+	buffer := make([]byte, BufferLength)
 	sender := context.SendStream()
 	for {
 		n, err := file.Read(buffer)
 		if err != nil && err != io.EOF {
 			vlog.Errorf("Read() failed: %v", err)
-			return verror.Make(errOperationFailed, context.Context())
+			return verror.Make(ErrOperationFailed, context.Context())
 		}
 		if n == 0 {
 			break
 		}
 		if err := sender.Send(buffer[:n]); err != nil {
 			vlog.Errorf("Send() failed: %v", err)
-			return verror.Make(errOperationFailed, context.Context())
+			return verror.Make(ErrOperationFailed, context.Context())
 		}
 	}
 	return nil
@@ -228,7 +228,7 @@
 				continue
 			}
 			vlog.Errorf("ReadFile(%v) failed: %v", checksumFile, err)
-			return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(errOperationFailed, context.Context())
+			return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(ErrOperationFailed, context.Context())
 		}
 		dataFile := filepath.Join(part, data)
 		fi, err := os.Stat(dataFile)
@@ -238,7 +238,7 @@
 				continue
 			}
 			vlog.Errorf("Stat(%v) failed: %v", dataFile, err)
-			return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(errOperationFailed, context.Context())
+			return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(ErrOperationFailed, context.Context())
 		}
 		result = append(result, binary.PartInfo{Checksum: string(bytes), Size: fi.Size()})
 	}
@@ -246,12 +246,12 @@
 	jInfo, err := ioutil.ReadFile(infoFile)
 	if err != nil {
 		vlog.Errorf("ReadFile(%q) failed: %v", infoFile)
-		return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(errOperationFailed, context.Context())
+		return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(ErrOperationFailed, context.Context())
 	}
 	var mediaInfo repository.MediaInfo
 	if err := json.Unmarshal(jInfo, &mediaInfo); err != nil {
 		vlog.Errorf("json.Unmarshal(%v) failed: %v", jInfo, err)
-		return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(errOperationFailed, context.Context())
+		return []binary.PartInfo{}, repository.MediaInfo{}, verror.Make(ErrOperationFailed, context.Context())
 	}
 	return result, mediaInfo, nil
 }
@@ -270,17 +270,17 @@
 	lockFile, err := os.OpenFile(lockPath, flags, perm)
 	if err != nil {
 		if os.IsExist(err) {
-			return verror.Make(errInProgress, context.Context(), path)
+			return verror.Make(ErrInProgress, context.Context(), path)
 		}
 		vlog.Errorf("OpenFile(%v, %v, %v) failed: %v", lockPath, flags, suffix, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	defer os.Remove(lockFile.Name())
 	defer lockFile.Close()
 	file, err := ioutil.TempFile(path, suffix)
 	if err != nil {
 		vlog.Errorf("TempFile(%v, %v) failed: %v", path, suffix, err)
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	defer file.Close()
 	h := md5.New()
@@ -292,7 +292,7 @@
 			if err := os.Remove(file.Name()); err != nil {
 				vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 			}
-			return verror.Make(errOperationFailed, context.Context())
+			return verror.Make(ErrOperationFailed, context.Context())
 		}
 		h.Write(bytes)
 	}
@@ -302,7 +302,7 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 
 	hash := hex.EncodeToString(h.Sum(nil))
@@ -312,7 +312,7 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	dataFile := filepath.Join(path, data)
 	if err := os.Rename(file.Name(), dataFile); err != nil {
@@ -320,7 +320,7 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.Make(errOperationFailed, context.Context())
+		return verror.Make(ErrOperationFailed, context.Context())
 	}
 	return nil
 }
@@ -332,7 +332,7 @@
 	}
 	n := i.createObjectNameTree().find(elems, false)
 	if n == nil {
-		return nil, verror.Make(errOperationFailed, context.Context())
+		return nil, verror.Make(ErrOperationFailed, context.Context())
 	}
 	ch := make(chan string)
 	go func() {
diff --git a/services/mgmt/binary/impl/util_test.go b/services/mgmt/binary/impl/util_test.go
new file mode 100644
index 0000000..d747dd7
--- /dev/null
+++ b/services/mgmt/binary/impl/util_test.go
@@ -0,0 +1,91 @@
+package impl_test
+
+import (
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"v.io/core/veyron2/context"
+	"v.io/core/veyron2/services/mgmt/repository"
+
+	"v.io/core/veyron/lib/testutil"
+	"v.io/core/veyron/services/mgmt/binary/impl"
+)
+
+// invokeUpload invokes the Upload RPC using the given client binary
+// <binary> and streams the given binary <binary> to it.
+func invokeUpload(t *testing.T, ctx *context.T, binary repository.BinaryClientMethods, data []byte, part int32) (error, error) {
+	stream, err := binary.Upload(ctx, part)
+	if err != nil {
+		t.Errorf("Upload() failed: %v", err)
+		return nil, err
+	}
+	sender := stream.SendStream()
+	if streamErr := sender.Send(data); streamErr != nil {
+		err := stream.Finish()
+		if err != nil {
+			t.Logf("Finish() failed: %v", err)
+		}
+		t.Logf("Send() failed: %v", streamErr)
+		return streamErr, err
+	}
+	if streamErr := sender.Close(); streamErr != nil {
+		err := stream.Finish()
+		if err != nil {
+			t.Logf("Finish() failed: %v", err)
+		}
+		t.Logf("Close() failed: %v", streamErr)
+		return streamErr, err
+	}
+	if err := stream.Finish(); err != nil {
+		t.Logf("Finish() failed: %v", err)
+		return nil, err
+	}
+	return nil, nil
+}
+
+// invokeDownload invokes the Download RPC using the given client binary
+// <binary> and streams binary from to it.
+func invokeDownload(t *testing.T, ctx *context.T, binary repository.BinaryClientMethods, part int32) ([]byte, error, error) {
+	stream, err := binary.Download(ctx, part)
+	if err != nil {
+		t.Errorf("Download() failed: %v", err)
+		return nil, nil, err
+	}
+	output := make([]byte, 0)
+	rStream := stream.RecvStream()
+	for rStream.Advance() {
+		bytes := rStream.Value()
+		output = append(output, bytes...)
+	}
+
+	if streamErr := rStream.Err(); streamErr != nil {
+		err := stream.Finish()
+		if err != nil {
+			t.Logf("Finish() failed: %v", err)
+		}
+		t.Logf("Advance() failed with: %v", streamErr)
+		return nil, streamErr, err
+	}
+
+	if err := stream.Finish(); err != nil {
+		t.Logf("Finish() failed: %v", err)
+		return nil, nil, err
+	}
+	return output, nil, nil
+}
+
+func prepDirectory(t *testing.T, rootDir string) {
+	path, perm := filepath.Join(rootDir, impl.VersionFile), os.FileMode(0600)
+	if err := ioutil.WriteFile(path, []byte(impl.Version), perm); err != nil {
+		t.Fatalf(testutil.FormatLogLine(2, "WriteFile(%v, %v, %v) failed: %v", path, impl.Version, perm, err))
+	}
+}
+
+// testData creates up to 4MB of random bytes.
+func testData() []byte {
+	size := testutil.Rand.Intn(1000 * impl.BufferLength)
+	data := testutil.RandomBytes(size)
+	return data
+}
