package gerrit

import (
	"context"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/mockhttpclient"
)

const (
	// Flip this boolean to run the below E2E Gerrit tests. Requires a valid
	// ~/.gitcookies file.
	RUN_GERRIT_TESTS = false
)

var (
	// http.Client used for testing.
	c = httputils.NewTimeoutClient()
)

func skipTestIfRequired(t *testing.T) {
	if !RUN_GERRIT_TESTS {
		t.Skip("Skipping test due to RUN_GERRIT_TESTS=false")
	}
}

func TestHasOpenDependency(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	dep, err := api.HasOpenDependency(context.Background(), 52160, 1)
	require.NoError(t, err)
	require.False(t, dep)

	dep2, err := api.HasOpenDependency(context.Background(), 52123, 1)
	require.NoError(t, err)
	require.True(t, dep2)
}

func TestGerritOwnerModifiedSearch(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	tDelta := time.Now().Add(-10 * 24 * time.Hour)
	issues, err := api.Search(context.Background(), 1, true, SearchModifiedAfter(tDelta), SearchOwner("rmistry@google.com"))
	require.NoError(t, err)
	require.True(t, len(issues) > 0)

	for _, issue := range issues {
		details, err := api.GetIssueProperties(context.Background(), issue.Issue)
		require.NoError(t, err)
		require.True(t, details.Updated.After(tDelta))
		require.True(t, len(details.Patchsets) > 0)
		require.Equal(t, "rmistry@google.com", details.Owner.Email)
	}

	issues, err = api.Search(context.Background(), 2, true, SearchModifiedAfter(time.Now().Add(-time.Hour)))
	require.NoError(t, err)
}

func TestGerritCommitSearch(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	issues, err := api.Search(context.Background(), 1, true, SearchCommit("a2eb235a16ed430896cc54989e683cf930319eb7"))
	require.NoError(t, err)
	require.Equal(t, 1, len(issues))

	for _, issue := range issues {
		details, err := api.GetIssueProperties(context.Background(), issue.Issue)
		require.NoError(t, err)
		require.Equal(t, 5, len(details.Patchsets))
		require.Equal(t, "rmistry@google.com", details.Owner.Email)
		require.Equal(t, "I37876c6f62c85d0532b22dcf8bea8b4e7f4147c0", details.ChangeId)
		require.True(t, details.Committed)
		require.Equal(t, "Skia Gerrit 10k!", details.Subject)
	}
}

// It is a little different to test the poller. Enable this to turn on the
// poller and test removing issues from it.
func GerritPollerTest(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	cache := NewCodeReviewCache(api, 10*time.Second, 3)
	fmt.Println(cache.Get(2386))
	c1 := ChangeInfo{
		Issue: 2386,
	}
	cache.Add(2386, &c1)
	fmt.Println(cache.Get(2386))
	time.Sleep(time.Hour)
}

func TestGetPatch(t *testing.T) {
	ctx := context.Background()

	const issue = 2370
	const revision = "current"
	const response = "From d63a4c4de93bb97fcb52e1562fb03b773143edfd Mon Sep 17 00:00:00 2001\nFrom: Ravi Mistry <rmistry@google.com>\nDate: Fri, 09 Sep 2016 15:50:50 -0400\nSubject: [PATCH] Test  (should fail apply_gerrit)\n\nBUG=skia:\n\nChange-Id: Ibd49ce0e9f07bf5386f710df4621ff68f12e6ceb\n---\n\ndiff --git a/whitespace.txt b/whitespace.txt\nindex c0f0a49..d5733b3 100644\n--- a/whitespace.txt\n+++ b/whitespace.txt\n@@ -1,4 +1,5 @@\n testing\n+\n  \n \n \n"

	url := fmt.Sprintf("%s/a/changes/%d/revisions/%s/patch", GerritSkiaURL, issue, revision)
	urlmock := mockhttpclient.NewURLMock()
	urlmock.MockOnce(url, mockhttpclient.MockGetDialogue([]byte(base64.StdEncoding.EncodeToString([]byte(response)))))
	c := urlmock.Client()

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	patch, err := api.GetPatch(ctx, issue, revision, "")
	require.NoError(t, err)

	// Note: The trailing spaces and newlines were added this way
	// because editor plug-ins remove white spaces from the raw string.
	expected := `

diff --git a/whitespace.txt b/whitespace.txt
index c0f0a49..d5733b3 100644
--- a/whitespace.txt
+++ b/whitespace.txt
@@ -1,4 +1,5 @@
 testing
+` + "\n  \n \n \n"

	require.Equal(t, expected, patch)
}

func TestGetPatch_WithPath(t *testing.T) {
	ctx := context.Background()

	const issue = 2370
	const revision = "current"
	const path = "whitespace.txt"
	const response = "diff --git a/whitespace.txt b/whitespace.txt\nindex c0f0a49..d5733b3 100644\n--- a/whitespace.txt\n+++ b/whitespace.txt\n@@ -1,4 +1,5 @@\n testing\n+\n  \n \n \n"

	url := fmt.Sprintf("%s/a/changes/%d/revisions/%s/patch?path=%s", GerritSkiaURL, issue, revision, path)
	urlmock := mockhttpclient.NewURLMock()
	urlmock.MockOnce(url, mockhttpclient.MockGetDialogue([]byte(base64.StdEncoding.EncodeToString([]byte(response)))))
	c := urlmock.Client()

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	patch, err := api.GetPatch(ctx, issue, revision, path)
	require.NoError(t, err)

	// Note: The trailing spaces and newlines were added this way
	// because editor plug-ins remove white spaces from the raw string.
	const expected = `diff --git a/whitespace.txt b/whitespace.txt
index c0f0a49..d5733b3 100644
--- a/whitespace.txt
+++ b/whitespace.txt
@@ -1,4 +1,5 @@
 testing
+` + "\n  \n \n \n"

	require.Equal(t, expected, patch)
}

func TestAddCC(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.AddCC(context.Background(), changeInfo, []string{"test-user1@google.com", "test-user2@google.com"})
	require.NoError(t, err)
}

func TestAddComment(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.AddComment(context.Background(), changeInfo, "Testing API!!")
	require.NoError(t, err)
}

func TestSendToDryRun(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Send to dry run.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCommitQueue].DefaultValue
	err = api.SendToDryRun(context.Background(), changeInfo, "Sending to dry run")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was sent to dry run.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 1, changeInfo.Labels[LabelCommitQueue].All[0].Value)

	// Remove from dry run.
	err = api.RemoveFromCQ(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change was removed from dry run.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCommitQueue].All[0].Value)
}

func TestSendToCQ(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Send to CQ.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCommitQueue].DefaultValue
	err = api.SendToCQ(context.Background(), changeInfo, "Sending to CQ")
	require.NoError(t, err)

	// Wait for a few seconds for the above to take place.
	time.Sleep(5 * time.Second)

	// Verify that the change was sent to CQ.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 2, changeInfo.Labels[LabelCommitQueue].All[0].Value)

	// Remove from CQ.
	err = api.RemoveFromCQ(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change was removed from CQ.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCommitQueue].All[0].Value)
}

func TestApprove(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Approve.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCodeReview].DefaultValue
	err = api.Approve(context.Background(), changeInfo, "LGTM")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was approved.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 1, changeInfo.Labels[LabelCodeReview].All[0].Value)

	// Remove approval.
	err = api.NoScore(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change has no score.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCodeReview].All[0].Value)
}

func TestReadOnlyFailure(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Approve.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.Approve(context.Background(), changeInfo, "LGTM")
	require.Error(t, err)
}

func TestDisApprove(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// DisApprove.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCodeReview].DefaultValue
	err = api.Disapprove(context.Background(), changeInfo, "not LGTM")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was disapproved.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, -1, changeInfo.Labels[LabelCodeReview].All[0].Value)

	// Remove disapproval.
	err = api.NoScore(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change has no score.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCodeReview].All[0].Value)
}

func TestAbandon(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)
	c1 := ChangeInfo{
		ChangeId: "Idb96a747c8446126f60fdf1adca361dbc2e539d5",
	}
	err = api.Abandon(context.Background(), &c1, "Abandoning this CL")
	require.Error(t, err, "Got status 409 Conflict (409)")
}

func TestGetAbandonReason(t *testing.T) {

	// Messages that will be used by tests.
	msgWithAbandonFromUser := ChangeInfoMessage{
		Tag:     "something",
		Message: "Abandoned",
	}
	msgWithAbandonAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Abandoned",
	}
	msgWithAbandonPrefixAndMsgAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Abandoned\n\nTesting testing",
	}
	msgWithNoPrefixAndMsgAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Something",
	}

	tests := []struct {
		status                string
		messages              []ChangeInfoMessage
		expectedAbandonReason string
		failureMessage        string
	}{
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonPrefixAndMsgAutogenerated},
			expectedAbandonReason: "Testing testing",
			failureMessage:        "autogenerated abandon messages with prefix should return message without prefix",
		},
		{
			status:                ChangeStatusNew,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonPrefixAndMsgAutogenerated},
			expectedAbandonReason: "",
			failureMessage:        "non-abandoned changes have no abandon message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonAutogenerated},
			expectedAbandonReason: "",
			failureMessage:        "autogenerated abandon messages with only prefix should return an empty message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithNoPrefixAndMsgAutogenerated},
			expectedAbandonReason: "Something",
			failureMessage:        "autogenerated abandon messages with no prefix should return the specified message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser},
			expectedAbandonReason: "",
			failureMessage:        "abandon messages from users are ignored"},
	}
	for _, test := range tests {
		changeInfo := ChangeInfo{
			Status:   test.status,
			Messages: test.messages,
		}
		require.Equal(t, test.expectedAbandonReason, changeInfo.GetAbandonReason(context.Background()), test.failureMessage)
	}
}

func TestFiles(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  },
  "BUILD.gn": {
    "lines_inserted": 20,
    "lines_deleted": 5,
    "size_delta": 531,
    "size": 50072
  },
  "include/gpu/vk/GrVkDefines.h": {
    "lines_inserted": 28,
    "lines_deleted": 21,
    "size_delta": 383,
    "size": 1615
  },
  "tools/gpu/vk/GrVulkanDefines.h": {
    "status": "A",
    "lines_inserted": 33,
    "size_delta": 861,
    "size": 861
  }
}`)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	files, err := api.Files(context.Background(), 12345678, "current")
	require.NoError(t, err)
	require.Len(t, files, 4)
	require.Contains(t, files, "/COMMIT_MSG")
	require.Equal(t, 353, files["/COMMIT_MSG"].Size)
	require.Contains(t, files, "tools/gpu/vk/GrVulkanDefines.h")
	require.Equal(t, 33, files["tools/gpu/vk/GrVulkanDefines.h"].LinesInserted)

	files, err = api.Files(context.Background(), 12345678, "alert()")
	require.Error(t, err)
}

func TestGetFileNames(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  },
  "BUILD.gn": {
    "lines_inserted": 20,
    "lines_deleted": 5,
    "size_delta": 531,
    "size": 50072
  },
  "include/gpu/vk/GrVkDefines.h": {
    "lines_inserted": 28,
    "lines_deleted": 21,
    "size_delta": 383,
    "size": 1615
  },
  "tools/gpu/vk/GrVulkanDefines.h": {
    "status": "A",
    "lines_inserted": 33,
    "size_delta": 861,
    "size": 861
  }
}`)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	files, err := api.GetFileNames(context.Background(), 12345678, "current")
	require.NoError(t, err)
	require.Len(t, files, 4)
	require.Contains(t, files, "/COMMIT_MSG")
	require.Contains(t, files, "tools/gpu/vk/GrVulkanDefines.h")
}

func TestGetFilesToContent(t *testing.T) {

	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path == "/a/changes/123/revisions/current/files" {
			w.Header().Set("Content-Type", "application/json")
			_, err := fmt.Fprintln(w, `)]}'
{
  "dir1/file1": {},
  "file2": {},
  "file3": {}
}`)
			require.NoError(t, err)
		} else if r.URL.Path == "/a/changes/123/revisions/current/files/dir1/file1/content" {
			w.Header().Set("Content-Type", "text/plain")
			_, err := fmt.Fprintln(w, base64.StdEncoding.EncodeToString([]byte("xyz")))
			require.NoError(t, err)
		} else if r.URL.Path == "/a/changes/123/revisions/current/files/file2/content" {
			w.Header().Set("Content-Type", "text/plain")
			_, err := fmt.Fprintln(w, base64.StdEncoding.EncodeToString([]byte("xyz abc")))
			require.NoError(t, err)
		} else if r.URL.Path == "/a/changes/123/revisions/current/files/file3/content" {
			http.Error(w, "404 Not Found", http.StatusNotFound)
		}
	}))
	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	ci := &ChangeInfo{Issue: int64(123)}
	filesToContent, err := api.GetFilesToContent(context.Background(), ci.Issue, "current")
	require.NoError(t, err)
	require.Len(t, filesToContent, 3)
	require.Equal(t, "xyz", filesToContent["dir1/file1"])
	require.Equal(t, "xyz abc", filesToContent["file2"])
	require.Equal(t, "", filesToContent["file3"])
}

func TestSubmittedTogether(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
	"changes": [
		{
			"id": "change1"
		},
		{
			"id": "change2"
		}
	],
	"non_visible_changes": 1
}`)
		require.NoError(t, err)
	}))
	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	ci := &ChangeInfo{Issue: int64(123)}
	submittedTogether, nonVisible, err := api.SubmittedTogether(context.Background(), ci)
	require.NoError(t, err)
	require.Len(t, submittedTogether, 2)
	require.Equal(t, "change1", submittedTogether[0].Id)
	require.Equal(t, "change2", submittedTogether[1].Id)
	require.Equal(t, 1, nonVisible)
}

func TestIsBinaryPatch(t *testing.T) {

	tsNoBinary := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  }
}`)
		require.NoError(t, err)
	}))
	defer tsNoBinary.Close()
	api, err := NewGerritWithConfig(ConfigChromium, tsNoBinary.URL, c)
	require.NoError(t, err)
	isBinaryPatch, err := api.IsBinaryPatch(context.Background(), 4649, "3")
	require.NoError(t, err)
	require.False(t, isBinaryPatch)

	tsBinary := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 15,
    "size_delta": 433,
    "size": 433
  },
  "site/dev/design/Test.png": {
    "status": "A",
    "binary": true,
    "size_delta": 49030,
    "size": 49030
  }
}`)
		require.NoError(t, err)
	}))
	defer tsBinary.Close()
	api, err = NewGerritWithConfig(ConfigChromium, tsBinary.URL, c)
	require.NoError(t, err)
	isBinaryPatch, err = api.IsBinaryPatch(context.Background(), 2370, "5")
	require.NoError(t, err)
	require.True(t, isBinaryPatch)
}

func TestExtractIssueFromCommit(t *testing.T) {
	cmtMsg := `
   	Author: John Doe <jdoe@example.com>
		Date:   Mon Feb 5 10:51:20 2018 -0500

    Some change

    Change-Id: I26c4fd0e1414ab2385e8590cd729bc70c66ef37e
    Reviewed-on: https://skia-review.googlesource.com/549319
    Commit-Queue: John Doe <jdoe@example.com>
	`
	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)
	issueID, err := api.ExtractIssueFromCommit(cmtMsg)
	require.NoError(t, err)
	require.Equal(t, int64(549319), issueID)
	_, err = api.ExtractIssueFromCommit("")
	require.Error(t, err)
}

func TestGetCommit(t *testing.T) {
	skipTestIfRequired(t)

	// Fetch the parent for the given issueID and revision.
	issueID := int64(52160)
	revision := "91740d74af689d53b9fa4d172544e0d5620de9bd"
	expectedParent := "aaab3c73575d5502ae345dd71cf8748c2070ffda"

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	commitInfo, err := api.GetCommit(context.Background(), issueID, revision)
	require.NoError(t, err)
	require.Equal(t, expectedParent, commitInfo.Parents[0].Commit)
}

func TestParseChangeId(t *testing.T) {

	expect := "Ie00a12db04350ab0f8c754b3674eaa5a0a556b63"
	actual, err := ParseChangeId(`commit 96c2eb6258aef6146d947648db12b6470de8197a (origin/master, origin/HEAD, master)
Author: Eric Boren <borenet@google.com>
Date:   Mon Mar 2 14:53:04 2020 -0500

    [recipes] Move nanobench flags logic into gen_tasks_logic/nanobench_flags.go

    Change-Id: Ie00a12db04350ab0f8c754b3674eaa5a0a556b63
    Reviewed-on: https://skia-review.googlesource.com/c/skia/+/274596
    Commit-Queue: Eric Boren <borenet@google.com>
    Reviewed-by: Ben Wagner aka dogben <benjaminwagner@google.com>
`)
	require.NoError(t, err)
	require.Equal(t, expect, actual)
}

func TestFullChangeId(t *testing.T) {

	ci := &ChangeInfo{
		Project:  "skia",
		Branch:   "main",
		ChangeId: "abc",
		Issue:    123,
	}
	require.Equal(t, "skia~123", FullChangeId(ci))

	// Test project with "/" in the name.
	ci.Project = "chromium/src"
	require.Equal(t, "chromium%2Fsrc~123", FullChangeId(ci))

	// Test branch with "/" in the name.
	ci.Branch = "chrome/m90"
	require.Equal(t, "chromium%2Fsrc~123", FullChangeId(ci))

	// Test branch with "refs/heads/" prefix.
	ci.Branch = "refs/heads/chrome/m90"
	require.Equal(t, "chromium%2Fsrc~123", FullChangeId(ci))
}

func TestCreateChange_WithCommitAndChangeID_ReturnsError(t *testing.T) {
	const (
		commit   = "b85141fe76d3dc598407865b07778d164204726e"
		changeID = "Icc898ef6bb4eeb8e93fa8c5d1195364d55ca2a4c"
		project  = "skia"
		branch   = "main"
		subject  = "Test subject"
	)
	ctx := context.Background()
	g := Gerrit{}

	_, err := g.CreateChange(ctx, project, branch, subject, commit, changeID)
	require.Equal(t, ErrBothChangeAndCommitID, err)
}

func TestCreateChange_WithBaseCommit(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "POST", r.Method)
		w.WriteHeader(http.StatusCreated)
		w.Header().Set("Content-Type", "application/json")
		body, err := io.ReadAll(r.Body)
		require.NoError(t, err)
		var data createChangePostData
		require.NoError(t, json.Unmarshal(body, &data))

		require.Equal(t, "myProject", data.Project)
		require.Equal(t, "master", data.Branch)
		require.Equal(t, "Let's support 100% Gerrit workflow direct in browser", data.Subject)
		require.Equal(t, "NEW", data.Status)
		require.Equal(t, "1234567890123456789012345678901234567890", data.BaseCommit)
		require.Equal(t, "", data.BaseChange)
		response := `)]}'
{
  "id": "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9941",
  "project": "myProject",
  "branch": "master",
  "topic": "create-change-in-browser",
  "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9941",
  "subject": "Let's support 100% Gerrit workflow direct in browser",
  "status": "NEW",
  "created": "2014-05-05 07:15:44.639000000",
  "updated": "2014-05-05 07:15:44.639000000",
  "mergeable": true,
  "insertions": 0,
  "deletions": 0,
  "_number": 4711,
  "owner": {
    "name": "John Doe"
  }
}`
		_, err = fmt.Fprintln(w, response)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	require.NoError(t, err)
	ci, err := api.CreateChange(
		context.Background(),
		"myProject",
		"master",
		"Let's support 100% Gerrit workflow direct in browser",
		"1234567890123456789012345678901234567890",
		"",
	)
	require.NoError(t, err)
	require.Equal(t, "master", ci.Branch)
	require.Equal(t, "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9941", ci.Id)
	require.Equal(t, "I8473b95934b5732ac55d26311a706c9c2bde9941", ci.ChangeId)
}

func TestCreateChange_WithBaseChangeID(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "POST", r.Method)
		w.WriteHeader(http.StatusCreated)
		w.Header().Set("Content-Type", "application/json")
		body, err := io.ReadAll(r.Body)
		require.NoError(t, err)
		var data createChangePostData
		require.NoError(t, json.Unmarshal(body, &data))

		require.Equal(t, "myProject", data.Project)
		require.Equal(t, "master", data.Branch)
		require.Equal(t, "Let's support 100% Gerrit workflow direct in browser", data.Subject)
		require.Equal(t, "NEW", data.Status)
		require.Equal(t, "", data.BaseCommit)
		require.Equal(t, "I1234567890123456789012345678901234567890", data.BaseChange)
		response := `)]}'
{
  "id": "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9941",
  "project": "myProject",
  "branch": "master",
  "topic": "create-change-in-browser",
  "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9941",
  "subject": "Let's support 100% Gerrit workflow direct in browser",
  "status": "NEW",
  "created": "2014-05-05 07:15:44.639000000",
  "updated": "2014-05-05 07:15:44.639000000",
  "mergeable": true,
  "insertions": 0,
  "deletions": 0,
  "_number": 4711,
  "owner": {
    "name": "John Doe"
  }
}`
		_, err = fmt.Fprintln(w, response)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	require.NoError(t, err)
	ci, err := api.CreateChange(
		context.Background(),
		"myProject",
		"master",
		"Let's support 100% Gerrit workflow direct in browser",
		"",
		"I1234567890123456789012345678901234567890",
	)
	require.NoError(t, err)
	require.Equal(t, "master", ci.Branch)
	require.Equal(t, "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9941", ci.Id)
	require.Equal(t, "I8473b95934b5732ac55d26311a706c9c2bde9941", ci.ChangeId)
}

func TestCreateCherryPickChange(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "POST", r.Method)
		require.Equal(t,
			"/a/changes/myProject~release~I8473b95934b5732ac55d26311a706c9c2bde9940/revisions/674ac754f91e64a0efb8087e59a176484bd534d1/cherrypick",
			r.URL.Path)
		w.Header().Set("Content-Type", "application/json")
		body, err := io.ReadAll(r.Body)
		require.NoError(t, err)
		var data cherryPickPostData
		require.NoError(t, json.Unmarshal(body, &data))

		require.Equal(t, "main", data.Destination)
		require.Equal(t, "Picking into main", data.Message)
		format := `)]}'
{
  "id": "myProject~release~I8473b95934b5732ac55d26311a706c9c2bde9941",
  "project": "myProject",
  "branch": "%s",
  "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9941",
  "subject": "%s",
  "status": "NEW",
  "created": "2013-02-01 09:59:32.126000000",
  "updated": "2013-02-21 11:16:36.775000000",
  "mergeable": true,
  "insertions": 12,
  "deletions": 11,
  "_number": 3965,
  "owner": {
    "name": "John Doe"
  }
}` + "\n"
		_, err = fmt.Fprintf(w, format, data.Destination, data.Message)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	require.NoError(t, err)
	ci, err := api.CreateCherryPickChange(context.Background(),
		"myProject~release~I8473b95934b5732ac55d26311a706c9c2bde9940",
		"674ac754f91e64a0efb8087e59a176484bd534d1",
		"Picking into main",
		"main")
	require.NoError(t, err)
	require.Equal(t, "main", ci.Branch)
	require.Equal(t, "myProject~release~I8473b95934b5732ac55d26311a706c9c2bde9941", ci.Id)
	require.Equal(t, "I8473b95934b5732ac55d26311a706c9c2bde9941", ci.ChangeId)
}
