// 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 (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"regexp"
	"strconv"
	"strings"
	"testing"
	"time"

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

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	stdout := sh.Cmd(binary, "glob", "__debug/*").Stdout()

	var want string
	for _, entry := range []string{"logs", "pprof", "stats", "vtrace"} {
		want += "__debug/" + entry + "\n"
	}
	if got := stdout; got != want {
		t.Fatalf("unexpected output, want %s, got %s", want, got)
	}
}

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

	// Create a temp file before we list the logs.
	fileName := filepath.Base(sh.MakeTempFile().Name())
	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	stdout := sh.Cmd(binary, "glob", "__debug/logs/*").Stdout()

	// The output should contain the filename.
	want := "/logs/" + fileName
	if !strings.Contains(stdout, want) {
		t.Fatalf("output should contain %s but did not\n%s", want, stdout)
	}
}

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

	path := "__debug/stats/system/hostname"
	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	stdout := sh.Cmd(binary, "stats", "read", path).Stdout()
	hostname, err := os.Hostname()
	if err != nil {
		t.Fatalf("Hostname() failed: %v", err)
	}
	if got, want := stdout, path+": "+hostname+"\n"; got != want {
		t.Fatalf("unexpected output, want %q, got %q", want, got)
	}
}

func createTestLogFile(t *testing.T, sh *v23test.Shell, content string) *os.File {
	file := sh.MakeTempFile()
	_, err := file.Write([]byte(content))
	if err != nil {
		t.Fatalf("Write failed: %v", err)
	}
	return file
}

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	testLogData := "This is a test log file"
	file := createTestLogFile(t, sh, testLogData)

	// Check to ensure the file size is accurate
	str := strings.TrimSpace(sh.Cmd(binary, "logs", "size", "__debug/logs/"+filepath.Base(file.Name())).Stdout())
	got, err := strconv.Atoi(str)
	if err != nil {
		t.Fatalf("Atoi(\"%q\") failed", str)
	}
	want := len(testLogData)
	if got != want {
		t.Fatalf("unexpected output, want %d, got %d", got, want)
	}
}

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	testLogData := "This is a test log file\n"
	file := createTestLogFile(t, sh, testLogData)
	logName := filepath.Base(file.Name())
	runCount := 12
	for c := 0; c < runCount; c++ {
		sh.Cmd(binary, "logs", "read", "__debug/logs/"+logName).Run()
	}

	readlogStatsEndpoint := "__debug/stats/rpc/server/routing-id/*/methods/ReadLog/latency-ms"
	got := sh.Cmd(binary, "stats", "read", readlogStatsEndpoint).Stdout()

	want := fmt.Sprintf("Count: %d", runCount)
	if !strings.Contains(got, want) {
		t.Fatalf("expected output %q to contain %q, but did not\n", got, want)
	}

	// Test "-json" format.
	jsonOutput := sh.Cmd(binary, "stats", "read", "-json", readlogStatsEndpoint).Stdout()
	var stats []struct {
		Name  string
		Value struct {
			Count int
		}
	}
	if err := json.Unmarshal([]byte(jsonOutput), &stats); err != nil {
		t.Fatalf("invalid json output:\n%s", jsonOutput)
	}
	if want, got := 1, len(stats); want != got {
		t.Fatalf("unexpected stats length, want %d, got %d", want, got)
	}
	if !strings.HasPrefix(stats[0].Name, "__debug/stats/rpc/server/routing-id") {
		t.Fatalf("unexpected Name field, want %q, got %q", want, got)
	}
	if want, got := runCount, stats[0].Value.Count; want != got {
		t.Fatalf("unexpected Value.Count field, want %d, got %d", want, got)
	}
}

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	testLogData := "This is a test log file\n"
	file := createTestLogFile(t, sh, testLogData)
	logName := filepath.Base(file.Name())
	sh.Cmd(binary, "logs", "read", "__debug/logs/"+logName).Run()

	cmd := sh.Cmd(binary, "stats", "watch", "-raw", "__debug/stats/rpc/server/routing-id/*/methods/ReadLog/latency-ms")
	stdoutPipe := cmd.StdoutPipe()
	cmd.Start()

	lineChan := make(chan string)
	// Go off and read the invocation's stdout.
	go func() {
		line, err := bufio.NewReader(stdoutPipe).ReadString('\n')
		if err != nil {
			t.Fatalf("Could not read line from invocation")
		}
		lineChan <- line
	}()

	// Wait up to 10 seconds for some stats output. Either some output
	// occurs or the timeout expires without any output.
	select {
	case <-time.After(10 * time.Second):
		t.Errorf("Timed out waiting for output")
	case got := <-lineChan:
		// Expect one ReadLog call to have occurred.
		want := "}}{Count: 1"
		if !strings.Contains(got, want) {
			t.Errorf("wanted but could not find %q in output\n%s", want, got)
		}
	}
}

func performTracedRead(sh *v23test.Shell, debugBinary, path string) string {
	return sh.Cmd(debugBinary, "--v23.vtrace.sample-rate=1", "logs", "read", path).Stdout()
}

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	logContent := "Hello, world!\n"
	logPath := "__debug/logs/" + filepath.Base(createTestLogFile(t, sh, logContent).Name())
	// Create a log file with tracing, read it and check that the resulting trace exists.
	got := performTracedRead(sh, binary, logPath)
	if logContent != got {
		t.Fatalf("unexpected output: want %s, got %s", logContent, got)
	}

	// Grab the ID of the first and only trace.
	traceContent, want := sh.Cmd(binary, "vtrace", "__debug/vtrace").Stdout(), 1
	if count := strings.Count(traceContent, "Trace -"); count != want {
		t.Fatalf("unexpected trace count, want %d, got %d: %s", want, count, traceContent)
	}
	fields := strings.Split(traceContent, " ")
	if len(fields) < 3 {
		t.Fatalf("expected at least 3 space-delimited fields, got %d: %v", len(fields), traceContent)
	}
	traceId := fields[2]

	// Do a sanity check on the trace ID: it should be a 32-character hex ID prefixed with 0x
	if match, _ := regexp.MatchString("0x[0-9a-f]{32}", traceId); !match {
		t.Fatalf("wanted a 32-character hex ID prefixed with 0x, got %s", traceId)
	}

	// Do another traced read, this will generate a new trace entry.
	performTracedRead(sh, binary, logPath)

	// Read vtrace, we should have 2 traces now.
	output, want := sh.Cmd(binary, "vtrace", "__debug/vtrace").Stdout(), 2
	if count := strings.Count(output, "Trace -"); count != want {
		t.Fatalf("unexpected trace count, want %d, got %d\n%s", want, count, output)
	}

	// Now ask for a particular trace. The output should contain exactly
	// one trace whose ID is equal to the one we asked for.
	got, want = sh.Cmd(binary, "vtrace", "__debug/vtrace", traceId).Stdout(), 1
	if count := strings.Count(got, "Trace -"); count != want {
		t.Fatalf("unexpected trace count, want %d, got %d\n%s", want, count, got)
	}
	fields = strings.Split(got, " ")
	if len(fields) < 3 {
		t.Fatalf("expected at least 3 space-delimited fields, got %d: %v", len(fields), got)
	}
	got = fields[2]
	if traceId != got {
		t.Fatalf("unexpected traceId, want %s, got %s", traceId, got)
	}
}

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

	binary := sh.BuildGoPkg("v.io/x/ref/services/debug/debug")
	stdout := sh.Cmd(binary, "pprof", "run", "__debug/pprof", "heap", "--text").Stdout()

	// Assert that a profile indicating the heap size was written out.
	want, got := "(.*) of (.*) total", stdout
	var groups []string
	if groups = regexp.MustCompile(want).FindStringSubmatch(got); len(groups) < 3 {
		t.Fatalf("could not find regexp %q in output\n%s", want, got)
	}
	t.Logf("got a heap profile showing a heap size of %s", groups[2])
}

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