// Package git is the minimal interface that Perf need to interact with a Git
// repo.
package git

import (
	"context"
	"regexp"
	"strings"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/git/testutils"
	"go.skia.org/infra/perf/go/config"
	"go.skia.org/infra/perf/go/git/gittest"
	"go.skia.org/infra/perf/go/git/provider"
	"go.skia.org/infra/perf/go/types"
)

func TestCockroachDB(t *testing.T) {
	for name, subTest := range subTests {
		t.Run(name, func(t *testing.T) {
			ctx, db, gb, hashes, _, instanceConfig := gittest.NewForTest(t)
			g, err := New(ctx, true, db, instanceConfig)
			require.NoError(t, err)

			subTest(t, ctx, g, gb, hashes)
		})
	}
}

// subTestFunction is a func we will call to test one aspect of *SQLTraceStore.
type subTestFunction func(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string)

// subTests are all the tests we have for *SQLTraceStore.
var subTests = map[string]subTestFunction{
	"testDetails_FailOnBadCommitNumber":                                                  testDetails_FailOnBadCommitNumber,
	"testDetails_Success":                                                                testDetails_Success,
	"testCommitSliceFromCommitNumberSlice_EmptyInputSlice_Success":                       testCommitSliceFromCommitNumberSlice_EmptyInputSlice_Success,
	"testCommitSliceFromCommitNumberSlice_Success":                                       testCommitSliceFromCommitNumberSlice_Success,
	"testUpdate_NewCommitsAreFoundFromGitHashAfterUpdate":                                testUpdate_NewCommitsAreFoundFromGitHashAfterUpdate,
	"testUpdate_UpdateCommitWithoutCommitPosition_NoCommitAddedToDB":                     testUpdate_UpdateCommitWithoutCommitPosition_NoCommitAddedToDB,
	"testCommitNumberFromGitHash_Success":                                                testCommitNumberFromGitHash_Success,
	"testCommitNumberFromGitHash_ErrorOnUnknownGitHash":                                  testCommitNumberFromGitHash_ErrorOnUnknownGitHash,
	"testCommitNumberFromTime_Success":                                                   testCommitNumberFromTime_Success,
	"testCommitNumberFromTime_ErrorOnTimeTooOld":                                         testCommitNumberFromTime_ErrorOnTimeTooOld,
	"testCommitNumberFromTime_SuccessOnZeroTime":                                         testCommitNumberFromTime_SuccessOnZeroTime,
	"testCommitSliceFromTimeRange_Success":                                               testCommitSliceFromTimeRange_Success,
	"testCommitSliceFromTimeRange_ZeroWidthRangeReturnsZeroResults":                      testCommitSliceFromTimeRange_ZeroWidthRangeReturnsZeroResults,
	"testCommitSliceFromTimeRange_NegativeWidthRangeReturnsZeroResults":                  testCommitSliceFromTimeRange_NegativeWidthRangeReturnsZeroResults,
	"testCommitSliceFromCommitNumberRange_Success":                                       testCommitSliceFromCommitNumberRange_Success,
	"testCommitSliceFromCommitNumberRange_ZeroWidthReturnsOneResult":                     testCommitSliceFromCommitNumberRange_ZeroWidthReturnsOneResult,
	"testCommitSliceFromCommitNumberRange_NegativeWidthReturnsZeroResults":               testCommitSliceFromCommitNumberRange_NegativeWidthReturnsZeroResults,
	"testGitHashFromCommitNumber_Success":                                                testGitHashFromCommitNumber_Success,
	"testGitHashFromCommitNumber_ErrWhenCommitDoesntExist":                               testGitHashFromCommitNumber_ErrWhenCommitDoesntExist,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_Success":                        testCommitNumbersWhenFileChangesInCommitNumberRange_Success,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_EmptySliceIfFileDoesntExist":    testCommitNumbersWhenFileChangesInCommitNumberRange_EmptySliceIfFileDoesntExist,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfBegin":        testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfBegin,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfEnd":          testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfEnd,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_ResultsWhenBeginEqualsEnd":      testCommitNumbersWhenFileChangesInCommitNumberRange_ResultsWhenBeginEqualsEnd,
	"testCommitNumbersWhenFileChangesInCommitNumberRange_HandlesZeroAsBeginCommitNumber": testCommitNumbersWhenFileChangesInCommitNumberRange_HandlesZeroAsBeginCommitNumber,
	"testLogEntry_Success":                                                               testLogEntry_Success,
	"testLogEntry_BadCommitId_ReturnsError":                                              testLogEntry_BadCommitId_ReturnsError,
	"testPreviousCommitNumberFromCommitNumber_Success":                                   testPreviousCommitNumberFromCommitNumber_Success,
	"testPreviousCommitNumberFromCommitNumber_UnknownCommit_Error":                       testPreviousCommitNumberFromCommitNumber_UnknownCommit_Error,
	"testPreviousCommitNumberFromCommitNumber_NoPreviousCommit_Error":                    testPreviousCommitNumberFromCommitNumber_NoPreviousCommit_Error,
	"testPreviousGitHashFromCommitNumber_Success":                                        testPreviousGitHashFromCommitNumber_Success,
	"testPreviousGitHashFromCommitNumber_UnknownCommit_Error":                            testPreviousGitHashFromCommitNumber_UnknownCommit_Error,
	"testPreviousGitHashFromCommitNumber_NoPreviousCommit_Error":                         testPreviousGitHashFromCommitNumber_NoPreviousCommit_Error,
}

func testUpdate_NewCommitsAreFoundFromGitHashAfterUpdate(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	// Add new commit to repo, it shouldn't appear in the database.
	newHash := gb.CommitGenAt(ctx, "foo.txt", gittest.StartTime.Add(4*time.Minute))
	_, err := g.CommitNumberFromGitHash(ctx, newHash)
	require.Error(t, err)

	// After Update step we should find it.
	err = g.Update(ctx)
	require.NoError(t, err)
	commitNumber, err := g.CommitNumberFromGitHash(ctx, newHash)
	assert.Equal(t, types.CommitNumber(len(hashes)), commitNumber)
}

func testUpdate_UpdateCommitWithoutCommitPosition_NoCommitAddedToDB(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	newHash := gb.CommitGenAt(ctx, "foo.txt", gittest.StartTime.Add(4*time.Minute))
	_, err := g.CommitNumberFromGitHash(ctx, newHash)
	require.Error(t, err)

	g.repoSuppliedCommitNumber = true
	g.commitNumberRegex = regexp.MustCompile("Cr-Commit-Position: refs/heads/(main|master)@\\{#(.*)\\}")
	err = g.Update(ctx)
	require.NoError(t, err)
	commitNumber, err := g.CommitNumberFromGitHash(ctx, newHash)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testCommitNumberFromGitHash_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber, err := g.CommitNumberFromGitHash(ctx, hashes[0])
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(0), commitNumber)
	commitNumber, err = g.CommitNumberFromGitHash(ctx, hashes[2])
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(2), commitNumber)
}

func testPreviousCommitNumberFromCommitNumber_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber, err := g.PreviousCommitNumberFromCommitNumber(ctx, types.CommitNumber(1))
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(0), commitNumber)
	commitNumber, err = g.PreviousCommitNumberFromCommitNumber(ctx, types.CommitNumber(7))
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(6), commitNumber)
}

func testPreviousCommitNumberFromCommitNumber_UnknownCommit_Error(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber, err := g.PreviousCommitNumberFromCommitNumber(ctx, types.BadCommitNumber)
	assert.Error(t, err)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testPreviousCommitNumberFromCommitNumber_NoPreviousCommit_Error(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber, err := g.PreviousCommitNumberFromCommitNumber(ctx, types.CommitNumber(0))
	assert.Error(t, err)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testPreviousGitHashFromCommitNumber_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	githash, err := g.PreviousGitHashFromCommitNumber(ctx, types.CommitNumber(1))
	assert.NoError(t, err)
	assert.Equal(t, hashes[0], githash)
	githash, err = g.PreviousGitHashFromCommitNumber(ctx, types.CommitNumber(6))
	assert.NoError(t, err)
	assert.Equal(t, hashes[5], githash)
}

func testPreviousGitHashFromCommitNumber_UnknownCommit_Error(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	githash, err := g.PreviousGitHashFromCommitNumber(ctx, types.BadCommitNumber)
	assert.Error(t, err)
	assert.Equal(t, "", githash)
}

func testPreviousGitHashFromCommitNumber_NoPreviousCommit_Error(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	githash, err := g.PreviousGitHashFromCommitNumber(ctx, types.CommitNumber(0))
	assert.Error(t, err)
	assert.Equal(t, "", githash)
}

func testDetails_FailOnBadCommitNumber(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	_, err := g.CommitFromCommitNumber(ctx, types.BadCommitNumber)
	require.Error(t, err)
}

func testDetails_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber := types.CommitNumber(1)
	assert.False(t, g.cache.Contains(commitNumber))
	commit, err := g.CommitFromCommitNumber(ctx, commitNumber)
	require.NoError(t, err)

	// The prefix of the URL will change, so just confirm it has the right suffix.
	require.True(t, strings.HasSuffix(commit.URL, commit.GitHash))

	assert.Equal(t, provider.Commit{
		Timestamp:    gittest.StartTime.Add(time.Minute).Unix(),
		GitHash:      hashes[1],
		Author:       "test <test@google.com>",
		Subject:      "501233450539197794",
		URL:          commit.URL,
		CommitNumber: commitNumber,
	}, commit)
	assert.True(t, g.cache.Contains(commitNumber))
}

func testCommitSliceFromCommitNumberSlice_EmptyInputSlice_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	resp, err := g.CommitSliceFromCommitNumberSlice(ctx, []types.CommitNumber{})
	require.NoError(t, err)
	assert.Empty(t, resp)
}

func testCommitSliceFromCommitNumberSlice_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumbers := []types.CommitNumber{1, 3}
	assert.False(t, g.cache.Contains(commitNumbers[0]))
	assert.False(t, g.cache.Contains(commitNumbers[1]))
	commits, err := g.CommitSliceFromCommitNumberSlice(ctx, commitNumbers)
	require.NoError(t, err)

	// The prefix of the URLs will change, so just confirm it has the right suffix.
	require.True(t, strings.HasSuffix(commits[0].URL, commits[0].GitHash))
	require.True(t, strings.HasSuffix(commits[1].URL, commits[1].GitHash))

	assert.Equal(t, provider.Commit{
		Timestamp:    gittest.StartTime.Add(time.Minute).Unix(),
		GitHash:      hashes[1],
		Author:       "test <test@google.com>",
		Subject:      "501233450539197794",
		URL:          commits[0].URL,
		CommitNumber: commitNumbers[0],
	}, commits[0])
	assert.Equal(t, provider.Commit{
		Timestamp:    gittest.StartTime.Add(3 * time.Minute).Unix(),
		GitHash:      hashes[3],
		Author:       "test <test@google.com>",
		Subject:      "6044372234677422456",
		URL:          commits[1].URL,
		CommitNumber: commitNumbers[1],
	}, commits[1])

	assert.True(t, g.cache.Contains(commitNumbers[0]))
	assert.True(t, g.cache.Contains(commitNumbers[1]))
}

func testCommitNumberFromGitHash_ErrorOnUnknownGitHash(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	_, err := g.CommitNumberFromGitHash(ctx, hashes[0]+"obviously_not_a_valid_hash")
	assert.Error(t, err)
}

func testCommitNumberFromTime_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	// Exact time of commit number 1. See gittest.NewForTest().
	commitNumber, err := g.CommitNumberFromTime(ctx, gittest.StartTime.Add(1*time.Minute))
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(1), commitNumber)

	// A second beyond commit number 1.
	commitNumber, err = g.CommitNumberFromTime(ctx, gittest.StartTime.Add(1*time.Minute+time.Second))
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(1), commitNumber)

	// A second before commit number 1.
	commitNumber, err = g.CommitNumberFromTime(ctx, gittest.StartTime.Add(1*time.Minute-time.Second))
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(0), commitNumber)
}

func testCommitNumberFromTime_SuccessOnZeroTime(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commitNumber, err := g.CommitNumberFromTime(ctx, time.Time{})
	assert.NoError(t, err)
	assert.Equal(t, types.CommitNumber(len(hashes)-1), commitNumber)
}

func testCommitNumberFromTime_ErrorOnTimeTooOld(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	_, err := g.CommitNumberFromTime(ctx, gittest.StartTime.Add(-1*time.Minute))
	require.Error(t, err)
}

func testCommitSliceFromTimeRange_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromTimeRange(ctx, gittest.StartTime.Add(1*time.Minute), gittest.StartTime.Add(3*time.Minute))
	require.NoError(t, err)
	assert.Len(t, commits, 2)
	assert.Equal(t, int64(1680000060), commits[0].Timestamp)
	assert.Equal(t, types.CommitNumber(1), commits[0].CommitNumber)
	assert.Equal(t, int64(1680000120), commits[1].Timestamp)
	assert.Equal(t, types.CommitNumber(2), commits[1].CommitNumber)
	assert.Contains(t, commits[1].URL, "+show/497e33d39ae58fa3339f67b9366f887a4c72871c")
}

func testCommitSliceFromTimeRange_ZeroWidthRangeReturnsZeroResults(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromTimeRange(ctx, gittest.StartTime.Add(1*time.Minute), gittest.StartTime.Add(1*time.Minute))
	require.NoError(t, err)
	assert.Empty(t, commits)
}

func testCommitSliceFromTimeRange_NegativeWidthRangeReturnsZeroResults(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromTimeRange(ctx, gittest.StartTime.Add(2*time.Minute), gittest.StartTime.Add(1*time.Minute))
	require.NoError(t, err)
	assert.Empty(t, commits)
}

func testCommitSliceFromCommitNumberRange_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromCommitNumberRange(ctx, 1, 2)
	require.NoError(t, err)
	require.Len(t, commits, 2)
	assert.Equal(t, int64(1680000060), commits[0].Timestamp)
	assert.Equal(t, types.CommitNumber(1), commits[0].CommitNumber)
	assert.Equal(t, int64(1680000120), commits[1].Timestamp)
	assert.Equal(t, types.CommitNumber(2), commits[1].CommitNumber)
}

func testCommitSliceFromCommitNumberRange_ZeroWidthReturnsOneResult(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromCommitNumberRange(ctx, 2, 2)
	require.NoError(t, err)
	require.Len(t, commits, 1)
	assert.Equal(t, int64(1680000120), commits[0].Timestamp)
	assert.Equal(t, types.CommitNumber(2), commits[0].CommitNumber)
}

func testCommitSliceFromCommitNumberRange_NegativeWidthReturnsZeroResults(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitSliceFromCommitNumberRange(ctx, 3, 2)
	require.NoError(t, err)
	require.Empty(t, commits)
}

func testGitHashFromCommitNumber_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	gitHash, err := g.GitHashFromCommitNumber(ctx, types.CommitNumber(2))
	require.NoError(t, err)
	assert.Equal(t, hashes[2], gitHash)
}

func testGitHashFromCommitNumber_ErrWhenCommitDoesntExist(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	_, err := g.GitHashFromCommitNumber(ctx, types.BadCommitNumber)
	require.Error(t, err)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(1), types.CommitNumber(7), "bar.txt")
	require.NoError(t, err)
	assert.Equal(t, []types.CommitNumber{3, 6}, commits)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_EmptySliceIfFileDoesntExist(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(1), types.CommitNumber(7), "this-file-doesnt-exist.txt")
	require.NoError(t, err)
	assert.Empty(t, commits)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfBegin(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(3), types.CommitNumber(7), "bar.txt")
	require.NoError(t, err)
	assert.Equal(t, []types.CommitNumber{3, 6}, commits)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_RangeIsInclusiveOfEnd(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(5), types.CommitNumber(6), "bar.txt")
	require.NoError(t, err)
	assert.Equal(t, []types.CommitNumber{6}, commits)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_ResultsWhenBeginEqualsEnd(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(6), types.CommitNumber(6), "bar.txt")
	require.NoError(t, err)
	assert.Equal(t, []types.CommitNumber{6}, commits)
}

func testCommitNumbersWhenFileChangesInCommitNumberRange_HandlesZeroAsBeginCommitNumber(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	commits, err := g.CommitNumbersWhenFileChangesInCommitNumberRange(ctx, types.CommitNumber(0), types.CommitNumber(4), "bar.txt")
	require.NoError(t, err)
	assert.Equal(t, []types.CommitNumber{3}, commits)
}

func testLogEntry_Success(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	got, err := g.LogEntry(ctx, types.CommitNumber(1))
	require.NoError(t, err)
	expected := `commit 881dfc43620250859549bb7e0301b6910d9b8e70
Author: test <test@google.com>
Date:   Tue Mar 28 10:41:00 2023 +0000

    501233450539197794
`
	require.Equal(t, expected, got)
}

func testLogEntry_BadCommitId_ReturnsError(t *testing.T, ctx context.Context, g *Git, gb *testutils.GitBuilder, hashes []string) {
	_, err := g.LogEntry(ctx, types.BadCommitNumber)
	require.Error(t, err)
}

func TestURLFromParts_DebounceCommitURL_Success(t *testing.T) {

	const debounceURL = "https://some.other.url.example.org"
	instanceConfig := &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{
			URL:              "https://skia.googlesource.com/skia",
			DebouceCommitURL: true,
		},
	}
	commit := provider.Commit{
		GitHash: "6079a7810530025d9877916895dd14eb8bb454c0",
		Subject: debounceURL,
	}
	assert.Equal(t, debounceURL, urlFromParts(instanceConfig, commit))
}

func TestURLFromParts_CommitURLSupplied_Success(t *testing.T) {

	instanceConfig := &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{
			URL:       "https://github.com/google/skia",
			CommitURL: "%s/commit/%s",
		},
	}
	commit := provider.Commit{
		GitHash: "6079a7810530025d9877916895dd14eb8bb454c0",
	}
	assert.Equal(t, "https://github.com/google/skia/commit/6079a7810530025d9877916895dd14eb8bb454c0", urlFromParts(instanceConfig, commit))
}

func TestURLFromParts_DefaultCommitURL_Success(t *testing.T) {

	instanceConfig := &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{
			URL: "https://skia.googlesource.com/skia",
		},
	}
	commit := provider.Commit{
		GitHash: "6079a7810530025d9877916895dd14eb8bb454c0",
	}
	assert.Equal(t, "https://skia.googlesource.com/skia/+show/6079a7810530025d9877916895dd14eb8bb454c0", urlFromParts(instanceConfig, commit))
}

func TestCommit_Display(t *testing.T) {

	c := provider.Commit{
		CommitNumber: 10223,
		GitHash:      "d261e1075a93677442fdf7fe72aba7e583863664",
		Timestamp:    1498176000,
		Author:       "Robert Phillips <robertphillips@google.com>",
		Subject:      "Re-enable opList dependency tracking",
		URL:          "https://skia.googlesource.com/skia/+show/d261e1075a93677442fdf7fe72aba7e583863664",
	}
	assert.Equal(t, "d261e10 -  2y 40w - Re-enable opList dependency tracking", c.Display(time.Date(2020, 04, 01, 0, 0, 0, 0, time.UTC)))
}

func TestGetCommitNumberFromGitLog(t *testing.T) {
	for name, subTest := range getCommitNumberSubTests {
		t.Run(name, func(t *testing.T) {
			ctx, db, _, _, _, instanceConfig := gittest.NewForTest(t)
			g, err := New(ctx, true, db, instanceConfig)
			require.NoError(t, err)

			g.commitNumberRegex = regexp.MustCompile("Cr-Commit-Position: refs/heads/(main|master)@\\{#(.*)\\}")

			subTest.SubTestFunction(t, subTest.body, g)
		})
	}
}

// getCommitNumberSubTestFunction is a func we will call to test one aspect of *SQLTraceStore.
type getCommitNumberSubTestFunction func(t *testing.T, body string, g *Git)

// subTests are all the tests we have for *SQLTraceStore.
var getCommitNumberSubTests = map[string]struct {
	SubTestFunction getCommitNumberSubTestFunction
	body            string
}{
	"testGetCommitNumberFromCommit_Master_Success": {testGetCommitNumberFromCommit_Master_Success, `Bug: 1030266
		Change-Id: I08e3f59e0a3d03ce77b6f669e1cfa1a72fae2ad1
		Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1985760
		Reviewed-by: Brian White \u003cbcwhite@chromium.org\u003e
		Commit-Queue: Michael van Ouwerkerk \u003cmvanouwerkerk@chromium.org\u003e
		Cr-Commit-Position: refs/heads/master@{#727989}
		`},
	"testGetCommitNumberFromCommit_Main_Success": {testGetCommitNumberFromCommit_Main_Success, `Bug: 1030266
		Change-Id: I08e3f59e0a3d03ce77b6f669e1cfa1a72fae2ad1
		Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1985760
		Reviewed-by: Brian White \u003cbcwhite@chromium.org\u003e
		Commit-Queue: Michael van Ouwerkerk \u003cmvanouwerkerk@chromium.org\u003e
		Cr-Commit-Position: refs/heads/main@{#727990}
		`},
	"testGetCommitNumberFromCommit_OtherBranch_ReturnsError": {testGetCommitNumberFromCommit_OtherBranch_ReturnsError, `Bug: 1030266
		Change-Id: I08e3f59e0a3d03ce77b6f669e1cfa1a72fae2ad1
		Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1985760
		Reviewed-by: Brian White \u003cbcwhite@chromium.org\u003e
		Commit-Queue: Michael van Ouwerkerk \u003cmvanouwerkerk@chromium.org\u003e
		Cr-Commit-Position: refs/heads/otherbranch@{#727990}
		`},
	"testGetCommitNumberFromCommit_NoCommitNumber_ReturnsError": {testGetCommitNumberFromCommit_NoCommitNumber_ReturnsError, `Bug: 1030266
		Change-Id: I08e3f59e0a3d03ce77b6f669e1cfa1a72fae2ad1
		`},
	"testGetCommitNumberFromCommit_InvalidCommitNumber_ReturnsError": {testGetCommitNumberFromCommit_InvalidCommitNumber_ReturnsError, `Bug: 1030266
		Change-Id: I08e3f59e0a3d03ce77b6f669e1cfa1a72fae2ad1
		Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1985760
		Reviewed-by: Brian White \u003cbcwhite@chromium.org\u003e
		Commit-Queue: Michael van Ouwerkerk \u003cmvanouwerkerk@chromium.org\u003e
		Cr-Commit-Position: refs/heads/master@{#727a989}
		`},
	"testGetCommitNumberFromCommit_MultipleCommitNumbers_GetTheLastCommitNumber": {testGetCommitNumberFromCommit_MultipleCommitNumbers_GetTheLastCommitNumber, `> Bug: 1411197
		> Bug: 1375174
		> Change-Id: I113036c11d2c29b902577220243001b818bc940f
		> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4173488
		> Reviewed-by: Yoshisato Yanagisawa <yyanagisawa@chromium.org>
		> Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
		> Reviewed-by: Shunya Shishido <sisidovski@chromium.org>
		> Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
		> Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
		> Reviewed-by: Kenichi Ishibashi <bashi@chromium.org>
		> Cr-Commit-Position: refs/heads/main@{#1100878}

		Bug: 1412756
		Bug: 1411197
		Bug: 1375174
		Change-Id: Ib03e7ceb51858576956dc713017adbe7b133be05
		Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4222534
		Reviewed-by: Kenichi Ishibashi <bashi@chromium.org>
		Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
		Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
		Reviewed-by: Shunya Shishido <sisidovski@chromium.org>
		Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
		Cr-Commit-Position: refs/heads/main@{#1101482}
		`},
}

func testGetCommitNumberFromCommit_Master_Success(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.NoError(t, err)
	assert.Equal(t, types.CommitNumber(727989), commitNumber)
}

func testGetCommitNumberFromCommit_Main_Success(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.NoError(t, err)
	assert.Equal(t, types.CommitNumber(727990), commitNumber)
}

func testGetCommitNumberFromCommit_OtherBranch_ReturnsError(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.Error(t, err)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testGetCommitNumberFromCommit_NoCommitNumber_ReturnsError(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.Error(t, err)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testGetCommitNumberFromCommit_InvalidCommitNumber_ReturnsError(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.Error(t, err)
	assert.Equal(t, types.BadCommitNumber, commitNumber)
}

func testGetCommitNumberFromCommit_MultipleCommitNumbers_GetTheLastCommitNumber(t *testing.T, body string, g *Git) {
	commitNumber, err := g.getCommitNumberFromCommit(body)
	require.NoError(t, err)
	assert.Equal(t, types.CommitNumber(1101482), commitNumber)
}
