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

//go:generate jiri test generate .

import (
	"bytes"
	"io/ioutil"
	"path/filepath"

	"v.io/x/ref"
	"v.io/x/ref/test/v23tests"
)

func V23TestTunneld(t *v23tests.T) {
	v23tests.RunRootMT(t, "--v23.tcp.address=127.0.0.1:0")

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

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

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

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

	// Send input to remote command.
	want := "HELLO SERVER"
	if got := vsh.WithStdin(bytes.NewBufferString(want)).Start(tunnelEndpoint, "cat").Output(); want != got {
		t.Fatalf("unexpected output, got %s, want %s", got, want)
	}

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

	// TODO(sjr): instead of using Output() here, we'd really rather do
	// WaitOrDie(os.Stdout, os.Stderr). There is currently a race caused by
	// WithStdin that makes this flaky.
	vsh.WithStdin(bytes.NewBufferString(want)).Start(tunnelEndpoint, "cat > "+outPath).Output()
	if got, err := ioutil.ReadFile(outPath); err != nil || string(got) != want {
		if err != nil {
			t.Fatalf("ReadFile(%v) failed: %v", outPath, err)
		} else {
			t.Fatalf("unexpected output, got %s, want %s", got, want)
		}
	}

	// Verify that all published names are there.
	root, _ := t.GetVar(ref.EnvNamespacePrefix)
	inv := mounttableBin.Start("glob", root, "tunnel/test")

	// Expect one entry: the tunnel name.
	matches := inv.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)
	}
}
