blob: 8bd99a327254d78c751657d039e09896247e446d [file] [log] [blame]
package impl_test
import (
"io/ioutil"
"os"
"path"
"reflect"
"sort"
"testing"
"veyron.io/veyron/veyron/services/mgmt/logreader/impl"
"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/mounttable"
"veyron.io/veyron/veyron2/verror"
)
type logDirectoryDispatcher struct {
root string
}
func (d *logDirectoryDispatcher) Lookup(suffix, _ string) (ipc.Invoker, security.Authorizer, error) {
return impl.NewLogDirectoryInvoker(d.root, suffix), nil, nil
}
func TestLogDirectory(t *testing.T) {
runtime := rt.Init()
workdir, err := ioutil.TempDir("", "logreadertest")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(workdir)
server, endpoint, err := startServer(t, &logDirectoryDispatcher{workdir})
if err != nil {
t.Fatalf("startServer failed: %v", err)
}
defer stopServer(t, server)
if err := os.Mkdir(path.Join(workdir, "subdir"), os.FileMode(0755)); err != nil {
t.Fatalf("os.Mkdir failed: %v", err)
}
tests := []string{
"foo.txt",
"bar.txt",
"subdir/foo2.txt",
"subdir/bar2.txt",
}
for _, s := range tests {
if err := ioutil.WriteFile(path.Join(workdir, s), []byte(s), os.FileMode(0644)); err != nil {
t.Fatalf("ioutil.WriteFile failed: %v", err)
}
}
// Try to access a directory that doesn't exist.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//doesntexist"))
if err != nil {
t.Errorf("BindLogDirectory: %v", err)
}
stream, err := ld.Glob(runtime.NewContext(), "*")
if err != nil {
t.Errorf("unexpected error, got %v, want: nil", err)
}
if err := stream.Finish(); err != nil {
if expected := verror.NoExist; !verror.Is(err, expected) {
t.Errorf("unexpected error value, got %v, want: %v", err, expected)
}
}
}
// Try to access a directory that does exist.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//"))
if err != nil {
t.Errorf("BindLogDirectory: %v", err)
}
stream, err := ld.Glob(runtime.NewContext(), "...")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results := []string{}
expected := []string{"", "subdir"}
expected = append(expected, tests...)
iterator := stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(expected)
sort.Strings(results)
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
stream, err = ld.Glob(runtime.NewContext(), "*")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results = []string{}
iterator = stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(results)
expected = []string{
"bar.txt",
"foo.txt",
"subdir",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
stream, err = ld.Glob(runtime.NewContext(), "subdir/*")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results = []string{}
iterator = stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(results)
expected = []string{
"subdir/bar2.txt",
"subdir/foo2.txt",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
}
// Try to access a sub-directory.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//subdir"))
if err != nil {
t.Errorf("BindLogDirectory: %v", err)
}
stream, err := ld.Glob(runtime.NewContext(), "*")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results := []string{}
iterator := stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(results)
expected := []string{
"bar2.txt",
"foo2.txt",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
}
// Try to access a file.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//foo.txt"))
if err != nil {
t.Errorf("BindLogDirectory: %v", err)
}
stream, err := ld.Glob(runtime.NewContext(), "*")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results := []string{}
iterator := stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(results)
expected := []string{}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
stream, err = ld.Glob(runtime.NewContext(), "")
if err != nil {
t.Errorf("Glob failed: %v", err)
}
results = []string{}
iterator = stream.RecvStream()
for count := 0; iterator.Advance(); count++ {
results = append(results, iterator.Value().Name)
}
sort.Strings(results)
expected = []string{""}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %#v, want %#v", results, expected)
}
if err := iterator.Err(); err != nil {
t.Errorf("unexpected stream error: %v", iterator.Err())
}
if err := stream.Finish(); err != nil {
t.Errorf("Finish failed: %v", err)
}
}
}