// 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

import (
	"fmt"
	"testing"
	"time"

	"v.io/x/ref/runtime/internal/rpc/proxy"
	"v.io/x/ref/runtime/internal/rpc/stream/manager"
	tnaming "v.io/x/ref/runtime/internal/testing/mocks/naming"
	"v.io/x/ref/test/testutil"

	"v.io/v23"
	"v.io/v23/naming"
	"v.io/v23/rpc"
)

func TestProxyRPCX(t *testing.T) {
	ctx, shutdown := initForTest()
	defer shutdown()

	p := testutil.NewPrincipal("test")
	ctx, err := v23.WithPrincipal(ctx, p)
	if err != nil {
		t.Fatal(err)
	}
	srid := naming.FixedRoutingID(0x5555)
	crid := naming.FixedRoutingID(0x4444)
	prid := naming.FixedRoutingID(0x6666)
	sm := manager.XInternalNew(ctx, srid)
	cm := manager.XInternalNew(ctx, crid)
	ns := tnaming.NewSimpleNamespace()

	client, err := XInternalNewClient(cm, ns)
	if err != nil {
		t.Fatal(err)
	}

	server, err := XInternalNewServer(ctx, sm, ns, nil, "", client, p)
	if err != nil {
		t.Fatal(err)
	}

	_, sd, pep, err := proxy.New("tcp", "127.0.0.1:0", prid, ctx, p)
	if err != nil {
		t.Fatal(err)
	}
	defer sd()
	fmt.Printf("proxy ep: %v\n", pep)

	spec := rpc.ListenSpec{Proxy: pep.Name()}
	// the endpoint to the proxy wont be returned here because connecting to the
	// proxy happens asynchronously.
	_, err = server.Listen(spec)
	if err != nil {
		t.Fatal(err)
	}
	if err := server.Serve("", &testServer{}, nil); err != nil {
		t.Fatal(err)
	}

	var proxies []rpc.ProxyStatus
	for len(proxies) == 0 {
		time.Sleep(100 * time.Millisecond)
		t.Log("checking for proxies")
		proxies = server.Status().Proxies
	}
	ep := proxies[0].Endpoint

	var got string
	if err := client.Call(ctx, ep.Name(), "Echo", []interface{}{"arg"}, []interface{}{&got}); err != nil {
		t.Fatal(err)
	}
	if want := fmt.Sprintf("method:%q,suffix:%q,arg:%q", "Echo", "", "arg"); got != want {
		t.Errorf("got %v, want %v", got, want)
	}
}
