| // Copyright 2017 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 load |
| |
| import ( |
| "fmt" |
| "path/filepath" |
| "reflect" |
| "testing" |
| ) |
| |
| type ppfTestPackage struct { |
| path string |
| dir string |
| cmdline bool |
| flags []string |
| } |
| |
| type ppfTest struct { |
| args []string |
| pkgs []ppfTestPackage |
| } |
| |
| var ppfTests = []ppfTest{ |
| // -gcflags=-S applies only to packages on command line. |
| { |
| args: []string{"-S"}, |
| pkgs: []ppfTestPackage{ |
| {cmdline: true, flags: []string{"-S"}}, |
| {cmdline: false, flags: []string{}}, |
| }, |
| }, |
| |
| // -gcflags=-S -gcflags= overrides the earlier -S. |
| { |
| args: []string{"-S", ""}, |
| pkgs: []ppfTestPackage{ |
| {cmdline: true, flags: []string{}}, |
| }, |
| }, |
| |
| // -gcflags=net=-S applies only to package net |
| { |
| args: []string{"net=-S"}, |
| pkgs: []ppfTestPackage{ |
| {path: "math", cmdline: true, flags: []string{}}, |
| {path: "net", flags: []string{"-S"}}, |
| }, |
| }, |
| |
| // -gcflags=net=-S -gcflags=net= also overrides the earlier -S |
| { |
| args: []string{"net=-S", "net="}, |
| pkgs: []ppfTestPackage{ |
| {path: "net", flags: []string{}}, |
| }, |
| }, |
| |
| // -gcflags=net/...=-S net math |
| // applies -S to net and net/http but not math |
| { |
| args: []string{"net/...=-S"}, |
| pkgs: []ppfTestPackage{ |
| {path: "net", flags: []string{"-S"}}, |
| {path: "net/http", flags: []string{"-S"}}, |
| {path: "math", flags: []string{}}, |
| }, |
| }, |
| |
| // -gcflags=net/...=-S -gcflags=-m net math |
| // applies -m to net and math and -S to other packages matching net/... |
| // (net matches too, but it was grabbed by the later -gcflags). |
| { |
| args: []string{"net/...=-S", "-m"}, |
| pkgs: []ppfTestPackage{ |
| {path: "net", cmdline: true, flags: []string{"-m"}}, |
| {path: "math", cmdline: true, flags: []string{"-m"}}, |
| {path: "net", cmdline: false, flags: []string{"-S"}}, |
| {path: "net/http", flags: []string{"-S"}}, |
| {path: "math", flags: []string{}}, |
| }, |
| }, |
| |
| // relative path patterns |
| // ppfDirTest(pattern, n, dirs...) says the first n dirs should match and the others should not. |
| ppfDirTest(".", 1, "/my/test/dir", "/my/test", "/my/test/other", "/my/test/dir/sub"), |
| ppfDirTest("..", 1, "/my/test", "/my/test/dir", "/my/test/other", "/my/test/dir/sub"), |
| ppfDirTest("./sub", 1, "/my/test/dir/sub", "/my/test", "/my/test/dir", "/my/test/other", "/my/test/dir/sub/sub"), |
| ppfDirTest("../other", 1, "/my/test/other", "/my/test", "/my/test/dir", "/my/test/other/sub", "/my/test/dir/other", "/my/test/dir/sub"), |
| ppfDirTest("./...", 3, "/my/test/dir", "/my/test/dir/sub", "/my/test/dir/sub/sub", "/my/test/other", "/my/test/other/sub"), |
| ppfDirTest("../...", 4, "/my/test/dir", "/my/test/other", "/my/test/dir/sub", "/my/test/other/sub", "/my/other/test"), |
| ppfDirTest("../...sub...", 3, "/my/test/dir/sub", "/my/test/othersub", "/my/test/yellowsubmarine", "/my/other/test"), |
| } |
| |
| func ppfDirTest(pattern string, nmatch int, dirs ...string) ppfTest { |
| var pkgs []ppfTestPackage |
| for i, d := range dirs { |
| flags := []string{} |
| if i < nmatch { |
| flags = []string{"-S"} |
| } |
| pkgs = append(pkgs, ppfTestPackage{path: "p", dir: d, flags: flags}) |
| } |
| return ppfTest{args: []string{pattern + "=-S"}, pkgs: pkgs} |
| } |
| |
| func TestPerPackageFlag(t *testing.T) { |
| nativeDir := func(d string) string { |
| if filepath.Separator == '\\' { |
| return `C:` + filepath.FromSlash(d) |
| } |
| return d |
| } |
| |
| for i, tt := range ppfTests { |
| t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { |
| ppFlags := new(PerPackageFlag) |
| for _, arg := range tt.args { |
| t.Logf("set(%s)", arg) |
| if err := ppFlags.set(arg, nativeDir("/my/test/dir")); err != nil { |
| t.Fatal(err) |
| } |
| } |
| for _, p := range tt.pkgs { |
| dir := nativeDir(p.dir) |
| flags := ppFlags.For(&Package{PackagePublic: PackagePublic{ImportPath: p.path, Dir: dir}, Internal: PackageInternal{CmdlinePkg: p.cmdline}}) |
| if !reflect.DeepEqual(flags, p.flags) { |
| t.Errorf("For(%v, %v, %v) = %v, want %v", p.path, dir, p.cmdline, flags, p.flags) |
| } |
| } |
| }) |
| } |
| } |