stack_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright 2015 Marc-Antoine Ruel. All rights reserved.
  2. // Use of this source code is governed under the Apache License, Version 2.0
  3. // that can be found in the LICENSE file.
  4. package stack
  5. import (
  6. "flag"
  7. "io/ioutil"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. "testing"
  12. )
  13. func TestCallPkg1(t *testing.T) {
  14. c := Call{
  15. SrcPath: "/gopath/src/gopkg.in/yaml.v2/yaml.go",
  16. Line: 153,
  17. Func: Func{Raw: "gopkg.in/yaml%2ev2.handleErr"},
  18. Args: Args{Values: []Arg{{Value: 0xc208033b20}}},
  19. }
  20. compareString(t, "yaml.go", c.SrcName())
  21. compareString(t, filepath.Join("yaml.v2", "yaml.go"), c.PkgSrc())
  22. compareString(t, "gopkg.in/yaml.v2.handleErr", c.Func.String())
  23. compareString(t, "handleErr", c.Func.Name())
  24. // This is due to directory name not matching the package name.
  25. compareString(t, "yaml.v2", c.Func.PkgName())
  26. compareBool(t, false, c.Func.IsExported())
  27. compareBool(t, false, c.IsStdlib)
  28. compareBool(t, false, c.IsPkgMain())
  29. }
  30. func TestCallPkg2(t *testing.T) {
  31. c := Call{
  32. SrcPath: "/gopath/src/gopkg.in/yaml.v2/yaml.go",
  33. Line: 153,
  34. Func: Func{Raw: "gopkg.in/yaml%2ev2.(*decoder).unmarshal"},
  35. Args: Args{Values: []Arg{{Value: 0xc208033b20}}},
  36. }
  37. compareString(t, "yaml.go", c.SrcName())
  38. compareString(t, filepath.Join("yaml.v2", "yaml.go"), c.PkgSrc())
  39. // TODO(maruel): Using '/' for this function is inconsistent on Windows
  40. // w.r.t. other functions.
  41. compareString(t, "gopkg.in/yaml.v2.(*decoder).unmarshal", c.Func.String())
  42. compareString(t, "(*decoder).unmarshal", c.Func.Name())
  43. // This is due to directory name not matching the package name.
  44. compareString(t, "yaml.v2", c.Func.PkgName())
  45. compareBool(t, false, c.Func.IsExported())
  46. compareBool(t, false, c.IsStdlib)
  47. compareBool(t, false, c.IsPkgMain())
  48. }
  49. func TestCallStdlib(t *testing.T) {
  50. c := Call{
  51. SrcPath: "/goroot/src/reflect/value.go",
  52. Line: 2125,
  53. Func: Func{Raw: "reflect.Value.assignTo"},
  54. Args: Args{Values: []Arg{{Value: 0x570860}, {Value: 0xc20803f3e0}, {Value: 0x15}}},
  55. }
  56. c.updateLocations("/goroot", "/goroot", nil)
  57. compareString(t, "value.go", c.SrcName())
  58. compareString(t, "value.go:2125", c.SrcLine())
  59. compareString(t, filepath.Join("reflect", "value.go"), c.PkgSrc())
  60. compareString(t, "reflect.Value.assignTo", c.Func.String())
  61. compareString(t, "Value.assignTo", c.Func.Name())
  62. compareString(t, "reflect", c.Func.PkgName())
  63. compareBool(t, false, c.Func.IsExported())
  64. compareBool(t, true, c.IsStdlib)
  65. compareBool(t, false, c.IsPkgMain())
  66. }
  67. func TestCallMain(t *testing.T) {
  68. c := Call{
  69. SrcPath: "/gopath/src/notabug.org/themusicgod1/panicparse/cmd/pp/main.go",
  70. Line: 428,
  71. Func: Func{Raw: "main.main"},
  72. }
  73. compareString(t, "main.go", c.SrcName())
  74. compareString(t, "main.go:428", c.SrcLine())
  75. compareString(t, filepath.Join("pp", "main.go"), c.PkgSrc())
  76. compareString(t, "main.main", c.Func.String())
  77. compareString(t, "main", c.Func.Name())
  78. compareString(t, "main", c.Func.PkgName())
  79. compareBool(t, true, c.Func.IsExported())
  80. compareBool(t, false, c.IsStdlib)
  81. compareBool(t, true, c.IsPkgMain())
  82. }
  83. func TestCallC(t *testing.T) {
  84. c := Call{
  85. SrcPath: "/goroot/src/runtime/proc.c",
  86. Line: 1472,
  87. Func: Func{Raw: "findrunnable"},
  88. Args: Args{Values: []Arg{{Value: 0xc208012000}}},
  89. }
  90. c.updateLocations("/goroot", "/goroot", nil)
  91. compareString(t, "proc.c", c.SrcName())
  92. compareString(t, "proc.c:1472", c.SrcLine())
  93. compareString(t, filepath.Join("runtime", "proc.c"), c.PkgSrc())
  94. compareString(t, "findrunnable", c.Func.String())
  95. compareString(t, "findrunnable", c.Func.Name())
  96. compareString(t, "", c.Func.PkgName())
  97. compareBool(t, false, c.Func.IsExported())
  98. compareBool(t, true, c.IsStdlib)
  99. compareBool(t, false, c.IsPkgMain())
  100. }
  101. func TestArgs(t *testing.T) {
  102. a := Args{
  103. Values: []Arg{
  104. {Value: 0x4},
  105. {Value: 0x7fff671c7118},
  106. {Value: 0xffffffff00000080},
  107. {},
  108. {Value: 0xffffffff0028c1be},
  109. {},
  110. {},
  111. {},
  112. {},
  113. {},
  114. },
  115. Elided: true,
  116. }
  117. compareString(t, "0x4, 0x7fff671c7118, 0xffffffff00000080, 0, 0xffffffff0028c1be, 0, 0, 0, 0, 0, ...", a.String())
  118. }
  119. func TestFuncAnonymous(t *testing.T) {
  120. f := Func{Raw: "main.func·001"}
  121. compareString(t, "main.func·001", f.String())
  122. compareString(t, "main.func·001", f.PkgDotName())
  123. compareString(t, "func·001", f.Name())
  124. compareString(t, "main", f.PkgName())
  125. compareBool(t, false, f.IsExported())
  126. }
  127. func TestFuncGC(t *testing.T) {
  128. f := Func{Raw: "gc"}
  129. compareString(t, "gc", f.String())
  130. compareString(t, "gc", f.PkgDotName())
  131. compareString(t, "gc", f.Name())
  132. compareString(t, "", f.PkgName())
  133. compareBool(t, false, f.IsExported())
  134. }
  135. //
  136. func compareBool(t *testing.T, expected, actual bool) {
  137. if expected != actual {
  138. t.Fatalf("%t != %t", expected, actual)
  139. }
  140. }
  141. func TestMain(m *testing.M) {
  142. flag.Parse()
  143. if !testing.Verbose() {
  144. log.SetOutput(ioutil.Discard)
  145. }
  146. os.Exit(m.Run())
  147. }