github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/cmd/go/internal/work/build_test.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package work
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"io/ioutil"
    11  	"os"
    12  	"path/filepath"
    13  	"reflect"
    14  	"runtime"
    15  	"strings"
    16  	"testing"
    17  
    18  	"cmd/go/internal/base"
    19  	"cmd/go/internal/cfg"
    20  	"cmd/go/internal/load"
    21  )
    22  
    23  func TestRemoveDevNull(t *testing.T) {
    24  	fi, err := os.Lstat(os.DevNull)
    25  	if err != nil {
    26  		t.Skip(err)
    27  	}
    28  	if fi.Mode().IsRegular() {
    29  		t.Errorf("Lstat(%s).Mode().IsRegular() = true; expected false", os.DevNull)
    30  	}
    31  	mayberemovefile(os.DevNull)
    32  	_, err = os.Lstat(os.DevNull)
    33  	if err != nil {
    34  		t.Errorf("mayberemovefile(%s) did remove it; oops", os.DevNull)
    35  	}
    36  }
    37  
    38  func TestSplitPkgConfigOutput(t *testing.T) {
    39  	for _, test := range []struct {
    40  		in   []byte
    41  		want []string
    42  	}{
    43  		{[]byte(`-r:foo -L/usr/white\ space/lib -lfoo\ bar -lbar\ baz`), []string{"-r:foo", "-L/usr/white space/lib", "-lfoo bar", "-lbar baz"}},
    44  		{[]byte(`-lextra\ fun\ arg\\`), []string{`-lextra fun arg\`}},
    45  		{[]byte(`broken flag\`), []string{"broken", "flag"}},
    46  		{[]byte("\textra     whitespace\r\n"), []string{"extra", "whitespace"}},
    47  		{[]byte("     \r\n      "), nil},
    48  	} {
    49  		got := splitPkgConfigOutput(test.in)
    50  		if !reflect.DeepEqual(got, test.want) {
    51  			t.Errorf("splitPkgConfigOutput(%v) = %v; want %v", test.in, got, test.want)
    52  		}
    53  	}
    54  }
    55  
    56  func TestSharedLibName(t *testing.T) {
    57  	// TODO(avdva) - make these values platform-specific
    58  	prefix := "lib"
    59  	suffix := ".so"
    60  	testData := []struct {
    61  		args      []string
    62  		pkgs      []*load.Package
    63  		expected  string
    64  		expectErr bool
    65  		rootedAt  string
    66  	}{
    67  		{
    68  			args:     []string{"std"},
    69  			pkgs:     []*load.Package{},
    70  			expected: "std",
    71  		},
    72  		{
    73  			args:     []string{"std", "cmd"},
    74  			pkgs:     []*load.Package{},
    75  			expected: "std,cmd",
    76  		},
    77  		{
    78  			args:     []string{},
    79  			pkgs:     []*load.Package{pkgImportPath("gopkg.in/somelib")},
    80  			expected: "gopkg.in-somelib",
    81  		},
    82  		{
    83  			args:     []string{"./..."},
    84  			pkgs:     []*load.Package{pkgImportPath("somelib")},
    85  			expected: "somelib",
    86  			rootedAt: "somelib",
    87  		},
    88  		{
    89  			args:     []string{"../somelib", "../somelib"},
    90  			pkgs:     []*load.Package{pkgImportPath("somelib")},
    91  			expected: "somelib",
    92  		},
    93  		{
    94  			args:     []string{"../lib1", "../lib2"},
    95  			pkgs:     []*load.Package{pkgImportPath("gopkg.in/lib1"), pkgImportPath("gopkg.in/lib2")},
    96  			expected: "gopkg.in-lib1,gopkg.in-lib2",
    97  		},
    98  		{
    99  			args: []string{"./..."},
   100  			pkgs: []*load.Package{
   101  				pkgImportPath("gopkg.in/dir/lib1"),
   102  				pkgImportPath("gopkg.in/lib2"),
   103  				pkgImportPath("gopkg.in/lib3"),
   104  			},
   105  			expected: "gopkg.in",
   106  			rootedAt: "gopkg.in",
   107  		},
   108  		{
   109  			args:      []string{"std", "../lib2"},
   110  			pkgs:      []*load.Package{},
   111  			expectErr: true,
   112  		},
   113  		{
   114  			args:      []string{"all", "./"},
   115  			pkgs:      []*load.Package{},
   116  			expectErr: true,
   117  		},
   118  		{
   119  			args:      []string{"cmd", "fmt"},
   120  			pkgs:      []*load.Package{},
   121  			expectErr: true,
   122  		},
   123  	}
   124  	for _, data := range testData {
   125  		func() {
   126  			if data.rootedAt != "" {
   127  				tmpGopath, err := ioutil.TempDir("", "gopath")
   128  				if err != nil {
   129  					t.Fatal(err)
   130  				}
   131  				oldGopath := cfg.BuildContext.GOPATH
   132  				defer func() {
   133  					cfg.BuildContext.GOPATH = oldGopath
   134  					os.Chdir(base.Cwd)
   135  					err := os.RemoveAll(tmpGopath)
   136  					if err != nil {
   137  						t.Error(err)
   138  					}
   139  				}()
   140  				root := filepath.Join(tmpGopath, "src", data.rootedAt)
   141  				err = os.MkdirAll(root, 0755)
   142  				if err != nil {
   143  					t.Fatal(err)
   144  				}
   145  				cfg.BuildContext.GOPATH = tmpGopath
   146  				os.Chdir(root)
   147  			}
   148  			computed, err := libname(data.args, data.pkgs)
   149  			if err != nil {
   150  				if !data.expectErr {
   151  					t.Errorf("libname returned an error %q, expected a name", err.Error())
   152  				}
   153  			} else if data.expectErr {
   154  				t.Errorf("libname returned %q, expected an error", computed)
   155  			} else {
   156  				expected := prefix + data.expected + suffix
   157  				if expected != computed {
   158  					t.Errorf("libname returned %q, expected %q", computed, expected)
   159  				}
   160  			}
   161  		}()
   162  	}
   163  }
   164  
   165  func pkgImportPath(pkgpath string) *load.Package {
   166  	return &load.Package{
   167  		PackagePublic: load.PackagePublic{
   168  			ImportPath: pkgpath,
   169  		},
   170  	}
   171  }
   172  
   173  // When installing packages, the installed package directory should
   174  // respect the SetGID bit and group name of the destination
   175  // directory.
   176  // See https://golang.org/issue/18878.
   177  func TestRespectSetgidDir(t *testing.T) {
   178  	if runtime.GOOS == "nacl" {
   179  		t.Skip("can't set SetGID bit with chmod on nacl")
   180  	}
   181  
   182  	var b Builder
   183  
   184  	// Check that `cp` is called instead of `mv` by looking at the output
   185  	// of `(*Builder).ShowCmd` afterwards as a sanity check.
   186  	cfg.BuildX = true
   187  	var cmdBuf bytes.Buffer
   188  	b.Print = func(a ...interface{}) (int, error) {
   189  		return cmdBuf.WriteString(fmt.Sprint(a...))
   190  	}
   191  
   192  	setgiddir, err := ioutil.TempDir("", "SetGroupID")
   193  	if err != nil {
   194  		t.Fatal(err)
   195  	}
   196  	defer os.RemoveAll(setgiddir)
   197  
   198  	if runtime.GOOS == "freebsd" {
   199  		err = os.Chown(setgiddir, os.Getuid(), os.Getgid())
   200  		if err != nil {
   201  			t.Fatal(err)
   202  		}
   203  	}
   204  
   205  	// Change setgiddir's permissions to include the SetGID bit.
   206  	if err := os.Chmod(setgiddir, 0755|os.ModeSetgid); err != nil {
   207  		t.Fatal(err)
   208  	}
   209  
   210  	pkgfile, err := ioutil.TempFile("", "pkgfile")
   211  	if err != nil {
   212  		t.Fatalf("ioutil.TempFile(\"\", \"pkgfile\"): %v", err)
   213  	}
   214  	defer os.Remove(pkgfile.Name())
   215  	defer pkgfile.Close()
   216  
   217  	dirGIDFile := filepath.Join(setgiddir, "setgid")
   218  	if err := b.moveOrCopyFile(nil, dirGIDFile, pkgfile.Name(), 0666, true); err != nil {
   219  		t.Fatalf("moveOrCopyFile: %v", err)
   220  	}
   221  
   222  	got := strings.TrimSpace(cmdBuf.String())
   223  	want := b.fmtcmd("", "cp %s %s", pkgfile.Name(), dirGIDFile)
   224  	if got != want {
   225  		t.Fatalf("moveOrCopyFile(%q, %q): want %q, got %q", dirGIDFile, pkgfile.Name(), want, got)
   226  	}
   227  }