| | |
| | |
| | |
| |
|
| | package pkgpath |
| |
|
| | import ( |
| | "internal/testenv" |
| | "os" |
| | "testing" |
| | ) |
| |
|
| | const testEnvName = "GO_PKGPATH_TEST_COMPILER" |
| |
|
| | |
| | |
| | |
| | func init() { |
| | switch os.Getenv(testEnvName) { |
| | case "": |
| | return |
| | case "v1": |
| | os.Stdout.WriteString(`.string "go.l__ufer.Run"`) |
| | os.Exit(0) |
| | case "v2": |
| | os.Stdout.WriteString(`.string "go.l..u00e4ufer.Run"`) |
| | os.Exit(0) |
| | case "v3": |
| | os.Stdout.WriteString(`.string "go_0l_u00e4ufer.Run"`) |
| | os.Exit(0) |
| | case "error": |
| | os.Stdout.WriteString(`unknown string`) |
| | os.Exit(0) |
| | } |
| | } |
| |
|
| | func TestToSymbolFunc(t *testing.T) { |
| | testenv.MustHaveExec(t) |
| |
|
| | const input = "pä世🜃" |
| | tests := []struct { |
| | env string |
| | fail bool |
| | mangled string |
| | }{ |
| | { |
| | env: "v1", |
| | mangled: "p___", |
| | }, |
| | { |
| | env: "v2", |
| | mangled: "p..u00e4..u4e16..U0001f703", |
| | }, |
| | { |
| | env: "v3", |
| | mangled: "p_u00e4_u4e16_U0001f703", |
| | }, |
| | { |
| | env: "error", |
| | fail: true, |
| | }, |
| | } |
| |
|
| | cmd := os.Args[0] |
| | tmpdir := t.TempDir() |
| |
|
| | defer os.Unsetenv(testEnvName) |
| |
|
| | for _, test := range tests { |
| | t.Run(test.env, func(t *testing.T) { |
| | os.Setenv(testEnvName, test.env) |
| |
|
| | fn, err := ToSymbolFunc(cmd, tmpdir) |
| | if err != nil { |
| | if !test.fail { |
| | t.Errorf("ToSymbolFunc(%q, %q): unexpected error %v", cmd, tmpdir, err) |
| | } |
| | } else if test.fail { |
| | t.Errorf("ToSymbolFunc(%q, %q) succeeded but expected to fail", cmd, tmpdir) |
| | } else if got, want := fn(input), test.mangled; got != want { |
| | t.Errorf("ToSymbolFunc(%q, %q)(%q) = %q, want %q", cmd, tmpdir, input, got, want) |
| | } |
| | }) |
| | } |
| | } |
| |
|
| | var symbolTests = []struct { |
| | input, v1, v2, v3 string |
| | }{ |
| | { |
| | "", |
| | "", |
| | "", |
| | "", |
| | }, |
| | { |
| | "bytes", |
| | "bytes", |
| | "bytes", |
| | "bytes", |
| | }, |
| | { |
| | "net/http", |
| | "net_http", |
| | "net..z2fhttp", |
| | "net_1http", |
| | }, |
| | { |
| | "golang.org/x/net/http", |
| | "golang_org_x_net_http", |
| | "golang.x2eorg..z2fx..z2fnet..z2fhttp", |
| | "golang_0org_1x_1net_1http", |
| | }, |
| | { |
| | "pä世.🜃", |
| | "p____", |
| | "p..u00e4..u4e16.x2e..U0001f703", |
| | "p_u00e4_u4e16_0_U0001f703", |
| | }, |
| | } |
| |
|
| | func TestV1(t *testing.T) { |
| | for _, test := range symbolTests { |
| | if got, want := toSymbolV1(test.input), test.v1; got != want { |
| | t.Errorf("toSymbolV1(%q) = %q, want %q", test.input, got, want) |
| | } |
| | } |
| | } |
| |
|
| | func TestV2(t *testing.T) { |
| | for _, test := range symbolTests { |
| | if got, want := toSymbolV2(test.input), test.v2; got != want { |
| | t.Errorf("toSymbolV2(%q) = %q, want %q", test.input, got, want) |
| | } |
| | } |
| | } |
| |
|
| | func TestV3(t *testing.T) { |
| | for _, test := range symbolTests { |
| | if got, want := toSymbolV3(test.input), test.v3; got != want { |
| | t.Errorf("toSymbolV3(%q) = %q, want %q", test.input, got, want) |
| | } |
| | } |
| | } |
| |
|