blob: 96269e3ac486303a1fb21e26afb2add0a67ca790 [file] [log] [blame]
// 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)
}
}