blob: 087ef80268dfa437cfa99bafc1f134a2bea62024 [file] [log] [blame]
// Copyright 2020 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 main
import (
"context"
"fmt"
"testing"
"github.com/golang/mock/gomock"
"github.com/golang/protobuf/ptypes/empty"
"github.com/google/go-cmp/cmp"
gerritpb "go.chromium.org/luci/common/proto/gerrit"
)
func TestCreateChange(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
subject string
commit string
expected *gerritpb.ChangeInfo
}{
{
project: "test-project",
subject: "dummy change",
commit: "foobar",
expected: &gerritpb.ChangeInfo{Number: int64(123456)},
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.CreateChangeRequest{
Project: test.project,
Ref: "refs/heads/master",
Subject: test.subject,
BaseCommit: test.commit,
}
// Client returns a successful ChangeInfo response.
resp := gerritpb.ChangeInfo{Number: int64(123456)}
mockGerritClient.EXPECT().CreateChange(gomock.Any(), &req).Return(&resp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
changeInfo, err := mockGerritClientWrapper.createChange(ctx, test.subject, test.commit)
if err != nil {
t.Fatalf("got unexpected err: %v", err)
}
if diff := cmp.Diff(test.expected, changeInfo); diff != "" {
t.Fatalf("different (-want +got):\n%s", diff)
}
}
}
func TestFailedCreateChange(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
subject string
commit string
}{
{
project: "test-project",
subject: "dummy change",
commit: "foobar",
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.CreateChangeRequest{
Project: test.project,
Ref: "refs/heads/master",
Subject: test.subject,
BaseCommit: test.commit,
}
// Client returns an error upon CreateChange call.
mockGerritClient.EXPECT().CreateChange(gomock.Any(), &req).Return(nil, fmt.Errorf("failed to create change"))
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
changeInfo, err := mockGerritClientWrapper.createChange(ctx, test.subject, test.commit)
if err == nil {
t.Fatalf("expected error, got nil")
}
if changeInfo != nil {
t.Fatalf("expected nil change info, got %s", changeInfo)
}
}
}
func TestEditFile(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
filepath string
contents string
}{
{
project: "test-project",
changeNum: int64(123456),
filepath: "path/to/file",
contents: "dummy contents",
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.ChangeEditFileContentRequest{
Number: test.changeNum,
Project: test.project,
FilePath: test.filepath,
Content: []byte(test.contents),
}
// Client returns an empty, non-error response after editing file.
mockGerritClient.EXPECT().ChangeEditFileContent(gomock.Any(), &req).Return(&empty.Empty{}, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.editFile(ctx, test.changeNum, test.filepath, test.contents)
if err != nil {
t.Fatalf("got unexpected err: %v", err)
}
}
}
func TestFailedEditFile(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
filepath string
contents string
}{
{
project: "test-project",
changeNum: int64(123456),
filepath: "path/to/file",
contents: "dummy contents",
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.ChangeEditFileContentRequest{
Number: test.changeNum,
Project: test.project,
FilePath: test.filepath,
Content: []byte(test.contents),
}
// Client returns an error.
mockGerritClient.EXPECT().ChangeEditFileContent(gomock.Any(), &req).Return(nil, fmt.Errorf("failed to edit file"))
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.editFile(ctx, test.changeNum, test.filepath, test.contents)
if err == nil {
t.Fatalf("expected error, got nil")
}
}
}
func TestPublishEdits(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.ChangeEditPublishRequest{
Number: test.changeNum,
Project: test.project,
}
// Client returns an empty, non-error response after publishing eidts.
mockGerritClient.EXPECT().ChangeEditPublish(gomock.Any(), &req).Return(&empty.Empty{}, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.publishEdits(ctx, test.changeNum)
if err != nil {
t.Fatalf("got unexpected err: %v", err)
}
}
}
func TestSetCQLabel(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
changeReq := gerritpb.GetChangeRequest{
Number: test.changeNum,
Options: []gerritpb.QueryOption{gerritpb.QueryOption_CURRENT_REVISION},
}
changeResp := gerritpb.ChangeInfo{CurrentRevision: "foobar"}
mockGerritClient.EXPECT().GetChange(gomock.Any(), &changeReq).Return(&changeResp, nil)
reviewReq := gerritpb.SetReviewRequest{
Number: test.changeNum,
Project: test.project,
RevisionId: "foobar",
Labels: map[string]int32{commitQueueLabel: int32(1)},
}
reviewResp := gerritpb.ReviewResult{Labels: map[string]int32{commitQueueLabel: int32(1)}}
// Client returns a ReviewResult which has CQ+1.
mockGerritClient.EXPECT().SetReview(gomock.Any(), &reviewReq).Return(&reviewResp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.setCQLabel(ctx, test.changeNum, true)
if err != nil {
t.Fatalf("got unexpected err: %v", err)
}
}
}
func TestRejectedSetCQLabel(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
changeReq := gerritpb.GetChangeRequest{
Number: test.changeNum,
Options: []gerritpb.QueryOption{gerritpb.QueryOption_CURRENT_REVISION},
}
changeResp := gerritpb.ChangeInfo{CurrentRevision: "foobar"}
mockGerritClient.EXPECT().GetChange(gomock.Any(), &changeReq).Return(&changeResp, nil)
reviewReq := gerritpb.SetReviewRequest{
Number: test.changeNum,
Project: test.project,
RevisionId: "foobar",
Labels: map[string]int32{commitQueueLabel: int32(1)},
}
reviewResp := gerritpb.ReviewResult{Labels: map[string]int32{}}
// Client returns a ReviewResult which has no labels.
mockGerritClient.EXPECT().SetReview(gomock.Any(), &reviewReq).Return(&reviewResp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.setCQLabel(ctx, test.changeNum, true)
if err == nil {
t.Fatalf("expected error, got nil")
}
}
}
func TestInvalidSetCQLabel(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
changeReq := gerritpb.GetChangeRequest{
Number: test.changeNum,
Options: []gerritpb.QueryOption{gerritpb.QueryOption_CURRENT_REVISION},
}
changeResp := gerritpb.ChangeInfo{CurrentRevision: "foobar"}
mockGerritClient.EXPECT().GetChange(gomock.Any(), &changeReq).Return(&changeResp, nil)
reviewReq := gerritpb.SetReviewRequest{
Number: test.changeNum,
Project: test.project,
RevisionId: "foobar",
Labels: map[string]int32{commitQueueLabel: int32(1)},
}
reviewResp := gerritpb.ReviewResult{Labels: map[string]int32{commitQueueLabel: int32(0)}}
// Client returns a ReviewResult which has the wrong label value.
mockGerritClient.EXPECT().SetReview(gomock.Any(), &reviewReq).Return(&reviewResp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.setCQLabel(ctx, test.changeNum, true)
if err == nil {
t.Fatalf("expected error, got nil")
}
}
}
func TestCheckCQCompletion(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.GetChangeRequest{
Number: test.changeNum,
Options: []gerritpb.QueryOption{gerritpb.QueryOption_LABELS},
}
resp := gerritpb.ChangeInfo{
Labels: map[string]*gerritpb.LabelInfo{
commitQueueLabel: {Value: int32(0)},
},
}
// Client returns an finished CQ response.
mockGerritClient.EXPECT().GetChange(gomock.Any(), &req).Return(&resp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.checkCQCompletion(ctx, test.changeNum)
if err != nil {
t.Fatalf("got unexpected err: %v", err)
}
}
}
func TestUnfinishedCheckCQCompletion(t *testing.T) {
t.Parallel()
var tests = []struct {
project string
changeNum int64
}{
{
project: "test-project",
changeNum: int64(123456),
},
}
for _, test := range tests {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockGerritClient := gerritpb.NewMockGerritClient(ctrl)
req := gerritpb.GetChangeRequest{
Number: test.changeNum,
Options: []gerritpb.QueryOption{gerritpb.QueryOption_LABELS},
}
resp := gerritpb.ChangeInfo{
Labels: map[string]*gerritpb.LabelInfo{
commitQueueLabel: {Value: int32(1)},
},
}
// Client returns an unfinished CQ response.
mockGerritClient.EXPECT().GetChange(gomock.Any(), &req).Return(&resp, nil)
mockGerritClientWrapper := gerritClientWrapper{
client: mockGerritClient,
project: test.project,
}
ctx := context.Background()
err := mockGerritClientWrapper.checkCQCompletion(ctx, test.changeNum)
if err == nil {
t.Fatalf("expected error, got nil")
}
}
}