blob: 68bae886e2bde76dfd3061b113615dbcc58a9a2a [file] [log] [blame]
package integration_test
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"veyron.io/veyron/veyron/lib/modules"
"veyron.io/veyron/veyron/lib/testutil/integration"
"veyron.io/veyron/veyron/lib/testutil/security"
_ "veyron.io/veyron/veyron/profiles"
)
var binPkgs = []string{
"veyron.io/veyron/veyron/services/mgmt/build/buildd",
"veyron.io/veyron/veyron/tools/build",
}
var testProgram = `package main
import "fmt"
func main() { fmt.Println("Hello World!") }
`
func goRoot(bin string) (string, error) {
var out bytes.Buffer
cmd := exec.Command(bin, "env", "GOROOT")
cmd.Stdout = &out
cmd.Stderr = &out
if err := cmd.Run(); err != nil {
return "", fmt.Errorf("%q failed: %v\n%v", strings.Join(cmd.Args, " "), err, out.String())
}
cleanOut := strings.TrimSpace(out.String())
if cleanOut == "" {
return "", fmt.Errorf("%v does not set GOROOT", bin)
}
return cleanOut, nil
}
func TestHelperProcess(t *testing.T) {
modules.DispatchInTest()
}
func TestBuildServerIntegration(t *testing.T) {
// Build the required binaries.
binDir, cleanup, err := integration.BuildPkgs(binPkgs)
if err != nil {
t.Fatalf("%v", err)
}
defer cleanup()
// Start a root mount table.
shell, err := modules.NewShell(nil)
if err != nil {
t.Fatalf("NewShell() failed: %v", err)
}
defer shell.Cleanup(os.Stdin, os.Stderr)
handle, mtName, err := integration.StartRootMT(shell)
if err != nil {
t.Fatalf("%v", err)
}
defer handle.CloseStdin()
// Generate credentials.
serverCred, serverPrin := security.NewCredentials("server")
defer os.RemoveAll(serverCred)
clientCred, _ := security.ForkCredentials(serverPrin, "client")
defer os.RemoveAll(clientCred)
// Start the build server.
buildServerBin := filepath.Join(binDir, "buildd")
buildServerName := "test-build-server"
goBin, err := exec.LookPath("go")
if err != nil {
t.Fatalf("%v", err)
}
goRoot, err := goRoot(goBin)
if err != nil {
t.Fatalf("%v", err)
}
args := []string{
"-name=" + buildServerName, "-gobin=" + goBin, "-goroot=" + goRoot,
"-veyron.tcp.address=127.0.0.1:0",
"-veyron.credentials=" + serverCred,
"-veyron.namespace.root=" + mtName,
}
serverProcess, err := integration.StartServer(buildServerBin, args)
if err != nil {
t.Fatalf("%v", err)
}
defer serverProcess.Kill()
// Create and build a test source file.
testGoPath, err := ioutil.TempDir("", "")
if err != nil {
t.Fatalf("TempDir() failed: %v", err)
}
defer os.RemoveAll(testGoPath)
testBinDir := filepath.Join(testGoPath, "bin")
if err := os.MkdirAll(testBinDir, os.FileMode(0700)); err != nil {
t.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 {
t.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 {
t.Fatalf("WriteFile(%v) failed: %v", testSrcFile, err)
}
var buildOut bytes.Buffer
buildArgs := []string{
"-veyron.credentials=" + clientCred,
"-veyron.namespace.root=" + mtName,
"build", buildServerName, "test",
}
buildCmd := exec.Command(filepath.Join(binDir, "build"), buildArgs...)
buildCmd.Stdout = &buildOut
buildCmd.Stderr = &buildOut
buildCmd.Env = append(buildCmd.Env, "GOPATH="+testGoPath, "GOROOT="+goRoot, "TMPDIR="+testBinDir)
if err := buildCmd.Run(); err != nil {
t.Fatalf("%q failed: %v\n%v", strings.Join(buildCmd.Args, " "), err, buildOut.String())
}
var testOut bytes.Buffer
testCmd := exec.Command(testBinFile)
testCmd.Stdout = &testOut
testCmd.Stderr = &testOut
if err := testCmd.Run(); err != nil {
t.Fatalf("%q failed: %v\n%v", strings.Join(testCmd.Args, " "), err, testOut.String())
}
if got, want := strings.TrimSpace(testOut.String()), "Hello World!"; got != want {
t.Fatalf("unexpected output: got %v, want %v", got, want)
}
}