// 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 {
		return nil, fmt.Errorf("no application default credentials found - run `gcloud auth application-default login` and try again")
	}
	return oauth2.NewClient(context.Background(), 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 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)
	}
}
