// Copyright 2011 The Go 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 build import ( "exec" "path/filepath" "reflect" "runtime" "sort" "testing" ) func sortstr(x []string) []string { sort.Strings(x) return x } var buildPkgs = []struct { dir string info *DirInfo }{ { "go/build/pkgtest", &DirInfo{ GoFiles: []string{"pkgtest.go"}, SFiles: []string{"sqrt_" + runtime.GOARCH + ".s"}, PkgName: "pkgtest", Imports: []string{"os"}, TestImports: []string{"fmt", "pkgtest"}, TestGoFiles: sortstr([]string{"sqrt_test.go", "sqrt_" + runtime.GOARCH + "_test.go"}), XTestGoFiles: []string{"xsqrt_test.go"}, }, }, { "go/build/cmdtest", &DirInfo{ GoFiles: []string{"main.go"}, PkgName: "main", Imports: []string{"go/build/pkgtest"}, }, }, { "go/build/cgotest", &DirInfo{ CgoFiles: []string{"cgotest.go"}, CFiles: []string{"cgotest.c"}, Imports: []string{"C", "unsafe"}, PkgName: "cgotest", }, }, } const cmdtestOutput = "3" func TestBuild(t *testing.T) { for _, tt := range buildPkgs { tree := Path[0] // Goroot dir := filepath.Join(tree.SrcDir(), tt.dir) info, err := ScanDir(dir, true) if err != nil { t.Errorf("ScanDir(%#q): %v", tt.dir, err) continue } if !reflect.DeepEqual(info, tt.info) { t.Errorf("ScanDir(%#q) = %#v, want %#v\n", tt.dir, info, tt.info) continue } s, err := Build(tree, tt.dir, info) if err != nil { t.Errorf("Build(%#q): %v", tt.dir, err) continue } if err := s.Run(); err != nil { t.Errorf("Run(%#q): %v", tt.dir, err) continue } if tt.dir == "go/build/cmdtest" { bin := s.Output[0] b, err := exec.Command(bin).CombinedOutput() if err != nil { t.Errorf("exec %s: %v", bin, err) continue } if string(b) != cmdtestOutput { t.Errorf("cmdtest output: %s want: %s", b, cmdtestOutput) } } // Deferred because cmdtest depends on pkgtest. defer func(s *Script) { if err := s.Nuke(); err != nil { t.Errorf("nuking: %v", err) } }(s) } }