blob: 68bae886e2bde76dfd3061b113615dbcc58a9a2a [file] [log] [blame]
Jiri Simsae63e07d2014-12-04 11:12:08 -08001package integration_test
2
3import (
4 "bytes"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "os/exec"
9 "path/filepath"
10 "strings"
11 "testing"
12
13 "veyron.io/veyron/veyron/lib/modules"
14 "veyron.io/veyron/veyron/lib/testutil/integration"
15 "veyron.io/veyron/veyron/lib/testutil/security"
16 _ "veyron.io/veyron/veyron/profiles"
Jiri Simsae63e07d2014-12-04 11:12:08 -080017)
18
Jiri Simsae63e07d2014-12-04 11:12:08 -080019var binPkgs = []string{
20 "veyron.io/veyron/veyron/services/mgmt/build/buildd",
21 "veyron.io/veyron/veyron/tools/build",
22}
23
24var testProgram = `package main
25
26import "fmt"
27
28func main() { fmt.Println("Hello World!") }
29`
30
31func goRoot(bin string) (string, error) {
32 var out bytes.Buffer
33 cmd := exec.Command(bin, "env", "GOROOT")
34 cmd.Stdout = &out
35 cmd.Stderr = &out
36 if err := cmd.Run(); err != nil {
37 return "", fmt.Errorf("%q failed: %v\n%v", strings.Join(cmd.Args, " "), err, out.String())
38 }
39 cleanOut := strings.TrimSpace(out.String())
40 if cleanOut == "" {
41 return "", fmt.Errorf("%v does not set GOROOT", bin)
42 }
43 return cleanOut, nil
44}
45
46func TestHelperProcess(t *testing.T) {
47 modules.DispatchInTest()
48}
49
Jiri Simsa432cc2e2014-12-08 15:53:38 -080050func TestBuildServerIntegration(t *testing.T) {
Jiri Simsae63e07d2014-12-04 11:12:08 -080051 // Build the required binaries.
52 binDir, cleanup, err := integration.BuildPkgs(binPkgs)
53 if err != nil {
54 t.Fatalf("%v", err)
55 }
56 defer cleanup()
57
58 // Start a root mount table.
59 shell, err := modules.NewShell(nil)
60 if err != nil {
61 t.Fatalf("NewShell() failed: %v", err)
62 }
63 defer shell.Cleanup(os.Stdin, os.Stderr)
64 handle, mtName, err := integration.StartRootMT(shell)
65 if err != nil {
66 t.Fatalf("%v", err)
67 }
68 defer handle.CloseStdin()
69
70 // Generate credentials.
Ankur77cd9e82014-12-15 12:59:59 -080071 serverCred, serverPrin := security.NewCredentials("server")
Ankurd8762692014-12-12 10:50:12 -080072 defer os.RemoveAll(serverCred)
Ankur77cd9e82014-12-15 12:59:59 -080073 clientCred, _ := security.ForkCredentials(serverPrin, "client")
Ankurd8762692014-12-12 10:50:12 -080074 defer os.RemoveAll(clientCred)
Jiri Simsae63e07d2014-12-04 11:12:08 -080075
76 // Start the build server.
77 buildServerBin := filepath.Join(binDir, "buildd")
78 buildServerName := "test-build-server"
79 goBin, err := exec.LookPath("go")
80 if err != nil {
81 t.Fatalf("%v", err)
82 }
83 goRoot, err := goRoot(goBin)
84 if err != nil {
85 t.Fatalf("%v", err)
86 }
87 args := []string{
88 "-name=" + buildServerName, "-gobin=" + goBin, "-goroot=" + goRoot,
89 "-veyron.tcp.address=127.0.0.1:0",
Ankurd8762692014-12-12 10:50:12 -080090 "-veyron.credentials=" + serverCred,
Jiri Simsae63e07d2014-12-04 11:12:08 -080091 "-veyron.namespace.root=" + mtName,
92 }
93 serverProcess, err := integration.StartServer(buildServerBin, args)
94 if err != nil {
95 t.Fatalf("%v", err)
96 }
97 defer serverProcess.Kill()
98
99 // Create and build a test source file.
100 testGoPath, err := ioutil.TempDir("", "")
101 if err != nil {
102 t.Fatalf("TempDir() failed: %v", err)
103 }
104 defer os.RemoveAll(testGoPath)
105 testBinDir := filepath.Join(testGoPath, "bin")
106 if err := os.MkdirAll(testBinDir, os.FileMode(0700)); err != nil {
107 t.Fatalf("MkdirAll(%v) failed: %v", testBinDir, err)
108 }
109 testBinFile := filepath.Join(testBinDir, "test")
110 testSrcDir := filepath.Join(testGoPath, "src", "test")
111 if err := os.MkdirAll(testSrcDir, os.FileMode(0700)); err != nil {
112 t.Fatalf("MkdirAll(%v) failed: %v", testSrcDir, err)
113 }
114 testSrcFile := filepath.Join(testSrcDir, "test.go")
115 if err := ioutil.WriteFile(testSrcFile, []byte(testProgram), os.FileMode(0600)); err != nil {
116 t.Fatalf("WriteFile(%v) failed: %v", testSrcFile, err)
117 }
118 var buildOut bytes.Buffer
119 buildArgs := []string{
Ankurd8762692014-12-12 10:50:12 -0800120 "-veyron.credentials=" + clientCred,
Jiri Simsae63e07d2014-12-04 11:12:08 -0800121 "-veyron.namespace.root=" + mtName,
122 "build", buildServerName, "test",
123 }
124 buildCmd := exec.Command(filepath.Join(binDir, "build"), buildArgs...)
125 buildCmd.Stdout = &buildOut
126 buildCmd.Stderr = &buildOut
127 buildCmd.Env = append(buildCmd.Env, "GOPATH="+testGoPath, "GOROOT="+goRoot, "TMPDIR="+testBinDir)
128 if err := buildCmd.Run(); err != nil {
129 t.Fatalf("%q failed: %v\n%v", strings.Join(buildCmd.Args, " "), err, buildOut.String())
130 }
131 var testOut bytes.Buffer
132 testCmd := exec.Command(testBinFile)
133 testCmd.Stdout = &testOut
134 testCmd.Stderr = &testOut
135 if err := testCmd.Run(); err != nil {
136 t.Fatalf("%q failed: %v\n%v", strings.Join(testCmd.Args, " "), err, testOut.String())
137 }
138 if got, want := strings.TrimSpace(testOut.String()), "Hello World!"; got != want {
139 t.Fatalf("unexpected output: got %v, want %v", got, want)
140 }
141}