@@ -44,6 +44,7 @@ type ParseTest struct {
44
44
HasReport bool
45
45
Report []byte
46
46
Executor string
47
+ ContextIDs string
47
48
// Only used in report parsing:
48
49
corruptedReason string
49
50
}
@@ -88,6 +89,9 @@ func (test *ParseTest) Headers(includeFrame bool) []byte {
88
89
if test .Executor != "" {
89
90
fmt .Fprintf (buf , "EXECUTOR: %s\n " , test .Executor )
90
91
}
92
+ if test .ContextIDs != "" {
93
+ fmt .Fprintf (buf , "CONTEXTS: %s\n " , test .ContextIDs )
94
+ }
91
95
return buf .Bytes ()
92
96
}
93
97
@@ -96,8 +100,8 @@ func testParseFile(t *testing.T, reporter *Reporter, fn string) {
96
100
testParseImpl (t , reporter , test )
97
101
}
98
102
99
- func parseReport (t * testing.T , reporter * Reporter , fn string ) * ParseTest {
100
- data , err := os .ReadFile (fn )
103
+ func parseReport (t * testing.T , reporter * Reporter , testFileName string ) * ParseTest {
104
+ data , err := os .ReadFile (testFileName )
101
105
if err != nil {
102
106
t .Fatal (err )
103
107
}
@@ -110,7 +114,7 @@ func parseReport(t *testing.T, reporter *Reporter, fn string) *ParseTest {
110
114
)
111
115
phase := phaseHeaders
112
116
test := & ParseTest {
113
- FileName : fn ,
117
+ FileName : testFileName ,
114
118
}
115
119
prevEmptyLine := false
116
120
s := bufio .NewScanner (bytes .NewReader (data ))
@@ -158,6 +162,7 @@ func parseHeaderLine(t *testing.T, test *ParseTest, ln string) {
158
162
corruptedPrefix = "CORRUPTED: "
159
163
suppressedPrefix = "SUPPRESSED: "
160
164
executorPrefix = "EXECUTOR: "
165
+ contextidPrefix = "CONTEXTS: "
161
166
)
162
167
switch {
163
168
case strings .HasPrefix (ln , "#" ):
@@ -193,6 +198,8 @@ func parseHeaderLine(t *testing.T, test *ParseTest, ln string) {
193
198
}
194
199
case strings .HasPrefix (ln , executorPrefix ):
195
200
test .Executor = ln [len (executorPrefix ):]
201
+ case strings .HasPrefix (ln , contextidPrefix ):
202
+ test .ContextIDs = ln [len (contextidPrefix ):]
196
203
default :
197
204
t .Fatalf ("unknown header field %q" , ln )
198
205
}
@@ -545,3 +552,26 @@ func TestSplitReportBytes(t *testing.T) {
545
552
})
546
553
}
547
554
}
555
+
556
+ // TestParseAll's focus points are the ability to:
557
+ // 1. parse multiple reports
558
+ // 2. extract correct ThreadID/CpuID.
559
+ func TestParseAll (t * testing.T ) {
560
+ forEachFile (t , "parse_all" , testParseAll )
561
+ }
562
+
563
+ func testParseAll (t * testing.T , reporter * Reporter , testFileName string ) {
564
+ test := parseReport (t , reporter , testFileName )
565
+ gotReports := ParseAll (reporter , test .Log , 0 )
566
+ gotIDs := mergeReportContextIDs (gotReports )
567
+ mergedReport := MergeReportBytes (gotReports )
568
+ if ! bytes .Equal (mergedReport , test .Report ) || gotIDs != test .ContextIDs {
569
+ if * flagUpdate {
570
+ updateReportTest (t , test , & ParseTest {
571
+ ContextIDs : gotIDs ,
572
+ Report : mergedReport })
573
+ }
574
+ assert .Equal (t , test .ContextIDs , gotIDs , "extracted wrong Thread or CPU ids" )
575
+ assert .Equal (t , string (test .Report ), string (mergedReport ), "extracted wrong reports" )
576
+ }
577
+ }
0 commit comments