// Copyright 2018 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. // +build cgo package packages_test import ( "runtime" "strings" "testing" "golang.org/x/tools/go/packages" "golang.org/x/tools/internal/testenv" ) func TestLoadImportsC(t *testing.T) { // This test checks that when a package depends on the // test variant of "syscall", "unsafe", or "runtime/cgo", that dependency // is not removed when those packages are added when it imports "C". // // For this test to work, the external test of syscall must have a dependency // on net, and net must import "syscall" and "C". if runtime.GOOS == "windows" { t.Skipf("skipping on windows; packages on windows do not satisfy conditions for test.") } if runtime.GOOS == "plan9" { // See https://golang.org/issue/27100. t.Skip(`skipping on plan9; for some reason "net [syscall.test]" is not loaded`) } testenv.NeedsGoPackages(t) cfg := &packages.Config{ Context: testCtx, Mode: packages.LoadImports, Tests: true, } initial, err := packages.Load(cfg, "syscall", "net") if err != nil { t.Fatalf("failed to load imports: %v", err) } _, all := importGraph(initial) for _, test := range []struct { pattern string wantImport string // an import to check for }{ {"net", "syscall:syscall"}, {"net [syscall.test]", "syscall:syscall [syscall.test]"}, {"syscall_test [syscall.test]", "net:net [syscall.test]"}, } { // Test the import paths. pkg := all[test.pattern] if pkg == nil { t.Errorf("package %q not loaded", test.pattern) continue } if imports := strings.Join(imports(pkg), " "); !strings.Contains(imports, test.wantImport) { t.Errorf("package %q: got \n%s, \nwant to have %s", test.pattern, imports, test.wantImport) } } }