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

import (
	"io/ioutil"
	"os"
	"path/filepath"
	"testing"

	"v.io/x/ref"
	"v.io/x/ref/lib/v23test"
)

func TestV23Tunneld(t *testing.T) {
	v23test.SkipUnlessRunningIntegrationTests(t)
	sh := v23test.NewShell(t, v23test.Opts{})
	defer sh.Cleanup()
	sh.StartRootMountTable()

	tunneldBin := sh.BuildGoPkg("v.io/x/ref/examples/tunnel/tunneld")
	vsh := sh.BuildGoPkg("v.io/x/ref/examples/tunnel/vsh")
	mounttableBin := sh.BuildGoPkg("v.io/x/ref/cmd/mounttable")

	// Start tunneld with a known endpoint.
	cmd := sh.Cmd(tunneldBin, "--v23.tcp.address=127.0.0.1:0", "--name=tunnel/test")
	cmd.Start()
	tunnelEndpoint := cmd.S.ExpectVar("NAME")

	// Run remote command with the endpoint.
	if want, got := "HELLO ENDPOINT\n", sh.Cmd(vsh, tunnelEndpoint, "echo", "HELLO", "ENDPOINT").Stdout(); want != got {
		t.Fatalf("unexpected output, got %s, want %s", got, want)
	}

	if want, got := "HELLO NAME\n", sh.Cmd(vsh, "tunnel/test", "echo", "HELLO", "NAME").Stdout(); want != got {
		t.Fatalf("unexpected output, got %s, want %s", got, want)
	}

	// Send input to remote command.
	want := "HELLO SERVER"
	cmd = sh.Cmd(vsh, tunnelEndpoint, "cat")
	cmd.Stdin = want
	if got := cmd.Stdout(); want != got {
		t.Fatalf("unexpected output, got %s, want %s", got, want)
	}

	// And again with a file redirection this time.
	outDir := sh.MakeTempDir()
	outPath := filepath.Join(outDir, "hello.txt")

	cmd = sh.Cmd(vsh, tunnelEndpoint, "cat > "+outPath)
	cmd.Stdin = want
	cmd.Run()
	if got, err := ioutil.ReadFile(outPath); err != nil {
		t.Fatalf("ReadFile(%v) failed: %v", outPath, err)
	} else if string(got) != want {
		t.Fatalf("unexpected output, got %s, want %s", string(got), want)
	}

	// Verify that all published names are there.
	root := sh.Vars[ref.EnvNamespacePrefix]

	cmd = sh.Cmd(mounttableBin, "glob", root, "tunnel/test")
	cmd.Start()

	// Expect one entry: the tunnel name.
	matches := cmd.S.ExpectSetEventuallyRE("tunnel/test" + " (.*) \\(Deadline .*\\)")

	// The full endpoint should be the one we saw originally.
	if got, want := matches[0][1], tunnelEndpoint; "/"+got != want {
		t.Fatalf("expected tunnel endpoint %s to be %s, but it was not", got, want)
	}
}

func TestMain(m *testing.M) {
	os.Exit(v23test.Run(m.Run))
}
