blob: 120a48136a50ae22a6e210c9d9557abfc262b18f [file] [log] [blame]
package debug_test
import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"sort"
"strings"
"testing"
"time"
libstats "veyron.io/veyron/veyron/lib/stats"
"veyron.io/veyron/veyron/services/mgmt/debug"
"veyron.io/veyron/veyron2/naming"
"veyron.io/veyron/veyron2/rt"
"veyron.io/veyron/veyron2/services/mgmt/logreader"
"veyron.io/veyron/veyron2/services/mgmt/stats"
"veyron.io/veyron/veyron2/services/mounttable"
"veyron.io/veyron/veyron2/verror"
)
func TestDebugServer(t *testing.T) {
runtime := rt.Init()
workdir, err := ioutil.TempDir("", "logreadertest")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(workdir)
if err = ioutil.WriteFile(filepath.Join(workdir, "test.INFO"), []byte("test"), os.FileMode(0644)); err != nil {
t.Fatalf("ioutil.WriteFile failed: %v", err)
}
endpoint, stop, err := debug.StartDebugServer(runtime, "localhost:0", workdir, nil)
if err != nil {
t.Fatalf("StartDebugServer failed: %v", err)
}
defer stop()
// Access a logs directory that exists.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//logs"))
if err != nil {
t.Errorf("BindGlobbable: %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)
}
if len(results) != 1 || results[0] != "test.INFO" {
t.Errorf("unexpected result. Got %v, want 'test.INFO'", results)
}
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)
}
}
// Access a logs directory that doesn't exist.
{
ld, err := mounttable.BindGlobbable(naming.JoinAddressName(endpoint, "//logs/nowheretobefound"))
if err != nil {
t.Errorf("BindGlobbable: %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)
}
if len(results) != 0 {
t.Errorf("unexpected result. Got %v, want ''", results)
}
if expected, got := verror.NoExist, stream.Finish(); !verror.Is(got, expected) {
t.Errorf("unexpected error value, got %v, want: %v", got, expected)
}
}
// Access a log file that exists.
{
lf, err := logreader.BindLogFile(naming.JoinAddressName(endpoint, "//logs/test.INFO"))
if err != nil {
t.Errorf("BindLogFile: %v", err)
}
size, err := lf.Size(runtime.NewContext())
if err != nil {
t.Errorf("Size failed: %v", err)
}
if expected := int64(len("test")); size != expected {
t.Errorf("unexpected result. Got %v, want %v", size, expected)
}
}
// Access a log file that doesn't exist.
{
lf, err := logreader.BindLogFile(naming.JoinAddressName(endpoint, "//logs/nosuchfile.INFO"))
if err != nil {
t.Errorf("BindLogFile: %v", err)
}
_, err = lf.Size(runtime.NewContext())
if expected := verror.NoExist; !verror.Is(err, expected) {
t.Errorf("unexpected error value, got %v, want: %v", err, expected)
}
}
// Access a stats object that exists.
{
foo := libstats.NewInteger("testing/foo")
foo.Set(123)
st, err := stats.BindStats(naming.JoinAddressName(endpoint, "//stats/testing/foo"))
if err != nil {
t.Errorf("BindStats: %v", err)
}
v, err := st.Value(runtime.NewContext())
if err != nil {
t.Errorf("Value failed: %v", err)
}
if expected := int64(123); v != expected {
t.Errorf("unexpected result. Got %v, want %v", v, expected)
}
}
// Access a stats object that doesn't exists.
{
st, err := stats.BindStats(naming.JoinAddressName(endpoint, "//stats/testing/nobodyhome"))
if err != nil {
t.Errorf("BindStats: %v", err)
}
_, err = st.Value(runtime.NewContext())
if expected := verror.NoExist; !verror.Is(err, expected) {
t.Errorf("unexpected error value, got %v, want: %v", err, expected)
}
}
// Glob from the root.
{
ns := rt.R().Namespace()
ns.SetRoots(naming.JoinAddressName(endpoint, "//"))
ctx, cancel := rt.R().NewContext().WithTimeout(10 * time.Second)
defer cancel()
c, err := ns.Glob(ctx, "logs/...")
if err != nil {
t.Errorf("ns.Glob failed: %v", err)
}
results := []string{}
for res := range c {
results = append(results, res.Name)
}
sort.Strings(results)
expected := []string{
"logs",
"logs/test.INFO",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
c, err = ns.Glob(ctx, "stats/testing/*")
if err != nil {
t.Errorf("ns.Glob failed: %v", err)
}
results = []string{}
for res := range c {
results = append(results, res.Name)
}
sort.Strings(results)
expected = []string{
"stats/testing/foo",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
c, err = ns.Glob(ctx, "*")
if err != nil {
t.Errorf("ns.Glob failed: %v", err)
}
results = []string{}
for res := range c {
results = append(results, res.Name)
}
sort.Strings(results)
expected = []string{
"logs",
"pprof",
"stats",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
c, err = ns.Glob(ctx, "...")
if err != nil {
t.Errorf("ns.Glob failed: %v", err)
}
results = []string{}
for res := range c {
if strings.HasPrefix(res.Name, "stats/") && !strings.HasPrefix(res.Name, "stats/testing/") {
// Skip any non-testing stats.
continue
}
results = append(results, res.Name)
}
sort.Strings(results)
expected = []string{
"",
"logs",
"logs/test.INFO",
"pprof",
"stats",
"stats/testing/foo",
}
if !reflect.DeepEqual(expected, results) {
t.Errorf("unexpected result. Got %v, want %v", results, expected)
}
}
}