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/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()
}
}