ref: Change "profiles" directory to "runtime"

As per vanadium/issues#470

MultiPart: 4/10

Change-Id: I3ac47c1d9c514f7bbe1c80507c2b3db7fcd9f6d4
diff --git a/runtime/internal/rpc/resolve_test.go b/runtime/internal/rpc/resolve_test.go
new file mode 100644
index 0000000..73ace16
--- /dev/null
+++ b/runtime/internal/rpc/resolve_test.go
@@ -0,0 +1,162 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package rpc_test
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"os"
+	"testing"
+	"time"
+
+	"v.io/v23"
+	"v.io/v23/context"
+	"v.io/v23/naming"
+	"v.io/v23/options"
+	"v.io/v23/rpc"
+
+	"v.io/x/ref/lib/flags"
+	"v.io/x/ref/runtime/factories/fake"
+	"v.io/x/ref/runtime/internal"
+	"v.io/x/ref/runtime/internal/lib/appcycle"
+	inaming "v.io/x/ref/runtime/internal/naming"
+	irpc "v.io/x/ref/runtime/internal/rpc"
+	grt "v.io/x/ref/runtime/internal/rt"
+	"v.io/x/ref/services/mounttable/mounttablelib"
+	"v.io/x/ref/test/expect"
+	"v.io/x/ref/test/modules"
+)
+
+var commonFlags *flags.Flags
+
+func init() {
+	commonFlags = flags.CreateAndRegister(flag.CommandLine, flags.Runtime)
+	if err := internal.ParseFlags(commonFlags); err != nil {
+		panic(err)
+	}
+}
+
+func setupRuntime() {
+	ac := appcycle.New()
+
+	listenSpec := rpc.ListenSpec{Addrs: rpc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
+
+	rootctx, rootcancel := context.RootContext()
+	ctx, cancel := context.WithCancel(rootctx)
+	runtime, ctx, sd, err := grt.Init(ctx,
+		ac,
+		nil,
+		&listenSpec,
+		nil,
+		"",
+		commonFlags.RuntimeFlags(),
+		nil)
+	if err != nil {
+		panic(err)
+	}
+	shutdown := func() {
+		ac.Shutdown()
+		cancel()
+		sd()
+		rootcancel()
+	}
+	fake.InjectRuntime(runtime, ctx, shutdown)
+}
+
+func rootMountTable(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
+	setupRuntime()
+	ctx, shutdown := v23.Init()
+	defer shutdown()
+
+	lspec := v23.GetListenSpec(ctx)
+	server, err := v23.NewServer(ctx, options.ServesMountTable(true))
+	if err != nil {
+		return fmt.Errorf("root failed: %v", err)
+	}
+	mp := ""
+	mt, err := mounttablelib.NewMountTableDispatcher("", "", "mounttable")
+	if err != nil {
+		return fmt.Errorf("mounttablelib.NewMountTableDispatcher failed: %s", err)
+	}
+	eps, err := server.Listen(lspec)
+	if err != nil {
+		return fmt.Errorf("server.Listen failed: %s", err)
+	}
+	if err := server.ServeDispatcher(mp, mt); err != nil {
+		return fmt.Errorf("root failed: %s", err)
+	}
+	fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+	for _, ep := range eps {
+		fmt.Fprintf(stdout, "MT_NAME=%s\n", ep.Name())
+	}
+	modules.WaitForEOF(stdin)
+	return nil
+}
+
+func startMT(t *testing.T, sh *modules.Shell) string {
+	h, err := sh.Start("rootMountTable", nil)
+	if err != nil {
+		t.Fatalf("unexpected error for root mt: %s", err)
+	}
+	s := expect.NewSession(t, h.Stdout(), time.Minute)
+	s.ExpectVar("PID")
+	return s.ExpectVar("MT_NAME")
+}
+
+func TestResolveToEndpoint(t *testing.T) {
+	setupRuntime()
+	ctx, shutdown := v23.Init()
+	defer shutdown()
+	sh, err := modules.NewShell(ctx, nil, testing.Verbose(), t)
+	if err != nil {
+		t.Fatalf("modules.NewShell failed: %s", err)
+	}
+	defer sh.Cleanup(nil, nil)
+	root := startMT(t, sh)
+
+	ns := v23.GetNamespace(ctx)
+	ns.SetRoots(root)
+
+	proxyEp, _ := inaming.NewEndpoint("proxy.v.io:123")
+	proxyEpStr := proxyEp.String()
+	proxyAddr := naming.JoinAddressName(proxyEpStr, "")
+	if err := ns.Mount(ctx, "proxy", proxyAddr, time.Hour); err != nil {
+		t.Fatalf("ns.Mount failed: %s", err)
+	}
+
+	server, err := v23.NewServer(ctx)
+	if err != nil {
+		t.Fatalf("runtime.NewServer failed: %s", err)
+	}
+
+	notfound := fmt.Errorf("not found")
+	testcases := []struct {
+		address string
+		result  string
+		err     error
+	}{
+		{"/proxy.v.io:123", proxyEpStr, nil},
+		{"proxy.v.io:123", "", notfound},
+		{"proxy", proxyEpStr, nil},
+		{naming.JoinAddressName(root, "proxy"), proxyEpStr, nil},
+		{proxyAddr, proxyEpStr, nil},
+		{proxyEpStr, "", notfound},
+		{"unknown", "", notfound},
+	}
+	for _, tc := range testcases {
+		result, err := irpc.InternalServerResolveToEndpoint(server, tc.address)
+		if (err == nil) != (tc.err == nil) {
+			t.Errorf("Unexpected err for %q. Got %v, expected %v", tc.address, err, tc.err)
+		}
+		if result != tc.result {
+			t.Errorf("Unexpected result for %q. Got %q, expected %q", tc.address, result, tc.result)
+		}
+	}
+	if t.Failed() {
+		t.Logf("proxyEpStr: %v", proxyEpStr)
+		t.Logf("proxyAddr: %v", proxyAddr)
+	}
+}