| OLD | NEW |
| 1 package data | 1 package data |
| 2 | 2 |
| 3 import ( | 3 import ( |
| 4 "path/filepath" | 4 "path/filepath" |
| 5 "reflect" | 5 "reflect" |
| 6 "testing" | 6 "testing" |
| 7 | 7 |
| 8 "go.skia.org/infra/go/testutils" | 8 "go.skia.org/infra/go/testutils" |
| 9 ) | 9 ) |
| 10 | 10 |
| 11 func TestParseReleaseDump(t *testing.T) { | 11 func TestParseReleaseDump(t *testing.T) { |
| 12 » testInput := testutils.MustReadFile("parse-release.dump") | 12 » testInput := testutils.MustReadFile("parse-catchsegv-release.dump") |
| 13 trace := ParseStackTrace(testInput) | 13 trace := ParseStackTrace(testInput) |
| 14 expected := StackTrace{ | 14 expected := StackTrace{ |
| 15 Frames: []StackTraceFrame{ | 15 Frames: []StackTraceFrame{ |
| 16 FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFla
ttenable", 344), | 16 FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFla
ttenable", 344), |
| 17 FullStackFrame("src/core/", "SkReadBuffer.h", "readFlatt
enable", 130), | 17 FullStackFrame("src/core/", "SkReadBuffer.h", "readFlatt
enable", 130), |
| 18 FullStackFrame("src/core/", "SkPictureData.cpp", "parseB
ufferTag", 498), | 18 FullStackFrame("src/core/", "SkPictureData.cpp", "parseB
ufferTag", 498), |
| 19 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
treamTag", 424), | 19 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
treamTag", 424), |
| 20 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
tream", 580), | 20 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
tream", 580), |
| 21 FullStackFrame("src/core/", "SkPicture.cpp", "CreateFrom
Stream", 153), | 21 FullStackFrame("src/core/", "SkPicture.cpp", "CreateFrom
Stream", 153), |
| 22 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
treamTag", 392), | 22 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
treamTag", 392), |
| 23 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
tream", 580), | 23 FullStackFrame("src/core/", "SkPictureData.cpp", "parseS
tream", 580), |
| 24 FullStackFrame("src/core/", "SkPicture.cpp", "CreateFrom
Stream", 153), | 24 FullStackFrame("src/core/", "SkPicture.cpp", "CreateFrom
Stream", 153), |
| 25 FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "too
l_main", 41), | 25 FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "too
l_main", 41), |
| 26 }, | 26 }, |
| 27 } | 27 } |
| 28 if !reflect.DeepEqual(expected, trace) { | 28 if !reflect.DeepEqual(expected, trace) { |
| 29 t.Errorf("Expected %#v\nbut was %#v", expected, trace) | 29 t.Errorf("Expected %#v\nbut was %#v", expected, trace) |
| 30 } | 30 } |
| 31 } | 31 } |
| 32 | 32 |
| 33 func TestParseDebugDump(t *testing.T) { | 33 func TestParseDebugDump(t *testing.T) { |
| 34 » testInput := testutils.MustReadFile("parse-debug.dump") | 34 » testInput := testutils.MustReadFile("parse-catchsegv-debug.dump") |
| 35 | 35 |
| 36 trace := ParseStackTrace(testInput) | 36 trace := ParseStackTrace(testInput) |
| 37 | 37 |
| 38 expected := StackTrace{ | 38 expected := StackTrace{ |
| 39 Frames: []StackTraceFrame{ | 39 Frames: []StackTraceFrame{ |
| 40 FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFla
ttenable", 343), | 40 FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFla
ttenable", 343), |
| 41 FullStackFrame("src/core/", "SkReadBuffer.h", "readFlatt
enable", 130), | 41 FullStackFrame("src/core/", "SkReadBuffer.h", "readFlatt
enable", 130), |
| 42 FullStackFrame("src/core/", "SkReadBuffer.h", "readPathE
ffect", 136), | 42 FullStackFrame("src/core/", "SkReadBuffer.h", "readPathE
ffect", 136), |
| 43 FullStackFrame("src/core/", "SkPaint.cpp", "unflatten",
1971), | 43 FullStackFrame("src/core/", "SkPaint.cpp", "unflatten",
1971), |
| 44 FullStackFrame("src/core/", "SkReadBuffer.h", "readPaint
", 126), | 44 FullStackFrame("src/core/", "SkReadBuffer.h", "readPaint
", 126), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 55 FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "too
l_main", 41), | 55 FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "too
l_main", 41), |
| 56 }, | 56 }, |
| 57 } | 57 } |
| 58 | 58 |
| 59 if !reflect.DeepEqual(expected, trace) { | 59 if !reflect.DeepEqual(expected, trace) { |
| 60 t.Errorf("Expected %#v\nbut was %#v", expected, trace) | 60 t.Errorf("Expected %#v\nbut was %#v", expected, trace) |
| 61 } | 61 } |
| 62 } | 62 } |
| 63 | 63 |
| 64 func TestParsingEdgeCases(t *testing.T) { | 64 func TestParsingEdgeCases(t *testing.T) { |
| 65 » // This is a made up dump that has the edge cases for parsing. | 65 » // This is a made up dump that has the edge cases for parsing function n
ames. |
| 66 » testInput := testutils.MustReadFile("parse-edge.dump") | 66 » testInput := testutils.MustReadFile("parse-catchsegv-edge.dump") |
| 67 trace := ParseStackTrace(testInput) | 67 trace := ParseStackTrace(testInput) |
| 68 expected := StackTrace{ | 68 expected := StackTrace{ |
| 69 Frames: []StackTraceFrame{ | 69 Frames: []StackTraceFrame{ |
| 70 FullStackFrame("src/codec/", "SkMasks.cpp", "convert_to_
8", 54), | 70 FullStackFrame("src/codec/", "SkMasks.cpp", "convert_to_
8", 54), |
| 71 FullStackFrame("src/codec/", "SkBmpMaskCodec.cpp", "deco
deRows", 93), | 71 FullStackFrame("src/codec/", "SkBmpMaskCodec.cpp", "deco
deRows", 93), |
| 72 FullStackFrame("src/core/", "SkClipStack.cpp", "Element:
:updateBoundAndGenID", 483), | 72 FullStackFrame("src/core/", "SkClipStack.cpp", "Element:
:updateBoundAndGenID", 483), |
| 73 FullStackFrame("src/core/", "SkClipStack.cpp", "pushElem
ent", 719), | 73 FullStackFrame("src/core/", "SkClipStack.cpp", "pushElem
ent", 719), |
| 74 FullStackFrame("dm/", "DMSrcSink.cpp", "SKPSrc::draw", 7
51), | 74 FullStackFrame("dm/", "DMSrcSink.cpp", "SKPSrc::draw", 7
51), |
| 75 FullStackFrame("src/core/", "SkReader32.h", "eof", 38), | 75 FullStackFrame("src/core/", "SkReader32.h", "eof", 38), |
| 76 FullStackFrame("src/core/", "SkTaskGroup.cpp", "ThreadPo
ol::Wait", 88), | 76 FullStackFrame("src/core/", "SkTaskGroup.cpp", "ThreadPo
ol::Wait", 88), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 88 trace := ParseStackTrace("") | 88 trace := ParseStackTrace("") |
| 89 | 89 |
| 90 if !trace.IsEmpty() { | 90 if !trace.IsEmpty() { |
| 91 t.Errorf("Expected stacktrace to be empty but was %#v", trace) | 91 t.Errorf("Expected stacktrace to be empty but was %#v", trace) |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 | 94 |
| 95 func stacktrace(file string) string { | 95 func stacktrace(file string) string { |
| 96 return filepath.Join("stacktrace", file) | 96 return filepath.Join("stacktrace", file) |
| 97 } | 97 } |
| 98 | |
| 99 func TestParseDumpFilesCase0(t *testing.T) { | |
| 100 // Case 0, both debug and release dumped, due to an assertion error | |
| 101 debugDump := testutils.MustReadFile(stacktrace("case0_debug.dump")) | |
| 102 debugErr := testutils.MustReadFile(stacktrace("case0_debug.err")) | |
| 103 releaseDump := testutils.MustReadFile(stacktrace("case0_release.dump")) | |
| 104 releaseErr := testutils.MustReadFile(stacktrace("case0_release.err")) | |
| 105 | |
| 106 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 107 expectedFlags := DebugCrashed | ReleaseCrashed | DebugAssertionViolated
| ReleaseOther | |
| 108 if result.Flags != expectedFlags { | |
| 109 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 func TestParseDumpFilesCase1(t *testing.T) { | |
| 114 // Case 1, both debug and release exist with partial success | |
| 115 debugDump := "" | |
| 116 debugErr := testutils.MustReadFile(stacktrace("case1_debug.err")) | |
| 117 releaseDump := "" | |
| 118 releaseErr := testutils.MustReadFile(stacktrace("case1_release.err")) | |
| 119 | |
| 120 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 121 expectedFlags := DebugFailedGracefully | ReleaseFailedGracefully | |
| 122 | |
| 123 if result.Flags != expectedFlags { | |
| 124 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 func TestParseDumpFilesCase2(t *testing.T) { | |
| 129 // Case 2, debug dumped and hit an assertion, release timed out | |
| 130 debugDump := testutils.MustReadFile(stacktrace("case2_debug.dump")) | |
| 131 debugErr := testutils.MustReadFile(stacktrace("case2_debug.err")) | |
| 132 releaseDump := "" | |
| 133 releaseErr := "" | |
| 134 | |
| 135 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 136 expectedFlags := DebugCrashed | DebugAssertionViolated | ReleaseTimedOut | |
| 137 if result.Flags != expectedFlags { | |
| 138 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 func TestParseDumpFilesCase3(t *testing.T) { | |
| 143 // Case 3, both debug and release ran a bad malloc | |
| 144 debugDump := testutils.MustReadFile(stacktrace("case3_debug.dump")) | |
| 145 debugErr := testutils.MustReadFile(stacktrace("case3_debug.err")) | |
| 146 releaseDump := testutils.MustReadFile(stacktrace("case3_release.dump")) | |
| 147 releaseErr := testutils.MustReadFile(stacktrace("case3_release.err")) | |
| 148 | |
| 149 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 150 expectedFlags := DebugCrashed | DebugBadAlloc | ReleaseCrashed | Release
BadAlloc | |
| 151 if result.Flags != expectedFlags { | |
| 152 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 153 } | |
| 154 } | |
| 155 | |
| 156 func TestParseDumpFilesCase4(t *testing.T) { | |
| 157 // Case 4, both debug and release failed gracefully | |
| 158 debugDump := testutils.MustReadFile(stacktrace("case4_debug.dump")) | |
| 159 debugErr := testutils.MustReadFile(stacktrace("case4_debug.err")) | |
| 160 releaseDump := testutils.MustReadFile(stacktrace("case4_release.dump")) | |
| 161 releaseErr := testutils.MustReadFile(stacktrace("case4_release.err")) | |
| 162 | |
| 163 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 164 expectedFlags := DebugFailedGracefully | ReleaseFailedGracefully | |
| 165 if result.Flags != expectedFlags { | |
| 166 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 func TestParseDumpFilesCase5(t *testing.T) { | |
| 171 // Case 5, both debug and release crashed, but no stacktrace | |
| 172 debugDump := testutils.MustReadFile(stacktrace("case5_debug.dump")) | |
| 173 debugErr := testutils.MustReadFile(stacktrace("case5_debug.err")) | |
| 174 releaseDump := testutils.MustReadFile(stacktrace("case5_release.dump")) | |
| 175 releaseErr := testutils.MustReadFile(stacktrace("case5_release.err")) | |
| 176 | |
| 177 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 178 expectedFlags := DebugCrashed | ReleaseCrashed | DebugNoStackTrace | Rel
easeNoStackTrace | |
| 179 if result.Flags != expectedFlags { | |
| 180 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 181 } | |
| 182 } | |
| 183 | |
| 184 func TestParseDumpFilesCase6(t *testing.T) { | |
| 185 // Case 6, both debug and release timed out | |
| 186 debugDump := "" | |
| 187 debugErr := "" | |
| 188 releaseDump := "" | |
| 189 releaseErr := "" | |
| 190 | |
| 191 result := ParseFuzzResult(debugDump, debugErr, releaseDump, releaseErr) | |
| 192 expectedFlags := DebugTimedOut | ReleaseTimedOut | |
| 193 if result.Flags != expectedFlags { | |
| 194 t.Errorf("parsed Flags were wrong. Expected %s, but was %s", ex
pectedFlags.String(), result.Flags.String()) | |
| 195 } | |
| 196 } | |
| OLD | NEW |