| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package checkout |
| |
| import ( |
| "net/url" |
| "testing" |
| |
| buildbucketpb "go.chromium.org/luci/buildbucket/proto" |
| ) |
| |
| func TestNewCheckoutStrategy(t *testing.T) { |
| tests := []struct { |
| // A name for this test case. |
| name string |
| |
| // The integration repo URL. |
| specRepoURL url.URL |
| |
| // The Buildbucket build input. |
| input *buildbucketpb.Build_Input |
| |
| // The spec ref. |
| specRef string |
| |
| // The name of the expected strategy. |
| expectedStrategy strategy |
| |
| // Whether to expect an error |
| expectErr bool |
| }{ |
| { |
| name: "should checkout from specRef if the gerrit change is for a different project", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{ |
| GerritChanges: []*buildbucketpb.GerritChange{{ |
| Host: "fuchsia-review.googlesource.com", |
| Project: "different", |
| }}, |
| }, |
| specRef: "deadbeef", |
| expectedStrategy: &checkoutCommit{ |
| commit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| }, |
| }, |
| { |
| name: "should rebase on a parent change if the gerrit change is for the same project", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{ |
| GitilesCommit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| GerritChanges: []*buildbucketpb.GerritChange{{ |
| Host: "fuchsia-review.googlesource.com", |
| Project: "repo", |
| }}, |
| }, |
| expectedStrategy: &checkoutChange{ |
| parent: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| change: &buildbucketpb.GerritChange{ |
| Host: "fuchsia-review.googlesource.com", |
| Project: "repo", |
| }, |
| }, |
| }, |
| { |
| name: "should checkout gerrit change if no gitiles commit", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{ |
| GerritChanges: []*buildbucketpb.GerritChange{{ |
| Host: "fuchsia-review.googlesource.com", |
| Project: "repo", |
| }}, |
| }, |
| expectedStrategy: &checkoutChange{ |
| change: &buildbucketpb.GerritChange{ |
| Host: "fuchsia-review.googlesource.com", |
| Project: "repo", |
| }, |
| }, |
| }, |
| { |
| name: "should checkout from specRef if the gitiles commit is for a different project", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{ |
| GitilesCommit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "different", |
| }, |
| }, |
| specRef: "deadbeef", |
| expectedStrategy: &checkoutCommit{ |
| commit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| }, |
| }, |
| { |
| name: "should checkout from the gitiles commit if it is for the same project", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{ |
| GitilesCommit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| }, |
| expectedStrategy: &checkoutCommit{ |
| commit: &buildbucketpb.GitilesCommit{ |
| Host: "fuchsia.googlesource.com", |
| Project: "repo", |
| Id: "deadbeef", |
| }, |
| }, |
| }, |
| |
| // Cases where errors are expected. |
| |
| { |
| name: "should fail if the build input has no gitiles commit or gerrit change", |
| specRepoURL: url.URL{ |
| Scheme: "https", |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{}, |
| expectErr: true, |
| }, |
| { |
| name: "should fail if the repo URL has no scheme", |
| specRepoURL: url.URL{ |
| Host: "fuchsia.googlesource.com", |
| Path: "/repo", |
| }, |
| input: &buildbucketpb.Build_Input{}, |
| expectErr: true, |
| }, |
| } |
| |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| if tt.specRef == "" { |
| tt.specRef = "HEAD" |
| } |
| strategy, err := newStrategy(tt.input, tt.specRepoURL, tt.specRef) |
| switch { |
| case err != nil && !tt.expectErr: |
| t.Errorf("unexpected error: %v", err) |
| return |
| case err == nil && tt.expectErr: |
| t.Errorf("wanted an error but got %v", strategy) |
| return |
| case err != nil && tt.expectErr: |
| return |
| } |
| |
| expected := tt.expectedStrategy |
| actual := strategy |
| if !expected.Equal(actual) { |
| t.Errorf("wanted\n%+v\ngot\n%+v\n", expected, actual) |
| } |
| }) |
| } |
| } |
| |
| func TestGitilesChangeRef(t *testing.T) { |
| test := []struct { |
| name string |
| change *buildbucketpb.GerritChange |
| expected string |
| }{ |
| { |
| name: "change no. < 10", |
| change: &buildbucketpb.GerritChange{ |
| Change: 9, |
| Patchset: 6, |
| }, |
| expected: "refs/changes/09/9/6", |
| }, |
| { |
| name: "change no. >= 10", |
| change: &buildbucketpb.GerritChange{ |
| Change: 56, |
| Patchset: 6, |
| }, |
| expected: "refs/changes/56/56/6", |
| }, |
| { |
| name: "change no. >= 100", |
| change: &buildbucketpb.GerritChange{ |
| Change: 754, |
| Patchset: 6, |
| }, |
| expected: "refs/changes/54/754/6", |
| }, |
| { |
| name: "change no. >= 1000", |
| change: &buildbucketpb.GerritChange{ |
| Change: 97643, |
| Patchset: 6, |
| }, |
| expected: "refs/changes/43/97643/6", |
| }, |
| } |
| |
| for _, tt := range test { |
| t.Run(tt.name, func(t *testing.T) { |
| actual := GitilesChangeRef(tt.change) |
| if tt.expected != actual { |
| t.Errorf("wanted:%v got %v", tt.expected, actual) |
| } |
| }) |
| } |
| } |