@@ -18,6 +18,9 @@ package checker
1818
1919import (
2020 "errors"
21+ "io"
22+ "net/http"
23+ "strings"
2124 "testing"
2225 "time"
2326
@@ -160,3 +163,213 @@ func TestInTestFreeze(t *testing.T) {
160163 })
161164 }
162165}
166+
167+ func TestInCodeFreeze (t * testing.T ) {
168+ t .Parallel ()
169+
170+ errTest := errors .New ("test error" )
171+
172+ for _ , tc := range []struct {
173+ name string
174+ branch string
175+ prepare func (* checkerfakes.FakeChecker )
176+ assert func (bool , error )
177+ }{
178+ {
179+ name : "success branch is excluded (code freeze active)" ,
180+ branch : "release-1.34" ,
181+ prepare : func (mock * checkerfakes.FakeChecker ) {
182+ prowConfig := & ProwConfig {}
183+ prowConfig .Tide .Queries = []struct {
184+ Repos []string `yaml:"repos"`
185+ ExcludedBranches []string `yaml:"excludedBranches"`
186+ }{
187+ {
188+ Repos : []string {"kubernetes/kubernetes" },
189+ ExcludedBranches : []string {"release-1.34" },
190+ },
191+ }
192+ mock .HttpGetReturns (& http.Response {
193+ Body : io .NopCloser (strings .NewReader ("" )),
194+ }, nil )
195+ mock .ReadAllBodyReturns ([]byte {}, nil )
196+ mock .UnmarshalProwConfigReturns (prowConfig , nil )
197+ },
198+ assert : func (inCodeFreeze bool , err error ) {
199+ assert .True (t , inCodeFreeze )
200+ assert .Nil (t , err )
201+ },
202+ },
203+ {
204+ name : "success branch not excluded (code freeze not active)" ,
205+ branch : "release-1.34" ,
206+ prepare : func (mock * checkerfakes.FakeChecker ) {
207+ prowConfig := & ProwConfig {}
208+ prowConfig .Tide .Queries = []struct {
209+ Repos []string `yaml:"repos"`
210+ ExcludedBranches []string `yaml:"excludedBranches"`
211+ }{
212+ {
213+ Repos : []string {"kubernetes/kubernetes" },
214+ ExcludedBranches : []string {"release-1.33" },
215+ },
216+ }
217+ mock .HttpGetReturns (& http.Response {
218+ Body : io .NopCloser (strings .NewReader ("" )),
219+ }, nil )
220+ mock .ReadAllBodyReturns ([]byte {}, nil )
221+ mock .UnmarshalProwConfigReturns (prowConfig , nil )
222+ },
223+ assert : func (inCodeFreeze bool , err error ) {
224+ assert .False (t , inCodeFreeze )
225+ assert .Nil (t , err )
226+ },
227+ },
228+ {
229+ name : "success multiple queries, branch excluded in one" ,
230+ branch : "release-1.34" ,
231+ prepare : func (mock * checkerfakes.FakeChecker ) {
232+ prowConfig := & ProwConfig {}
233+ prowConfig .Tide .Queries = []struct {
234+ Repos []string `yaml:"repos"`
235+ ExcludedBranches []string `yaml:"excludedBranches"`
236+ }{
237+ {
238+ Repos : []string {"kubernetes/test-infra" },
239+ ExcludedBranches : []string {"release-1.34" },
240+ },
241+ {
242+ Repos : []string {"kubernetes/kubernetes" },
243+ ExcludedBranches : []string {"release-1.34" },
244+ },
245+ }
246+ mock .HttpGetReturns (& http.Response {
247+ Body : io .NopCloser (strings .NewReader ("" )),
248+ }, nil )
249+ mock .ReadAllBodyReturns ([]byte {}, nil )
250+ mock .UnmarshalProwConfigReturns (prowConfig , nil )
251+ },
252+ assert : func (inCodeFreeze bool , err error ) {
253+ assert .True (t , inCodeFreeze )
254+ assert .Nil (t , err )
255+ },
256+ },
257+ {
258+ name : "success branch excluded for different repo only" ,
259+ branch : "release-1.34" ,
260+ prepare : func (mock * checkerfakes.FakeChecker ) {
261+ prowConfig := & ProwConfig {}
262+ prowConfig .Tide .Queries = []struct {
263+ Repos []string `yaml:"repos"`
264+ ExcludedBranches []string `yaml:"excludedBranches"`
265+ }{
266+ {
267+ Repos : []string {"kubernetes/test-infra" },
268+ ExcludedBranches : []string {"release-1.34" },
269+ },
270+ {
271+ Repos : []string {"kubernetes/kubernetes" },
272+ ExcludedBranches : []string {"release-1.33" },
273+ },
274+ }
275+ mock .HttpGetReturns (& http.Response {
276+ Body : io .NopCloser (strings .NewReader ("" )),
277+ }, nil )
278+ mock .ReadAllBodyReturns ([]byte {}, nil )
279+ mock .UnmarshalProwConfigReturns (prowConfig , nil )
280+ },
281+ assert : func (inCodeFreeze bool , err error ) {
282+ assert .False (t , inCodeFreeze )
283+ assert .Nil (t , err )
284+ },
285+ },
286+ {
287+ name : "success empty tide queries" ,
288+ branch : "release-1.34" ,
289+ prepare : func (mock * checkerfakes.FakeChecker ) {
290+ prowConfig := & ProwConfig {}
291+ mock .HttpGetReturns (& http.Response {
292+ Body : io .NopCloser (strings .NewReader ("" )),
293+ }, nil )
294+ mock .ReadAllBodyReturns ([]byte {}, nil )
295+ mock .UnmarshalProwConfigReturns (prowConfig , nil )
296+ },
297+ assert : func (inCodeFreeze bool , err error ) {
298+ assert .False (t , inCodeFreeze )
299+ assert .Nil (t , err )
300+ },
301+ },
302+ {
303+ name : "error on HttpGet" ,
304+ branch : "release-1.34" ,
305+ prepare : func (mock * checkerfakes.FakeChecker ) {
306+ mock .HttpGetReturns (nil , errTest )
307+ },
308+ assert : func (inCodeFreeze bool , err error ) {
309+ assert .False (t , inCodeFreeze )
310+ assert .NotNil (t , err )
311+ assert .Contains (t , err .Error (), "get prow config" )
312+ },
313+ },
314+ {
315+ name : "error on ReadAllBody" ,
316+ branch : "release-1.34" ,
317+ prepare : func (mock * checkerfakes.FakeChecker ) {
318+ mock .HttpGetReturns (& http.Response {
319+ Body : io .NopCloser (strings .NewReader ("" )),
320+ }, nil )
321+ mock .ReadAllBodyReturns (nil , errTest )
322+ },
323+ assert : func (inCodeFreeze bool , err error ) {
324+ assert .False (t , inCodeFreeze )
325+ assert .NotNil (t , err )
326+ assert .Contains (t , err .Error (), "read response body" )
327+ },
328+ },
329+ {
330+ name : "error on UnmarshalProwConfig" ,
331+ branch : "release-1.34" ,
332+ prepare : func (mock * checkerfakes.FakeChecker ) {
333+ mock .HttpGetReturns (& http.Response {
334+ Body : io .NopCloser (strings .NewReader ("" )),
335+ }, nil )
336+ mock .ReadAllBodyReturns ([]byte {}, nil )
337+ mock .UnmarshalProwConfigReturns (nil , errTest )
338+ },
339+ assert : func (inCodeFreeze bool , err error ) {
340+ assert .False (t , inCodeFreeze )
341+ assert .NotNil (t , err )
342+ assert .Contains (t , err .Error (), "unmarshal prow config" )
343+ },
344+ },
345+ {
346+ name : "error on type assertion" ,
347+ branch : "release-1.34" ,
348+ prepare : func (mock * checkerfakes.FakeChecker ) {
349+ mock .HttpGetReturns (& http.Response {
350+ Body : io .NopCloser (strings .NewReader ("" )),
351+ }, nil )
352+ mock .ReadAllBodyReturns ([]byte {}, nil )
353+ // Return a string instead of *ProwConfig
354+ mock .UnmarshalProwConfigReturns ("wrong type" , nil )
355+ },
356+ assert : func (inCodeFreeze bool , err error ) {
357+ assert .False (t , inCodeFreeze )
358+ assert .NotNil (t , err )
359+ assert .Contains (t , err .Error (), "failed to type assert prow config" )
360+ },
361+ },
362+ } {
363+ t .Run (tc .name , func (t * testing.T ) {
364+ mock := & checkerfakes.FakeChecker {}
365+ tc .prepare (mock )
366+
367+ sut := New (logrus .NewEntry (logrus .StandardLogger ()))
368+ sut .checker = mock
369+
370+ inCodeFreeze , err := sut .inCodeFreeze (tc .branch )
371+
372+ tc .assert (inCodeFreeze , err )
373+ })
374+ }
375+ }
0 commit comments