package data

import (
	"path/filepath"
	"reflect"
	"testing"

	"go.skia.org/infra/fuzzer/go/common"
	"go.skia.org/infra/go/testutils"
)

func TestParseReleaseDump(t *testing.T) {
	testutils.SmallTest(t)
	testInput := testutils.MustReadFile("parse-catchsegv-release.dump")
	trace := parseCatchsegvStackTrace(testInput)
	expected := StackTrace{
		Frames: []StackTraceFrame{
			FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFlattenable", 344),
			FullStackFrame("src/core/", "SkReadBuffer.h", "readFlattenable", 130),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseBufferTag", 498),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStreamTag", 424),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStream", 580),
			FullStackFrame("src/core/", "SkPicture.cpp", "CreateFromStream", 153),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStreamTag", 392),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStream", 580),
			FullStackFrame("src/core/", "SkPicture.cpp", "CreateFromStream", 153),
			FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "tool_main", 41),
			FullStackFrame("", common.ASSEMBLY_CODE_FILE, "_start", -1),
		},
	}
	if !reflect.DeepEqual(expected, trace) {
		t.Errorf("Expected %#v\nbut was %#v", expected, trace)
		t.Errorf("Expected \n%s\nbut was \n%s", expected.String(), trace.String())
	}
}

func TestParseDebugDump(t *testing.T) {
	testutils.SmallTest(t)
	testInput := testutils.MustReadFile("parse-catchsegv-debug.dump")

	trace := parseCatchsegvStackTrace(testInput)

	expected := StackTrace{
		Frames: []StackTraceFrame{
			FullStackFrame("src/core/", "SkReadBuffer.cpp", "readFlattenable", 343),
			FullStackFrame("src/core/", "SkReadBuffer.h", "readFlattenable", 130),
			FullStackFrame("src/core/", "SkReadBuffer.h", "readPathEffect", 136),
			FullStackFrame("src/core/", "SkPaint.cpp", "unflatten", 1971),
			FullStackFrame("src/core/", "SkReadBuffer.h", "readPaint", 126),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseBufferTag", 498),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStreamTag", 424),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStream", 580),
			FullStackFrame("src/core/", "SkPictureData.cpp", "CreateFromStream", 553),
			FullStackFrame("src/core/", "SkPicture.cpp", "CreateFromStream", 153),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStreamTag", 392),
			FullStackFrame("src/core/", "SkPictureData.cpp", "parseStream", 580),
			FullStackFrame("src/core/", "SkPictureData.cpp", "CreateFromStream", 553),
			FullStackFrame("src/core/", "SkPicture.cpp", "CreateFromStream", 153),
			FullStackFrame("src/core/", "SkPicture.cpp", "CreateFromStream", 142),
			FullStackFrame("fuzzer_cache/src/", "parseskp.cpp", "tool_main", 41),
			FullStackFrame("", common.ASSEMBLY_CODE_FILE, "_start", -1),
		},
	}

	if !reflect.DeepEqual(expected, trace) {
		t.Errorf("Expected %#v\nbut was %#v", expected, trace)
		t.Errorf("Expected \n%s\nbut was \n%s", expected.String(), trace.String())
	}
}

func TestParsingEdgeCases(t *testing.T) {
	testutils.SmallTest(t)
	// This is a made up dump that has the edge cases for parsing function names.
	testInput := testutils.MustReadFile("parse-catchsegv-edge.dump")
	trace := parseCatchsegvStackTrace(testInput)
	expected := StackTrace{
		Frames: []StackTraceFrame{
			FullStackFrame("src/codec/", "SkMasks.cpp", "convert_to_8", 54),
			FullStackFrame("src/codec/", "SkBmpMaskCodec.cpp", "decodeRows", 93),
			FullStackFrame("src/core/", "SkClipStack.cpp", "Element::updateBoundAndGenID", 483),
			FullStackFrame("src/core/", "SkClipStack.cpp", "pushElement", 719),
			FullStackFrame("dm/", "DMSrcSink.cpp", "SKPSrc::draw", 751),
			FullStackFrame("src/core/", "SkReader32.h", "eof", 38),
			FullStackFrame("src/core/", "SkTaskGroup.cpp", "ThreadPool::Wait", 88),
			FullStackFrame("fuzz/", "fuzz.cpp", "fuzz_img", 110),
			FullStackFrame("", common.ASSEMBLY_CODE_FILE, "_start", -1),
		},
	}

	if !reflect.DeepEqual(expected, trace) {
		t.Errorf("Expected %#v\nbut was %#v", expected, trace)
		t.Errorf("Expected \n%s\nbut was \n%s", expected.String(), trace.String())
	}
}

func TestParseASANSingle(t *testing.T) {
	testutils.SmallTest(t)
	testInput := testutils.MustReadFile("parse-asan-single.asan")

	trace := parseASANStackTrace(testInput)

	expected := StackTrace{
		Frames: []StackTraceFrame{
			FullStackFrame("src/codec/", "SkMasks.cpp", "convert_to_8", 54),
			FullStackFrame("src/codec/", "SkMaskSwizzler.cpp", "swizzle_mask24_to_n32_opaque", 93),
			FullStackFrame("src/codec/", "SkBmpMaskCodec.cpp", "SkBmpMaskCodec::decodeRows", 103),
			FullStackFrame("third_party/externals/piex/src/", "piex.cc", "piex::GetPreviewData", 59),
			FullStackFrame("third_party/externals/piex/src/", "piex.cc", "piex::GetPreviewData", 68),
			FullStackFrame("fuzz/", "fuzz.cpp", "fuzz_img", 119),
			FullStackFrame("fuzz/", "fuzz.cpp", "main", 53),
			FullStackFrame("", common.ASSEMBLY_CODE_FILE, "_start", common.UNKNOWN_LINE),
		},
	}

	if !reflect.DeepEqual(expected, trace) {
		t.Errorf("Expected %#v\nbut was %#v", expected, trace)
		t.Errorf("Expected %s \n but was %s", expected.String(), trace.String())
	}
}

func TestParseASANDouble(t *testing.T) {
	testutils.SmallTest(t)
	testInput := testutils.MustReadFile("parse-asan-double.asan")

	trace := parseASANStackTrace(testInput)

	expected := StackTrace{
		Frames: []StackTraceFrame{
			FullStackFrame("src/core/", "SkReader32.h", "SkReader32::readInt_asan", 57),
			FullStackFrame("src/core/", "SkPicturePlayback.cpp", "SkPicturePlayback::handleOp", 151),
			FullStackFrame("src/core/", "SkPicturePlayback.cpp", "SkPicturePlayback::draw", 111),
			FullStackFrame("src/core/", "SkPicture.cpp", "SkPicture::Forwardport", 137),
			FullStackFrame("src/core/", "SkPicture.cpp", "SkPicture::CreateFromStream", 154),
			FullStackFrame("fuzz/", "fuzz.cpp", "fuzz_skp", 143),
			FullStackFrame("fuzz/", "fuzz.cpp", "main", 54),
			FullStackFrame("", common.ASSEMBLY_CODE_FILE, "_start", common.UNKNOWN_LINE),
		},
	}

	if !reflect.DeepEqual(expected, trace) {
		t.Errorf("Expected %#v\nbut was %#v", expected, trace)
		t.Errorf("Expected %s \n but was %s", expected.String(), trace.String())
	}
}

func TestParseEmptyStackTrace(t *testing.T) {
	testutils.SmallTest(t)
	trace := parseCatchsegvStackTrace("")

	if !trace.IsEmpty() {
		t.Errorf("Expected stacktrace to be empty but was %#v", trace)
	}
}

func stacktrace(file string) string {
	return filepath.Join("stacktrace", file)
}

var NO_STACKTRACES = map[string]string{"CLANG_DEBUG": "", "CLANG_RELEASE": "", "ASAN_DEBUG": "", "ASAN_RELEASE": ""}

func assertExpectations(t *testing.T, result FuzzResult, ef map[string]FuzzFlag, est map[string]string) {
	for c, expectedFlags := range ef {
		if flags := result.Configs[c].Flags; flags != expectedFlags {
			t.Errorf("Parsed %s flags were wrong.  Expected %s, but was %s", c, expectedFlags.String(), flags.String())
		}
	}
	for c, expectedTopTrace := range est {
		if st := result.Configs[c].StackTrace; expectedTopTrace == "" {
			if !st.IsEmpty() {
				t.Errorf("Config %s should not have had empty stacktrace for %s: st", c, st.String())
			}
		} else if st.IsEmpty() {
			t.Errorf("Empty stacktrace found in config %s, where one should not have been: %#v", c, st)
		} else if st.Frames[0].String() != expectedTopTrace {
			t.Errorf("parsed stacktrace for config %s is wrong %s \n %s", c, expectedTopTrace, st.String())
		}
	}
}

func TestParseGCSPackage_Grey(t *testing.T) {
	testutils.SmallTest(t)
	// Everything was successful or partially successful
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("0grey_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("0grey_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("0grey_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("0grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    TerminatedGracefully,
		"ASAN_RELEASE":  TerminatedGracefully,
	}
	assertExpectations(t, result, expectations, nil)
}

func TestParseGCSPackage_GlobalStackOverflow(t *testing.T) {
	testutils.SmallTest(t)
	// Both debug/release crashed with a stackoverflow.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("1bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("1grey_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("1bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("1grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    ASANCrashed | ASAN_GlobalBufferOverflow,
		"ASAN_RELEASE":  ASANCrashed | ASAN_GlobalBufferOverflow,
	}

	topTrace := map[string]string{
		"CLANG_DEBUG":   "",
		"CLANG_RELEASE": "",
		"ASAN_DEBUG":    "src/codec/SkMasks.cpp:54 convert_to_8",
		"ASAN_RELEASE":  "src/codec/SkMasks.cpp:55 convert_to_8",
	}
	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_AssertDuringRendering(t *testing.T) {
	testutils.SmallTest(t)
	// Debug assert hit.  Release heap buffer overflow in only ASAN
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("2bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("2bad_debug.dump")),
					"stderr": testutils.MustReadFile(stacktrace("2bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("2bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("2grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   AssertionViolated | ClangCrashed,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    ASANCrashed | AssertionViolated,
		"ASAN_RELEASE":  ASANCrashed | ASAN_HeapBufferOverflow,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "src/core/SkReader32.h:87 skip",
		"CLANG_RELEASE": "",
		"ASAN_DEBUG":    "src/core/SkReader32.h:87 SkReader32::skip",
		"ASAN_RELEASE":  "src/core/SkReader32.h:57 SkReader32::readInt",
	}

	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_UseAfterFree(t *testing.T) {
	testutils.SmallTest(t)
	// Debug ClangCrashed.  Release heap use after free.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("3grey_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("3bad_debug.dump")),
					"stderr": "",
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("3bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("3bad_release.dump")),
					"stderr": "",
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   ClangCrashed,
		"CLANG_RELEASE": ClangCrashed,
		"ASAN_DEBUG":    TerminatedGracefully,
		"ASAN_RELEASE":  ASANCrashed | ASAN_HeapUseAfterFree,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "src/codec/SkMasks.cpp:55 convert_to_8_dump",
		"CLANG_RELEASE": "src/codec/SkMasks.cpp:54 convert_to_8_dump",
		"ASAN_DEBUG":    "",
		"ASAN_RELEASE":  "src/codec/SkMasks.cpp:54 convert_to_8_asan",
	}

	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_TimeOut(t *testing.T) {
	testutils.SmallTest(t)
	// Everything timed out on analysis
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("4bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("4bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("4bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("4bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TimedOut,
		"CLANG_RELEASE": TimedOut,
		"ASAN_DEBUG":    TimedOut,
		"ASAN_RELEASE":  TimedOut,
	}

	assertExpectations(t, result, expectations, NO_STACKTRACES)
}

func TestParseGCSPackage_BadAlloc(t *testing.T) {
	testutils.SmallTest(t)
	// Everything was a bad:alloc
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("5bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("5bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("5bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("5bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   BadAlloc,
		"CLANG_RELEASE": BadAlloc,
		"ASAN_DEBUG":    BadAlloc,
		"ASAN_RELEASE":  BadAlloc,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "",
		"CLANG_RELEASE": "",
		"ASAN_DEBUG":    "src/core/SkPictureData.cpp:377 SkPictureData::parseStreamTag",
		"ASAN_RELEASE":  "src/core/SkPictureData.cpp:378 SkPictureData::parseStreamTag",
	}

	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_EmptyStacktrace(t *testing.T) {
	testutils.SmallTest(t)
	// According to AddressSanitizer, both crashed while trying to report a bug.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("6bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("6bad_debug.dump")),
					"stderr": testutils.MustReadFile(stacktrace("6bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("6bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("6bad_release.dump")),
					"stderr": testutils.MustReadFile(stacktrace("6bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   NoStackTrace | ClangCrashed,
		"CLANG_RELEASE": NoStackTrace | ClangCrashed,
		"ASAN_DEBUG":    NoStackTrace | ASANCrashed,
		"ASAN_RELEASE":  NoStackTrace | ASANCrashed,
	}

	assertExpectations(t, result, expectations, NO_STACKTRACES)
}

func TestParseGCSPackage_SKAbort(t *testing.T) {
	testutils.SmallTest(t)
	// According to AddressSanitizer, both crashed while trying to report a bug.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("7bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("7bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("7bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("7bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   SKAbortHit,
		"CLANG_RELEASE": SKAbortHit,
		"ASAN_DEBUG":    SKAbortHit,
		"ASAN_RELEASE":  SKAbortHit,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "src/core/SkPictureData.cpp:362 UNKNOWN",
		"CLANG_RELEASE": "src/core/SkPictureData.cpp:364 UNKNOWN",
		"ASAN_DEBUG":    "src/core/SkPictureData.cpp:361 UNKNOWN",
		"ASAN_RELEASE":  "src/core/SkPictureData.cpp:363 UNKNOWN",
	}

	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_SKBoring(t *testing.T) {
	testutils.SmallTest(t)
	// Everything triggered SkBoring.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("8grey_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("8grey_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("8grey_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("8grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    TerminatedGracefully,
		"ASAN_RELEASE":  TerminatedGracefully,
	}
	assertExpectations(t, result, expectations, NO_STACKTRACES)
}

func TestParseGCSPackage_ClangDumpedNoSymbols(t *testing.T) {
	testutils.SmallTest(t)
	// Release dumped for Clang only, and there were no symbols. Also, only Clang hit the assert.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("9bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("9bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("9bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("9bad_release.dump")),
					"stderr": testutils.MustReadFile(stacktrace("9bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": ClangCrashed,
		"ASAN_DEBUG":    SKAbortHit,
		"ASAN_RELEASE":  TerminatedGracefully,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "",
		"CLANG_RELEASE": "UNSYMBOLIZEDUNSYMBOLIZED:-1 LinearGradientContext::shade4_dx_clamp",
		"ASAN_DEBUG":    "src/effects/gradients/SkLinearGradient.cpp:496 UNKNOWN",
		"ASAN_RELEASE":  "",
	}
	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_BadAllocNoCrash(t *testing.T) {
	testutils.SmallTest(t)
	// Bad alloc, but no stack trace, only the last frame.
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("10debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("10debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("10release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("10release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   BadAlloc,
		"CLANG_RELEASE": BadAlloc,
		"ASAN_DEBUG":    BadAlloc,
		"ASAN_RELEASE":  BadAlloc,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "",
		"CLANG_RELEASE": "",
		"ASAN_DEBUG":    "src/core/SkPictureData.cpp:392 UNKNOWN",
		"ASAN_RELEASE":  "src/core/SkPictureData.cpp:377 SkPictureData::parseStreamTag",
	}
	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_AssemblyCrash(t *testing.T) {
	testutils.SmallTest(t)
	// The crash was in a line of assembly code, which lacks file information
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("11bad_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("11bad_debug.dump")),
					"stderr": testutils.MustReadFile(stacktrace("11bad_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("11bad_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("11bad_release.dump")),
					"stderr": testutils.MustReadFile(stacktrace("11bad_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   ClangCrashed,
		"CLANG_RELEASE": ClangCrashed,
		"ASAN_DEBUG":    ASANCrashed,
		"ASAN_RELEASE":  ASANCrashed,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "[assembly code]:-1 _sk_evenly_spaced_gradient_sse2",
		"CLANG_RELEASE": "[assembly code]:-1 _sk_evenly_spaced_gradient_sse2",
		"ASAN_DEBUG":    "[assembly code]:-1 _sk_evenly_spaced_gradient_sse2",
		"ASAN_RELEASE":  "[assembly code]:-1 _sk_evenly_spaced_gradient_sse2",
	}
	assertExpectations(t, result, expectations, topTrace)
}

func TestParseGCSPackage_StdoutButNoCrash(t *testing.T) {
	testutils.SmallTest(t)
	// There is stuff in dump, but it isn't a crash, so don't say it is
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("12grey_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("12grey_debug.dump")),
					"stderr": testutils.MustReadFile(stacktrace("12grey_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("12grey_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": testutils.MustReadFile(stacktrace("12grey_release.dump")),
					"stderr": testutils.MustReadFile(stacktrace("12grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    TerminatedGracefully,
		"ASAN_RELEASE":  TerminatedGracefully,
	}
	assertExpectations(t, result, expectations, NO_STACKTRACES)
	if result.IsGrey() != true {
		t.Errorf("Should have been categorized as grey!")
	}
}

func TestParseGCSPackage_ASAN_OOM(t *testing.T) {
	testutils.SmallTest(t)
	// ASAN ran out of memory - grey
	g := GCSPackage{
		Files: map[string]OutputFiles{
			"ASAN_DEBUG": {
				Key: "ASAN_DEBUG",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("13grey_debug.asan")),
				},
			},
			"CLANG_DEBUG": {
				Key: "CLANG_DEBUG",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("13grey_debug.err")),
				},
			},
			"ASAN_RELEASE": {
				Key: "ASAN_RELEASE",
				Content: map[string]string{
					"stderr": testutils.MustReadFile(stacktrace("13grey_release.asan")),
				},
			},
			"CLANG_RELEASE": {
				Key: "CLANG_RELEASE",
				Content: map[string]string{
					"stdout": "",
					"stderr": testutils.MustReadFile(stacktrace("13grey_release.err")),
				},
			},
		},
		FuzzCategory:     "skcodec",
		FuzzArchitecture: "mock_arm8",
	}

	result := ParseGCSPackage(g)
	expectations := map[string]FuzzFlag{
		"CLANG_DEBUG":   TerminatedGracefully,
		"CLANG_RELEASE": TerminatedGracefully,
		"ASAN_DEBUG":    BadAlloc,
		"ASAN_RELEASE":  BadAlloc,
	}
	topTrace := map[string]string{
		"CLANG_DEBUG":   "",
		"CLANG_RELEASE": "",
		"ASAN_DEBUG":    "include/c++/v1/memory:1548 std::__1::allocator_traits",
		"ASAN_RELEASE":  "include/c++/v1/memory:1548 std::__1::allocator_traits",
	}
	assertExpectations(t, result, expectations, topTrace)
	if result.IsGrey() != true {
		t.Errorf("Should have been categorized as grey!")
	}
}
