// Copyright 2020 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package changelog

import (
	"context"
	"fmt"
	"net/http"
	"testing"

	"go.chromium.org/luci/common/api/gerrit"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
)

const cosInstance = "cos.googlesource.com"
const defaultManifestRepo = "cos/manifest-snapshots"

func getHTTPClient() (*http.Client, error) {
	creds, err := google.FindDefaultCredentials(context.Background(), gerrit.OAuthScope)
	if err != nil || len(creds.JSON) == 0 {
		return nil, fmt.Errorf("no application default credentials found - run `gcloud auth application-default login` and try again")
	}
	return oauth2.NewClient(oauth2.NoContext, creds.TokenSource), nil
}

func commitsMatch(commits []*Commit, expectedCommits []string) bool {
	if len(commits) != len(expectedCommits) {
		return false
	}
	for i, commit := range commits {
		if commit == nil {
			return false
		}
		if commit.SHA != expectedCommits[i] {
			return false
		}
	}
	return true
}

func repoListInLog(log map[string]*RepoLog, check []string) error {
	for _, check := range check {
		if log, ok := log[check]; !ok || len(log.Commits) == 0 {
			return fmt.Errorf("Repo path %s not in log", check)
		}
	}
	return nil
}

func TestChangelog(t *testing.T) {
	httpClient, _ := getHTTPClient()

	// Test invalid source
	additions, removals, err := Changelog(httpClient, "15", "15043.0.0", cosInstance, defaultManifestRepo, -1)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "404" {
		t.Errorf("changelog failed, expected error code 404, got error code %s", err.HTTPCode())
	}

	// Test invalid target
	additions, removals, err = Changelog(httpClient, "15043.0.0", "abx", cosInstance, defaultManifestRepo, -1)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "404" {
		t.Errorf("changelog failed, expected error code 404, got error code %s", err.HTTPCode())
	}

	// Test invalid instance
	additions, removals, err = Changelog(httpClient, "15036.0.0", "15041.0.0", "com", defaultManifestRepo, -1)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "500" {
		t.Errorf("changelog failed, expected error code 500, got error code %s", err.HTTPCode())
	}

	// Test invalid manifest repo
	additions, removals, err = Changelog(httpClient, "15036.0.0", "15041.0.0", cosInstance, "cos/not-a-repo", -1)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "404" {
		t.Errorf("changelog failed, expected error code 404, got error code %s", err.HTTPCode())
	}

	// Test build number higher than latest release
	additions, removals, err = Changelog(httpClient, "15036.0.0", "99999.0.0", cosInstance, defaultManifestRepo, -1)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "404" {
		t.Errorf("changelog failed, expected error code 404, got error code %s", err.HTTPCode())
	}

	// Test manifest with remote urls specified and no default URL
	additions, removals, err = Changelog(httpClient, "1.0.0", "2.0.0", cosInstance, defaultManifestRepo, -1)
	if additions == nil {
		t.Errorf("changelog failed, expected additions, got nil")
	} else if removals == nil {
		t.Errorf("changelog failed, expected removals, got nil")
	} else if err != nil {
		t.Errorf("changelog failed, expected no error, got %v", err)
	}

	// Test 1 build number difference with only 1 repo change between them
	// Ensure that commits are correctly inserted in proper order
	// Check that changelog metadata correctly populated
	source := "15050.0.0"
	target := "15051.0.0"
	expectedCommits := []string{
		"6201c49afe667c8fa7796608a4d7162bb3f7f4f4",
		"a8bcf0feaa0e3c0131a888fcd9d0dcbbe8c3850c",
		"5e3ef32e062fb227aaa6b47138950557ec91d23e",
		"654ed08e8a349e7199eb3a80b6d7704a20ff8ec4",
		"d5c0e74fbb2a50517a1249cbbec4dcee3d049883",
		"cd226061776dad6c0e35323f407eaa138795f4cc",
		"4351d0dc5480e941fac96cb0ec898a87171eadda",
		"cdbcf507749a86acad3e8787ffb3c3356ed76b3a",
		"4fdd7f397bc09924e91f475d3ed55bb5a302bdaf",
		"3adae69de78875a8d33061205357388a513ea51d",
		"5fd85ec937d362984e5108762e8b5e20105a4219",
		"03b6099c920c1b3cb4cbda2172089e80b4d4be6e",
		"1febb203aaf99f00e5d9d80d965726458ba8348f",
		"2de610687308b6ea00d9ac6190d83f0edb2a46b4",
		"db3083c438442ea6ab34e84404b4602618d2e07b",
		"13eb9486f2bf43d56ce58695df8461099fd7c314",
		"12b8a449ef93289674d93f437c19a06530c2c966",
		"6d9752b0abeeaf7438ab08ea7ff5b0f76c2dacca",
		"8555ba160a5eee0be464b25a07abc6031dc9159c",
		"a8c1c3c2971acc03f4246c20b1ddd5bb5376ded3",
		"762495e014eaa74e3aa4d83caaaa778fcfb968a2",
		"784782cd8c1d846c17541a3e527ad56857fe2e91",
		"7c6916858860715db25eaadc2b3ec81865304095",
		"76cc8bf290a133ee821a8a2b14207150de9a7803",
		"dc07ec7806f249fdb0b7bda68c687a87b311c952",
		"f18ad3b35466354d5a0e166008070f54a06759a6",
		"34f008f664e11b6df2f06735b6db6d6a42804d25",
		"a24eee7a6b6caed0448365e548e92724069a8448",
		"64ddf2924656f07bd63269524ed1731a2357b82f",
		"e40d4ce60313cd28ebf1c376860402f9b3d373cd",
		"3018e2531a1f0f22c4d053ed0b8a5cc86ad81319",
		"668cd418350d03e1535c7862ebe93801ace0b1c6",
		"fabf26e3eab2af24371c48e19062d7c8df34bd9f",
		"7b38982caecbeb16520b4dd84422ecad0edaf772",
		"658380877ca2eedc3cd80d3b6daafa24ab96a261",
		"63dee6c8cd318dfa20cfddf2e72243873e816046",
		"bc194a3ce16407015da5bc8d46df55231cf4d625",
		"ff75e90067c7c535116cb5566ebc14451785b36a",
		"c64b1cc6b930024e77425fd105716ade26d0524c",
		"d5123111900fd70d85b7acf5809df701da24f1ea",
		"c617b261c68b52b0abefc0635c1ea03c4cb0cb11",
		"a2619465e4eca49692d832b593cb205118042bc9",
		"6f6451dd56a7fad25b2e8b31a053275adb2008a4",
		"68d5d3901d5c3df44e3be8c3fac0c6b1e90d780c",
		"308882e4e837f231e3ad0f37fd143cee419d816f",
		"1cb20f5aa5a82a412d97fad7b9c13c87c9381f14",
		"f6c0c6f1618676519efd74c8f946e191472b6a4e",
		"dea6ca48a629e80cc2ffbf203c9cc1855a28a47e",
		"fa0115b220b3471a1542b3b66463f9ec80c8c7f0",
		"b815d624f7715ab51379e8a913c280cac1eafde4",
		"39fe5d201b87e02baedf4da8b02523571c4ccbcc",
		"58aff81e0829100cc9d3239791573300e2d2398d",
		"cd570b8e278aca36f166eb84b5003eaee3c03ecc",
		"50f9936fe8ab106d2716e007a342860c695f7822",
		"2a1e98d6c3dca9b52bcb7b02c7a242c10c0a0de9",
		"b9fe6cc174f215d576954e6b2c93bc4de8ba2c34",
		"f78d275ec9d0c4061f75ae2f97f958657a71ebd1",
		"315ea4a344e3f8b300e8c3e48fafc21eaee767fe",
		"1c9392eb35c68ca38a1f0178cd191f07d387f52d",
		"9cd44834d383b5414bd9bac873e9c620a67eff1d",
		"e0f3f79316591affedeaf2702a350d3512bd6a69",
		"148bba54f3762b23a79057825a763c1132bd1d55",
		"48ce30dd18de40852cea15dccaaa833b4017ae10",
		"474e61f82f79d9779b0e2c3bc63d920d9f75b5b6",
		"b93f0e4f3edbe3e64b0128db38ee231a737f06c9",
		"714065afa108556b6ff43ff312b731c239d6e551",
		"45a780a84daa27307addd836df94afa2c70dccb6",
		"0df346778d142f9c6bf221d67bdac96d9d636408",
		"6ad098080fb6437da98511e56026476fa71cce87",
		"3f2915159ab1e42b258ee78d2a71f2dc59d51d35",
		"1d5a9ebc23d1455966963a042bd610fdb38cd705",
		"e31b072bbc2d83db107d913a3f32d907de119ca2",
		"6da63745bd4318577ab8937100871e654df04cb3",
		"d5a54c19f7bf1f8250bc5ac779f80450764e836e",
		"54c59bdcf9965dbb77a6dd9682f255e21e4821a1",
		"67b538de711500bfb1ed5d322e916e8cd3f74700",
		"2814ccbb44a3d19cb4d696705794ced3beb31ef3",
		"deb92542c03e9096fe37d8833532a50a6bb1df3c",
		"d2b9b62c2ad5440005b72826bb55a36dfc115ac2",
		"da9cd84436f716c3c7a6d90e820afb87a9a218b9",
		"d0937f57cd2904df1af7449f32c75aaadaeac2a2",
		"65441913baef06967e59158f3848e41dce18b43a",
		"7cc03e836eba4d13526969b84aaa8dd61d8b6216",
		"dff08d118cab7f8416b8f171aac91b8ca3f6b44d",
		"aedb933f853499a0c736deb2d2ab899b607aacee",
		"aa592bf7b0b7b13eee2b20fa54fd81e11e96cf56",
		"f495c107eefc879b10fdf2e3a2a0155259210dba",
		"7e4e0964a1426d46cdbcbccd861cee7a106a9430",
		"d0ca437a1ed89e2adbd6b2d1bd572b475cd1d8ec",
		"0dce9e5070718b7ba950f0b6575bb3bbd0e362bc",
		"ddd73889c36e93c6128a4d791b6d673cd655447e",
		"04e70ee7abbb702e4939fef98d50b5e6cc018ccd",
		"86da591dd3d8515ebf4d1eebc68a61092ad13e95",
		"8676fbad9fa41e0d0f69dafb2b4f8bd4b5a3b3cc",
		"b8b3a8cc67fcdf58d495489c19e5d3aa23d22563",
		"7441c2cf859b84f7cedff8946dbd0c3dc7ef956b",
		"7f3e0778e212c8a22f8262e2819a6aebfca8b879",
		"a82b808965dbe304e0a95cb9534b09b3b5c0486a",
		"0388f30783e2454ea9f0c3978f92c797fc0bdf20",
		"67f6e97cee8a5b33f8e27b4d2426fb009c0ae435",
		"094bef7b6bd0c034ea19aa3cb9744ca35998ecc8",
		"ec07a4f7eb15d867e453c8c8991656b361a29882",
		"0a304d6481d01d774fe97f31c9574c970fdb532f",
		"3f77b91ad1abb2d2074286635927fa6472eb0a2e",
		"ca721a37ec8edc8f1b8aeb4c143aa936dc032ac1",
		"c0b7d2df81ae29869f9d7a1874b741eeec0d5d18",
		"9bc12bb411f357188d008864f80dfba43210b9d8",
		"bf0dd3757826b9bc9d7082f5f749ff7615d4bcb3",
	}
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, -1)
	if err != nil {
		t.Errorf("changelog failed, expected no error, got %v", err)
	} else if len(removals) != 0 {
		t.Errorf("changelog failed, expected empty removals list, got %v", removals)
	} else if len(additions) != 1 {
		t.Errorf("changelog failed, expected only 1 repo in additions, got %v", additions)
	}
	boardOverlayLog := additions["src/overlays"]
	if boardOverlayLog == nil {
		t.Errorf("Changelog failed, expected src/overlays in changelog, got nil")
	} else if changes := boardOverlayLog.Commits; len(changes) != 108 {
		t.Errorf("Changelog failed, expected 108 changes for \"src/overlays\", got %d", len(changes))
	} else if !commitsMatch(boardOverlayLog.Commits, expectedCommits) {
		t.Errorf("changelog failed, Changelog output does not match expected commits or is not sorted")
	} else if boardOverlayLog.SourceSHA != "612ca5ef5455534127d008e08c65aa29a2fd97a5" {
		t.Errorf("changelog failed, expected SourceSHA \"612ca5ef5455534127d008e08c65aa29a2fd97a5\", got %s", boardOverlayLog.SourceSHA)
	} else if boardOverlayLog.TargetSHA != "6201c49afe667c8fa7796608a4d7162bb3f7f4f4" {
		t.Errorf("changelog failed, expected SourceSHA \"6201c49afe667c8fa7796608a4d7162bb3f7f4f4\", got %s", boardOverlayLog.TargetSHA)
	}

	// Test build numbers further apart from each other with multiple repo differences
	// Also ensures that removals are correctly populated
	source = "15030.0.0"
	target = "15056.0.0"
	additionRepos := []string{
		"src/scripts",
		"src/platform/vboot_reference",
		"src/platform/dev",
		"chromite",
		"src/third_party/autotest/files",
		"src/third_party/eclass-overlay",
		"src/third_party/toolchain-utils",
		"src/platform/crostestutils",
		"src/third_party/coreboot",
		"src/third_party/kernel/v5.4",
		"src/overlays",
		"src/chromium/depot_tools",
		"src/third_party/portage-stable",
		"chromite/infra/proto",
		"manifest",
		"src/platform2",
		"src/third_party/chromiumos-overlay",
	}
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, -1)
	if err != nil {
		t.Errorf("changelog failed, expected no error, got %v", err)
	}
	if len(removals) != 0 {
		t.Errorf("Changelog failed, expected empty removals, got %v", removals)
	} else if err := repoListInLog(additions, additionRepos); err != nil {
		t.Errorf("Changelog failed, additions repo output does not match expected repos: %v", err)
	}

	// Test changelog returns correct output when given a querySize instead of -1
	source = "15030.0.0"
	target = "15050.0.0"
	querySize := 50
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, querySize)
	if err != nil {
		t.Errorf("changelog failed, expected no error, got %v", err)
	} else if additions == nil {
		t.Errorf("changelog failed, non-empty expected additions, got nil")
	} else if removals == nil {
		t.Errorf("Changelog failed, non-empty expected removals, got nil")
	} else if _, ok := additions["src/third_party/kernel/v5.4"]; !ok {
		t.Errorf("Changelog failed, expected repo: src/third_party/kernel/v5.4 in additions")
	}
	for repoName, repoLog := range additions {
		if repoLog.Commits == nil || len(repoLog.Commits) == 0 {
			t.Errorf("changelog failed, expected non-empty additions commits, got nil or empty commits")
		}
		if len(repoLog.Commits) > querySize {
			t.Errorf("Changelog failed, expected %d commits for repo: %s, got: %d", querySize, repoName, len(repoLog.Commits))
		} else if repoName == "src/third_party/kernel/v5.4" && !repoLog.HasMoreCommits {
			t.Errorf("Changelog failed, expected HasMoreCommits = True for repo: src/third_party/kernel/v5.4, got False")
		} else if repoLog.HasMoreCommits && len(repoLog.Commits) < querySize {
			t.Errorf("changelog failed, expected HasMoreCommits = False for repo: %s with %d commits, got True", repoName, len(repoLog.Commits))
		}
	}

	// Test changelog handles manifest with non-matching repositories
	source = "12871.1177.0"
	target = "12871.1179.0"
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, querySize)
	if err != nil {
		t.Errorf("changelog failed, expected no error, got %v", err)
	} else if len(removals) != 0 {
		t.Errorf("Changelog failed, expected empty removals, got %v", removals)
	} else if _, ok := additions["src/platform/cobble"]; !ok {
		t.Errorf("Changelog failed, expected repo: src/platform/cobble in additions")
	}
	for repoName, repoLog := range additions {
		if repoLog.Commits == nil || len(repoLog.Commits) == 0 {
			t.Errorf("Changelog failed, expected non-empty additions commits, got nil or empty commits")
		} else if repoName == "src/platform/cobble" {
			if repoLog.HasMoreCommits {
				t.Errorf("Changelog failed, expected hasMoreCommits = false for repo: src/platform/cobble, got true")
			} else if repoLog.SourceSHA != "" {
				t.Errorf("Changelog failed, expected empty SourceSHA for src/platform/cobble, got %s", repoLog.SourceSHA)
			} else if repoLog.TargetSHA != "4ab43f1f86b7099b8ad75cf9615ea1fa155bbd7d" {
				t.Errorf("Changelog failed, expected TargetSHA: \"4ab43f1f86b7099b8ad75cf9615ea1fa155bbd7d\" for src/platform/cobble, got %s", repoLog.TargetSHA)
			}
		}
	}

	// Test with different release branches
	source = "13310.1035.0"
	target = "15000.0.0"
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, querySize)
	if err != nil {
		t.Errorf("Changelog failed, expected no error, got %v", err)
	} else if len(additions) == 0 {
		t.Errorf("Changelog failed, expected non-empty additions, got %v", additions)
	} else if len(removals) == 0 {
		t.Errorf("Changelog failed, expected non-empty removals, got %v", removals)
	}

	// Test empty repository
	source = "0.0.0"
	target = "2.0.0"
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, querySize)
	if additions != nil {
		t.Errorf("changelog failed, expected nil additions, got %v", additions)
	} else if removals != nil {
		t.Errorf("changelog failed, expected nil removals, got %v", removals)
	} else if err == nil {
		t.Errorf("changelog failed, expected error, got nil")
	} else if err.HTTPCode() != "500" {
		t.Errorf("changelog failed, expected error code 500, got error code %s", err.HTTPCode())
	}

	// Test image name
	source = "cos-rc-85-13310-1034-0"
	target = "cos-rc-85-13310-1030-0"
	additions, removals, err = Changelog(httpClient, source, target, cosInstance, defaultManifestRepo, querySize)
	if err != nil {
		t.Errorf("Changelog failed, expected no error, got %v", err)
	} else if len(additions) != 0 {
		t.Errorf("Changelog failed, expected empty additions, got %v", additions)
	} else if len(removals) == 0 {
		t.Errorf("Changelog failed, expected non-empty removals, got %v", removals)
	}
}
