| // 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") |
| } |
| } |
| } |