symtab_test.go 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2016 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package gosym
  5. import (
  6. "fmt"
  7. "testing"
  8. )
  9. func assertString(t *testing.T, dsc, out, tgt string) {
  10. if out != tgt {
  11. t.Fatalf("Expected: %q Actual: %q for %s", tgt, out, dsc)
  12. }
  13. }
  14. func TestStandardLibPackage(t *testing.T) {
  15. s1 := Sym{Name: "io.(*LimitedReader).Read"}
  16. s2 := Sym{Name: "io.NewSectionReader"}
  17. assertString(t, fmt.Sprintf("package of %q", s1.Name), s1.PackageName(), "io")
  18. assertString(t, fmt.Sprintf("package of %q", s2.Name), s2.PackageName(), "io")
  19. assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*LimitedReader)")
  20. assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "")
  21. }
  22. func TestStandardLibPathPackage(t *testing.T) {
  23. s1 := Sym{Name: "debug/gosym.(*LineTable).PCToLine"}
  24. s2 := Sym{Name: "debug/gosym.NewTable"}
  25. assertString(t, fmt.Sprintf("package of %q", s1.Name), s1.PackageName(), "debug/gosym")
  26. assertString(t, fmt.Sprintf("package of %q", s2.Name), s2.PackageName(), "debug/gosym")
  27. assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*LineTable)")
  28. assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "")
  29. }
  30. func TestGenericNames(t *testing.T) {
  31. s1 := Sym{Name: "main.set[int]"}
  32. s2 := Sym{Name: "main.(*value[int]).get"}
  33. s3 := Sym{Name: "a/b.absDifference[c/d.orderedAbs[float64]]"}
  34. s4 := Sym{Name: "main.testfunction[.shape.int]"}
  35. assertString(t, fmt.Sprintf("package of %q", s1.Name), s1.PackageName(), "main")
  36. assertString(t, fmt.Sprintf("package of %q", s2.Name), s2.PackageName(), "main")
  37. assertString(t, fmt.Sprintf("package of %q", s3.Name), s3.PackageName(), "a/b")
  38. assertString(t, fmt.Sprintf("package of %q", s4.Name), s4.PackageName(), "main")
  39. assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "")
  40. assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "(*value[int])")
  41. assertString(t, fmt.Sprintf("receiver of %q", s3.Name), s3.ReceiverName(), "")
  42. assertString(t, fmt.Sprintf("receiver of %q", s4.Name), s4.ReceiverName(), "")
  43. assertString(t, fmt.Sprintf("base of %q", s1.Name), s1.BaseName(), "set[int]")
  44. assertString(t, fmt.Sprintf("base of %q", s2.Name), s2.BaseName(), "get")
  45. assertString(t, fmt.Sprintf("base of %q", s3.Name), s3.BaseName(), "absDifference[c/d.orderedAbs[float64]]")
  46. assertString(t, fmt.Sprintf("base of %q", s4.Name), s4.BaseName(), "testfunction[.shape.int]")
  47. }
  48. func TestRemotePackage(t *testing.T) {
  49. s1 := Sym{Name: "github.com/docker/doc.ker/pkg/mflag.(*FlagSet).PrintDefaults"}
  50. s2 := Sym{Name: "github.com/docker/doc.ker/pkg/mflag.PrintDefaults"}
  51. assertString(t, fmt.Sprintf("package of %q", s1.Name), s1.PackageName(), "github.com/docker/doc.ker/pkg/mflag")
  52. assertString(t, fmt.Sprintf("package of %q", s2.Name), s2.PackageName(), "github.com/docker/doc.ker/pkg/mflag")
  53. assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*FlagSet)")
  54. assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "")
  55. }
  56. func TestIssue29551(t *testing.T) {
  57. symNames := []string{
  58. "type..eq.[9]debug/elf.intName",
  59. "type..hash.debug/elf.ProgHeader",
  60. "type..eq.runtime._panic",
  61. "type..hash.struct { runtime.gList; runtime.n int32 }",
  62. "go.(*struct { sync.Mutex; math/big.table [64]math/big",
  63. }
  64. for _, symName := range symNames {
  65. s := Sym{Name: symName}
  66. assertString(t, fmt.Sprintf("package of %q", s.Name), s.PackageName(), "")
  67. }
  68. }