// 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 objabi import ( "internal/testenv" "os/exec" "strings" "testing" ) var escapeTests = []struct { Path string Escaped string }{ {"foo/bar/v1", "foo/bar/v1"}, {"foo/bar/v.1", "foo/bar/v%2e1"}, {"f.o.o/b.a.r/v1", "f.o.o/b.a.r/v1"}, {"f.o.o/b.a.r/v.1", "f.o.o/b.a.r/v%2e1"}, {"f.o.o/b.a.r/v..1", "f.o.o/b.a.r/v%2e%2e1"}, {"f.o.o/b.a.r/v..1.", "f.o.o/b.a.r/v%2e%2e1%2e"}, {"f.o.o/b.a.r/v%1", "f.o.o/b.a.r/v%251"}, {"runtime", "runtime"}, {"sync/atomic", "sync/atomic"}, {"golang.org/x/tools/godoc", "golang.org/x/tools/godoc"}, {"foo.bar/baz.quux", "foo.bar/baz%2equux"}, {"", ""}, {"%foo%bar", "%25foo%25bar"}, {"\x01\x00\x7F☺", "%01%00%7f%e2%98%ba"}, } func TestPathToPrefix(t *testing.T) { for _, tc := range escapeTests { if got := PathToPrefix(tc.Path); got != tc.Escaped { t.Errorf("expected PathToPrefix(%s) = %s, got %s", tc.Path, tc.Escaped, got) } } } func TestPrefixToPath(t *testing.T) { for _, tc := range escapeTests { got, err := PrefixToPath(tc.Escaped) if err != nil { t.Errorf("expected PrefixToPath(%s) err = nil, got %v", tc.Escaped, err) } if got != tc.Path { t.Errorf("expected PrefixToPath(%s) = %s, got %s", tc.Escaped, tc.Path, got) } } } func TestPrefixToPathError(t *testing.T) { tests := []string{ "foo%", "foo%1", "foo%%12", "foo%1g", } for _, tc := range tests { _, err := PrefixToPath(tc) if err == nil { t.Errorf("expected PrefixToPath(%s) err != nil, got nil", tc) } } } func TestRuntimePackageList(t *testing.T) { // Test that all packages imported by the runtime are marked as runtime // packages. testenv.MustHaveGoBuild(t) goCmd, err := testenv.GoTool() if err != nil { t.Fatal(err) } pkgList, err := exec.Command(goCmd, "list", "-deps", "runtime").Output() if err != nil { if err, ok := err.(*exec.ExitError); ok { t.Log(string(err.Stderr)) } t.Fatal(err) } for _, pkg := range strings.Split(strings.TrimRight(string(pkgList), "\n"), "\n") { if pkg == "unsafe" { continue } if !LookupPkgSpecial(pkg).Runtime { t.Errorf("package %s is imported by runtime, but not marked Runtime", pkg) } } }