1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
// Copyright 2015 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package prog
import (
"testing"
)
func TestParseSingle(t *testing.T) {
const execLog = `getpid()
gettid()
`
entries := ParseLog([]byte(execLog))
if len(entries) != 1 {
t.Fatalf("got %v programs, want 1", len(entries))
}
ent := entries[0]
if ent.Start != 0 {
t.Fatalf("start offset %v, want 0", ent.Start)
}
if ent.End != len(execLog) {
t.Fatalf("end offset %v, want %v", ent.End, len(execLog))
}
if ent.Proc != 0 {
t.Fatalf("proc %v, want 0", ent.Proc)
}
if ent.Fault || ent.FaultCall != 0 || ent.FaultNth != 0 {
t.Fatalf("fault injection enabled")
}
want := "getpid-gettid"
got := ent.P.String()
if got != want {
t.Fatalf("bad program: %s, want %s", got, want)
}
}
func TestParseMulti(t *testing.T) {
entries := ParseLog([]byte(execLog))
if len(entries) != 5 {
for i, ent := range entries {
t.Logf("program #%v: %s\n", i, ent.P)
}
t.Fatalf("got %v programs, want 5", len(entries))
}
off := 0
for _, ent := range entries {
if off > ent.Start || ent.Start > ent.End || ent.End > len(execLog) {
t.Fatalf("bad offsets")
}
}
if entries[0].Proc != 0 ||
entries[1].Proc != 1 ||
entries[2].Proc != 2 ||
entries[3].Proc != 33 ||
entries[4].Proc != 9 {
t.Fatalf("bad procs")
}
for i, ent := range entries {
if ent.Fault || ent.FaultCall != 0 || ent.FaultNth != 0 {
t.Fatalf("prog %v has fault injection enabled", i)
}
}
if s := entries[0].P.String(); s != "getpid-gettid" {
t.Fatalf("bad program 0: %s", s)
}
if s := entries[1].P.String(); s != "getpid-gettid-munlockall" {
t.Fatalf("bad program 0: %s", s)
}
if s := entries[2].P.String(); s != "getpid-gettid" {
t.Fatalf("bad program 1: %s", s)
}
if s := entries[3].P.String(); s != "gettid-getpid" {
t.Fatalf("bad program 2: %s", s)
}
if s := entries[4].P.String(); s != "munlockall" {
t.Fatalf("bad program 3: %s", s)
}
}
const execLog = `
getpid()
gettid()
2015/12/21 12:18:05 executing program 1:
getpid()
[ 2351.935478] Modules linked in:
gettid()
munlockall()
2015/12/21 12:18:05 executing program 2:
[ 2351.935478] Modules linked in:
getpid()
gettid()
2015/12/21 12:18:05 executing program 33:
gettid()
getpid()
[ 2351.935478] Modules linked in:
2015/12/21 12:18:05 executing program 9:
munlockall()
`
func TestParseFault(t *testing.T) {
const execLog = `2015/12/21 12:18:05 executing program 1 (fault-call:1 fault-nth:55):
gettid()
getpid()
`
entries := ParseLog([]byte(execLog))
if len(entries) != 1 {
t.Fatalf("got %v programs, want 1", len(entries))
}
ent := entries[0]
if !ent.Fault {
t.Fatalf("fault injection is not enabled")
}
if ent.FaultCall != 1 {
t.Fatalf("fault call: got %v, want 1", ent.FaultCall)
}
if ent.FaultNth != 55 {
t.Fatalf("fault nth: got %v, want 55", ent.FaultNth)
}
want := "gettid-getpid"
got := ent.P.String()
if got != want {
t.Fatalf("bad program: %s, want %s", got, want)
}
}
|