blob: d3223e12d52ec999bd4e29d5e1c62274f580eb93 [file] [log] [blame]
// 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)
}
}
})
}
}