github.com/zppinho/prow@v0.0.0-20240510014325-1738badeb017/pkg/plugins/testfreeze/checker/checker_test.go (about)

     1  /*
     2  Copyright 2022 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package checker
    18  
    19  import (
    20  	"errors"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/go-git/go-git/v5/plumbing"
    25  	"github.com/sirupsen/logrus"
    26  	"github.com/stretchr/testify/assert"
    27  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    28  
    29  	v1 "sigs.k8s.io/prow/pkg/apis/prowjobs/v1"
    30  	"sigs.k8s.io/prow/pkg/plugins/testfreeze/checker/checkerfakes"
    31  )
    32  
    33  func TestInTestFreeze(t *testing.T) {
    34  	t.Parallel()
    35  
    36  	errTest := errors.New("")
    37  
    38  	releaseBranch := func(v string) *plumbing.Reference {
    39  		return plumbing.NewReferenceFromStrings("refs/heads/release-"+v, "")
    40  	}
    41  
    42  	tag := func(v string) *plumbing.Reference {
    43  		return plumbing.NewReferenceFromStrings("refs/tags/"+v, "")
    44  	}
    45  
    46  	testTime := metav1.Now()
    47  
    48  	for _, tc := range []struct {
    49  		name    string
    50  		prepare func(*checkerfakes.FakeChecker)
    51  		assert  func(*Result, error)
    52  	}{
    53  		{
    54  			name: "success no test freez",
    55  			prepare: func(mock *checkerfakes.FakeChecker) {
    56  				mock.ListRefsReturns([]*plumbing.Reference{
    57  					tag("wrong"),       // unable to parse this tag, but don't error
    58  					releaseBranch("1"), // unable to parse this branch, but don't error
    59  					releaseBranch("1.18"),
    60  					tag("1.18.0"),
    61  					releaseBranch("1.23"),
    62  					tag("1.23.0"),
    63  					releaseBranch("1.22"),
    64  					tag("1.22.0"),
    65  				}, nil)
    66  			},
    67  			assert: func(res *Result, err error) {
    68  				assert.False(t, res.InTestFreeze)
    69  				assert.Equal(t, "release-1.23", res.Branch)
    70  				assert.Equal(t, "v1.23.0", res.Tag)
    71  				assert.Empty(t, res.LastFastForward)
    72  				assert.Nil(t, err)
    73  			},
    74  		},
    75  		{
    76  			name: "success in test freeze",
    77  			prepare: func(mock *checkerfakes.FakeChecker) {
    78  				mock.ListRefsReturns([]*plumbing.Reference{
    79  					releaseBranch("1.18"),
    80  					releaseBranch("1.24"),
    81  					releaseBranch("1.22"),
    82  					tag("1.18.0"),
    83  					tag("1.22.0"),
    84  				}, nil)
    85  				mock.UnmarshalProwJobsReturns(&v1.ProwJobList{
    86  					Items: []v1.ProwJob{
    87  						{
    88  							Spec: v1.ProwJobSpec{Job: jobName},
    89  							Status: v1.ProwJobStatus{
    90  								State:          v1.SuccessState,
    91  								CompletionTime: &testTime,
    92  							},
    93  						},
    94  					},
    95  				}, nil)
    96  			},
    97  			assert: func(res *Result, err error) {
    98  				assert.True(t, res.InTestFreeze)
    99  				assert.Equal(t, "release-1.24", res.Branch)
   100  				assert.Equal(t, "v1.24.0", res.Tag)
   101  				assert.Equal(t, "v1.24.0", res.Tag)
   102  				assert.Equal(t, testTime.Format(time.UnixDate), res.LastFastForward)
   103  				assert.Nil(t, err)
   104  			},
   105  		},
   106  		{
   107  			name: "error no latest releae branch found",
   108  			prepare: func(mock *checkerfakes.FakeChecker) {
   109  				mock.ListRefsReturns([]*plumbing.Reference{
   110  					tag("1.22.0"),
   111  				}, nil)
   112  			},
   113  			assert: func(res *Result, err error) {
   114  				assert.Nil(t, res)
   115  				assert.NotNil(t, err)
   116  			},
   117  		},
   118  		{
   119  			name: "error on list refs",
   120  			prepare: func(mock *checkerfakes.FakeChecker) {
   121  				mock.ListRefsReturns(nil, errTest)
   122  			},
   123  			assert: func(res *Result, err error) {
   124  				assert.Nil(t, res)
   125  				assert.NotNil(t, err)
   126  			},
   127  		},
   128  		{
   129  			name: "error on HttpGet",
   130  			prepare: func(mock *checkerfakes.FakeChecker) {
   131  				mock.ListRefsReturns([]*plumbing.Reference{
   132  					releaseBranch("1.18"),
   133  					releaseBranch("1.24"),
   134  					releaseBranch("1.22"),
   135  					tag("1.18.0"),
   136  					tag("1.22.0"),
   137  				}, nil)
   138  				mock.HttpGetReturns(nil, errTest)
   139  			},
   140  			assert: func(res *Result, err error) {
   141  				assert.True(t, res.InTestFreeze)
   142  				assert.Equal(t, "release-1.24", res.Branch)
   143  				assert.Equal(t, "v1.24.0", res.Tag)
   144  				assert.Equal(t, "v1.24.0", res.Tag)
   145  				assert.Equal(t, unknownTime, res.LastFastForward)
   146  				assert.Nil(t, err)
   147  			},
   148  		},
   149  	} {
   150  		t.Run(tc.name, func(t *testing.T) {
   151  			mock := &checkerfakes.FakeChecker{}
   152  			tc.prepare(mock)
   153  
   154  			sut := New(logrus.NewEntry(logrus.StandardLogger()))
   155  			sut.checker = mock
   156  
   157  			res, err := sut.InTestFreeze()
   158  
   159  			tc.assert(res, err)
   160  		})
   161  	}
   162  }