2014-08-04 23:02:08 +00:00
|
|
|
package frame
|
|
|
|
|
|
|
|
import (
|
2016-01-24 08:47:22 +00:00
|
|
|
"encoding/binary"
|
2014-09-19 04:00:41 +00:00
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2014-08-04 23:02:08 +00:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestFDEForPC(t *testing.T) {
|
2015-02-05 00:14:08 +00:00
|
|
|
frames := NewFrameIndex()
|
2018-05-29 15:01:51 +00:00
|
|
|
frames = append(frames,
|
|
|
|
&FrameDescriptionEntry{begin: 10, size: 40},
|
|
|
|
&FrameDescriptionEntry{begin: 50, size: 50},
|
|
|
|
&FrameDescriptionEntry{begin: 100, size: 100},
|
|
|
|
&FrameDescriptionEntry{begin: 300, size: 10})
|
2014-08-04 23:02:08 +00:00
|
|
|
|
2018-05-29 15:01:51 +00:00
|
|
|
for _, test := range []struct {
|
|
|
|
pc uint64
|
|
|
|
fde *FrameDescriptionEntry
|
|
|
|
}{
|
|
|
|
{0, nil},
|
|
|
|
{9, nil},
|
|
|
|
{10, frames[0]},
|
|
|
|
{35, frames[0]},
|
|
|
|
{49, frames[0]},
|
|
|
|
{50, frames[1]},
|
|
|
|
{75, frames[1]},
|
|
|
|
{100, frames[2]},
|
|
|
|
{199, frames[2]},
|
|
|
|
{200, nil},
|
|
|
|
{299, nil},
|
|
|
|
{300, frames[3]},
|
|
|
|
{309, frames[3]},
|
|
|
|
{310, nil},
|
|
|
|
{400, nil}} {
|
2014-08-04 23:02:08 +00:00
|
|
|
|
2018-05-29 15:01:51 +00:00
|
|
|
out, err := frames.FDEForPC(test.pc)
|
|
|
|
if test.fde != nil {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if out != test.fde {
|
|
|
|
t.Errorf("[pc = %#x] got incorrect fde\noutput:\t%#v\nexpected:\t%#v", test.pc, out, test.fde)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if err == nil {
|
|
|
|
t.Errorf("[pc = %#x] expected error got fde %#v", test.pc, out)
|
|
|
|
}
|
|
|
|
}
|
2014-08-04 23:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkFDEForPC(b *testing.B) {
|
2014-09-19 04:00:41 +00:00
|
|
|
f, err := os.Open("testdata/frame")
|
|
|
|
if err != nil {
|
|
|
|
b.Fatal(err)
|
|
|
|
}
|
|
|
|
defer f.Close()
|
2014-08-04 23:02:08 +00:00
|
|
|
|
2014-09-19 04:00:41 +00:00
|
|
|
data, err := ioutil.ReadAll(f)
|
|
|
|
if err != nil {
|
|
|
|
b.Fatal(err)
|
|
|
|
}
|
2018-05-29 15:01:51 +00:00
|
|
|
fdes := Parse(data, binary.BigEndian, 0)
|
2014-08-04 23:02:08 +00:00
|
|
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
2014-09-19 04:00:41 +00:00
|
|
|
// bench worst case, exhaustive search
|
|
|
|
_, _ = fdes.FDEForPC(0x455555555)
|
2014-08-04 23:02:08 +00:00
|
|
|
}
|
|
|
|
}
|