|  | // Copyright 2014 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. | 
|  |  | 
|  | // Incomplete source tree on Android. | 
|  |  | 
|  | //go:build !android | 
|  | // +build !android | 
|  |  | 
|  | package buildutil_test | 
|  |  | 
|  | import ( | 
|  | "go/build" | 
|  | "runtime" | 
|  | "sort" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "golang.org/x/tools/go/buildutil" | 
|  | "golang.org/x/tools/go/packages/packagestest" | 
|  | ) | 
|  |  | 
|  | func TestAllPackages(t *testing.T) { | 
|  | if runtime.Compiler == "gccgo" { | 
|  | t.Skip("gccgo has no standard packages") | 
|  | } | 
|  |  | 
|  | exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{ | 
|  | {Name: "golang.org/x/tools/go/buildutil", Files: packagestest.MustCopyFileTree(".")}}) | 
|  | defer exported.Cleanup() | 
|  |  | 
|  | var gopath string | 
|  | for _, env := range exported.Config.Env { | 
|  | if !strings.HasPrefix(env, "GOPATH=") { | 
|  | continue | 
|  | } | 
|  | gopath = strings.TrimPrefix(env, "GOPATH=") | 
|  | } | 
|  | if gopath == "" { | 
|  | t.Fatal("Failed to fish GOPATH out of env: ", exported.Config.Env) | 
|  | } | 
|  |  | 
|  | var buildContext = build.Default | 
|  | buildContext.GOPATH = gopath | 
|  | all := buildutil.AllPackages(&buildContext) | 
|  |  | 
|  | set := make(map[string]bool) | 
|  | for _, pkg := range all { | 
|  | set[pkg] = true | 
|  | } | 
|  |  | 
|  | const wantAtLeast = 250 | 
|  | if len(all) < wantAtLeast { | 
|  | t.Errorf("Found only %d packages, want at least %d", len(all), wantAtLeast) | 
|  | } | 
|  |  | 
|  | for _, want := range []string{"fmt", "crypto/sha256", "golang.org/x/tools/go/buildutil"} { | 
|  | if !set[want] { | 
|  | t.Errorf("Package %q not found; got %s", want, all) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestExpandPatterns(t *testing.T) { | 
|  | tree := make(map[string]map[string]string) | 
|  | for _, pkg := range []string{ | 
|  | "encoding", | 
|  | "encoding/xml", | 
|  | "encoding/hex", | 
|  | "encoding/json", | 
|  | "fmt", | 
|  | } { | 
|  | tree[pkg] = make(map[string]string) | 
|  | } | 
|  | ctxt := buildutil.FakeContext(tree) | 
|  |  | 
|  | for _, test := range []struct { | 
|  | patterns string | 
|  | want     string | 
|  | }{ | 
|  | {"", ""}, | 
|  | {"fmt", "fmt"}, | 
|  | {"nosuchpkg", "nosuchpkg"}, | 
|  | {"nosuchdir/...", ""}, | 
|  | {"...", "encoding encoding/hex encoding/json encoding/xml fmt"}, | 
|  | {"encoding/... -encoding/xml", "encoding encoding/hex encoding/json"}, | 
|  | {"... -encoding/...", "fmt"}, | 
|  | {"encoding", "encoding"}, | 
|  | {"encoding/", "encoding"}, | 
|  | } { | 
|  | var pkgs []string | 
|  | for pkg := range buildutil.ExpandPatterns(ctxt, strings.Fields(test.patterns)) { | 
|  | pkgs = append(pkgs, pkg) | 
|  | } | 
|  | sort.Strings(pkgs) | 
|  | got := strings.Join(pkgs, " ") | 
|  | if got != test.want { | 
|  | t.Errorf("ExpandPatterns(%s) = %s, want %s", | 
|  | test.patterns, got, test.want) | 
|  | } | 
|  | } | 
|  | } |