// 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 findbuild

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

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

const (
	externalGerritURL         string = "https://cos-review.googlesource.com"
	externalGitilesURL        string = "cos.googlesource.com"
	externalFallbackGerritURL string = "https://chromium-review.googlesource.com"
	externalManifestRepo      string = "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 TestFindCL(t *testing.T) {
	tests := map[string]struct {
		Change             string
		GerritHost         string
		GitilesHost        string
		FallbackGerritHost string
		ManifestRepo       string
		OutputBuildNum     string
		ShouldFallback     bool
		ExpectedError      string
	}{
		"exponential search range required": {
			Change:             "1740206",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			OutputBuildNum:     "12371.1001.0",
			ShouldFallback:     true,
		},
		"invalid host": {
			Change:         "3781",
			GerritHost:     "https://zop-review.googlesource.com",
			GitilesHost:    "zop.googlesource.com",
			ManifestRepo:   externalManifestRepo,
			ShouldFallback: false,
			ExpectedError:  "500",
		},
		"no release match in repo": {
			Change:         "3781",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   "not/arepo",
			ShouldFallback: false,
			ExpectedError:  "406",
		},
		"master branch release version": {
			Change:         "3280",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			OutputBuildNum: "15085.0.0",
			ShouldFallback: false,
		},
		"R85-13310.B branch release version": {
			Change:         "3206",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			OutputBuildNum: "13310.1025.0",
			ShouldFallback: false,
		},
		"only CL in build diff": {
			Change:         "3781",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			OutputBuildNum: "12371.1072.0",
			ShouldFallback: false,
		},
		"non-existant CL": {
			Change:             "9999999999",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			ShouldFallback:     true,
			ExpectedError:      "404",
		},
		"abandoned CL": {
			Change:         "3743",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			ShouldFallback: false,
			ExpectedError:  "406",
		},
		"chromium CL": {
			Change:             "2288114",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			OutputBuildNum:     "15049.0.0",
			ShouldFallback:     true,
		},
		"use commit SHA": {
			Change:             "80809c436f1cae4cde117fce34b82f38bdc2fd36",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			OutputBuildNum:     "12871.1183.0",
			ShouldFallback:     false,
		},
		"third_party/kernel special branch case": {
			Change:         "3302",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			OutputBuildNum: "15088.0.0",
			ShouldFallback: false,
		},
		"third_party/kernel release branch": {
			Change:         "4983",
			GerritHost:     externalGerritURL,
			GitilesHost:    externalGitilesURL,
			ManifestRepo:   externalManifestRepo,
			OutputBuildNum: "12871.1192.0",
			ShouldFallback: false,
		},
		"branch not in manifest": {
			Change:             "1592",
			GerritHost:         externalGerritURL,
			FallbackGerritHost: externalFallbackGerritURL,
			GitilesHost:        externalGitilesURL,
			ManifestRepo:       externalManifestRepo,
			ExpectedError:      "406",
		},
		"invalid release branch": {
			Change:             "150",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			ShouldFallback:     true,
			ExpectedError:      "406",
		},
		"chromeos branch": {
			Change:             "2036225",
			GerritHost:         externalGerritURL,
			GitilesHost:        externalGitilesURL,
			FallbackGerritHost: externalFallbackGerritURL,
			ManifestRepo:       externalManifestRepo,
			OutputBuildNum:     "12371.1001.0",
			ShouldFallback:     true,
		},
	}

	httpClient, _ := getHTTPClient()
	for name, test := range tests {
		req := &BuildRequest{
			HTTPClient:   httpClient,
			GerritHost:   test.GerritHost,
			GitilesHost:  test.GitilesHost,
			ManifestRepo: test.ManifestRepo,
			CL:           test.Change,
		}
		res, err := FindBuild(req)
		if err != nil && err.HTTPCode() != "404" && test.ShouldFallback {
			t.Fatalf("test \"%s\" failed:\nexpected not found error, got %v", name, err)
		}
		if err != nil && err.HTTPCode() == "404" {
			fallbackReq := &BuildRequest{
				HTTPClient:   httpClient,
				GerritHost:   test.FallbackGerritHost,
				GitilesHost:  test.GitilesHost,
				ManifestRepo: test.ManifestRepo,
				CL:           test.Change,
			}
			res, err = FindBuild(fallbackReq)
		}
		switch {
		case test.ExpectedError == "" && err != nil:
			t.Fatalf("test \"%s\" failed:\nexpected no error, got %v", name, err)
		case test.ExpectedError != "" && err == nil:
			t.Fatalf("test \"%s\" failed:\nexpected error code %s, got nil err", name, test.ExpectedError)
		case test.ExpectedError != "" && err != nil && test.ExpectedError != err.HTTPCode():
			t.Fatalf("test \"%s\" failed:\nexpected error code %s, got error code %s", name, test.ExpectedError, err.HTTPCode())
		case test.ExpectedError == "" && res.BuildNum != test.OutputBuildNum:
			t.Fatalf("test \"%s\" failed:\nexpected output %s, got %s", name, test.OutputBuildNum, res)
		}
		time.Sleep(time.Second * 5)
	}
}
