veyron/services/mgmt/binary/impl: restructuring test code
Prior to implementing ACLs for binaryd, moved the binaryd unit tests
into their own package and isolated functions that could be reused in
implementing the tests for ACL support.
Change-Id: Ib3b3c7903c6c6be6bcbef8d080b5163a8a84e2ca
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
+}