// 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 (
	"bytes"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"
	"strings"

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

//go:generate v23 test generate

var testProgram = `package main

import "fmt"

func main() { fmt.Println("Hello World!") }
`

func V23TestBuildServerIntegration(i *v23tests.T) {
	goBin, err := exec.LookPath("go")
	if err != nil {
		i.Fatalf("%v", err)
	}
	goRoot := runtime.GOROOT()

	v23tests.RunRootMT(i, "--v23.tcp.address=127.0.0.1:0")

	// Build binaries for the client and server.
	// Since Permissions are not setup on the server, the client must pass the
	// default authorization policy, i.e., must be a "delegate" of the server.
	var (
		buildServerBin = binaryWithCredentials(i, "buildd", "v.io/x/ref/services/build/buildd")
		buildBin       = binaryWithCredentials(i, "buildd/client", "v.io/x/ref/services/build/build")
	)

	// Start the build server.
	buildServerName := "test-build-server"
	buildServerBin.Start(
		"-name="+buildServerName,
		"-gobin="+goBin,
		"-goroot="+goRoot,
		"-v23.tcp.address=127.0.0.1:0")

	// Create and build a test source file.
	testGoPath := i.NewTempDir("")
	testBinDir := filepath.Join(testGoPath, "bin")
	if err := os.MkdirAll(testBinDir, os.FileMode(0700)); err != nil {
		i.Fatalf("MkdirAll(%v) failed: %v", testBinDir, err)
	}
	testBinFile := filepath.Join(testBinDir, "test")
	testSrcDir := filepath.Join(testGoPath, "src", "test")
	if err := os.MkdirAll(testSrcDir, os.FileMode(0700)); err != nil {
		i.Fatalf("MkdirAll(%v) failed: %v", testSrcDir, err)
	}
	testSrcFile := filepath.Join(testSrcDir, "test.go")
	if err := ioutil.WriteFile(testSrcFile, []byte(testProgram), os.FileMode(0600)); err != nil {
		i.Fatalf("WriteFile(%v) failed: %v", testSrcFile, err)
	}
	buildBin.WithEnv(
		"GOPATH="+testGoPath,
		"GOROOT="+goRoot,
		"TMPDIR="+testBinDir).Start(
		"build",
		buildServerName,
		"test").WaitOrDie(os.Stdout, os.Stderr)
	var testOut bytes.Buffer
	testCmd := exec.Command(testBinFile)
	testCmd.Stdout = &testOut
	testCmd.Stderr = &testOut
	if err := testCmd.Run(); err != nil {
		i.Fatalf("%q failed: %v\n%v", strings.Join(testCmd.Args, " "), err, testOut.String())
	}
	if got, want := strings.TrimSpace(testOut.String()), "Hello World!"; got != want {
		i.Fatalf("unexpected output: got %v, want %v", got, want)
	}
}

func binaryWithCredentials(i *v23tests.T, extension, pkgpath string) *v23tests.Binary {
	creds, err := i.Shell().NewChildCredentials(extension)
	if err != nil {
		i.Fatalf("NewCustomCredentials (for %q) failed: %v", pkgpath, err)
	}
	b := i.BuildV23Pkg(pkgpath)
	return b.WithStartOpts(b.StartOpts().WithCustomCredentials(creds))
}
