go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/buildbucket/protoutil/builder_test.go (about)

     1  // Copyright 2019 The LUCI Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package protoutil
    16  
    17  import (
    18  	"testing"
    19  
    20  	pb "go.chromium.org/luci/buildbucket/proto"
    21  
    22  	. "github.com/smartystreets/goconvey/convey"
    23  	. "go.chromium.org/luci/common/testing/assertions"
    24  )
    25  
    26  func TestValidateBuilderID(t *testing.T) {
    27  	t.Parallel()
    28  
    29  	Convey("ValidateBuilderID", t, func() {
    30  		Convey("nil", func() {
    31  			err := ValidateBuilderID(nil)
    32  			So(err, ShouldErrLike, "project must match")
    33  		})
    34  
    35  		Convey("empty", func() {
    36  			b := &pb.BuilderID{}
    37  			err := ValidateBuilderID(b)
    38  			So(err, ShouldErrLike, "project must match")
    39  		})
    40  
    41  		Convey("project", func() {
    42  			b := &pb.BuilderID{}
    43  			err := ValidateBuilderID(b)
    44  			So(err, ShouldErrLike, "project must match")
    45  		})
    46  
    47  		Convey("bucket", func() {
    48  			Convey("empty", func() {
    49  				b := &pb.BuilderID{
    50  					Project: "project",
    51  				}
    52  				err := ValidateBuilderID(b)
    53  				So(err, ShouldBeNil)
    54  			})
    55  
    56  			Convey("invalid", func() {
    57  				b := &pb.BuilderID{
    58  					Project: "project",
    59  					Bucket:  "bucket!",
    60  				}
    61  				err := ValidateBuilderID(b)
    62  				So(err, ShouldErrLike, "bucket must match")
    63  			})
    64  
    65  			Convey("v1", func() {
    66  				b := &pb.BuilderID{
    67  					Project: "project",
    68  					Bucket:  "luci.project.bucket",
    69  				}
    70  				err := ValidateBuilderID(b)
    71  				So(err, ShouldErrLike, "invalid use of v1 bucket in v2 API")
    72  			})
    73  
    74  			Convey("ok", func() {
    75  				b := &pb.BuilderID{
    76  					Project: "project",
    77  					Bucket:  "bucket",
    78  				}
    79  				err := ValidateBuilderID(b)
    80  				So(err, ShouldBeNil)
    81  			})
    82  		})
    83  
    84  		Convey("builder", func() {
    85  			Convey("empty", func() {
    86  				b := &pb.BuilderID{
    87  					Project: "project",
    88  				}
    89  				err := ValidateBuilderID(b)
    90  				So(err, ShouldBeNil)
    91  			})
    92  
    93  			Convey("invalid", func() {
    94  				b := &pb.BuilderID{
    95  					Project: "project",
    96  					Builder: "builder!",
    97  				}
    98  				err := ValidateBuilderID(b)
    99  				So(err, ShouldErrLike, "builder must match")
   100  			})
   101  
   102  			Convey("ok", func() {
   103  				b := &pb.BuilderID{
   104  					Project: "project",
   105  					Builder: "builder",
   106  				}
   107  				err := ValidateBuilderID(b)
   108  				So(err, ShouldBeNil)
   109  			})
   110  		})
   111  	})
   112  }
   113  
   114  func TestValidateRequiredBuilderID(t *testing.T) {
   115  	t.Parallel()
   116  
   117  	Convey("ValidateRequiredBuilderID", t, func() {
   118  		Convey("nil", func() {
   119  			err := ValidateRequiredBuilderID(nil)
   120  			So(err, ShouldErrLike, "project must match")
   121  		})
   122  
   123  		Convey("empty", func() {
   124  			b := &pb.BuilderID{}
   125  			err := ValidateRequiredBuilderID(b)
   126  			So(err, ShouldErrLike, "project must match")
   127  		})
   128  
   129  		Convey("project", func() {
   130  			b := &pb.BuilderID{}
   131  			err := ValidateRequiredBuilderID(b)
   132  			So(err, ShouldErrLike, "project must match")
   133  		})
   134  
   135  		Convey("bucket", func() {
   136  			Convey("empty", func() {
   137  				b := &pb.BuilderID{
   138  					Project: "project",
   139  				}
   140  				err := ValidateRequiredBuilderID(b)
   141  				So(err, ShouldErrLike, "bucket is required")
   142  			})
   143  
   144  			Convey("invalid", func() {
   145  				b := &pb.BuilderID{
   146  					Project: "project",
   147  					Bucket:  "bucket!",
   148  				}
   149  				err := ValidateRequiredBuilderID(b)
   150  				So(err, ShouldErrLike, "bucket must match")
   151  			})
   152  
   153  			Convey("v1", func() {
   154  				b := &pb.BuilderID{
   155  					Project: "project",
   156  					Bucket:  "luci.project.bucket",
   157  				}
   158  				err := ValidateRequiredBuilderID(b)
   159  				So(err, ShouldErrLike, "invalid use of v1 bucket in v2 API")
   160  			})
   161  
   162  			Convey("builder", func() {
   163  				Convey("empty", func() {
   164  					b := &pb.BuilderID{
   165  						Project: "project",
   166  						Bucket:  "bucket",
   167  					}
   168  					err := ValidateRequiredBuilderID(b)
   169  					So(err, ShouldErrLike, "builder is required")
   170  				})
   171  
   172  				Convey("invalid", func() {
   173  					b := &pb.BuilderID{
   174  						Project: "project",
   175  						Bucket:  "bucket",
   176  						Builder: "builder!",
   177  					}
   178  					err := ValidateRequiredBuilderID(b)
   179  					So(err, ShouldErrLike, "builder must match")
   180  				})
   181  
   182  				Convey("ok", func() {
   183  					b := &pb.BuilderID{
   184  						Project: "project",
   185  						Bucket:  "bucket",
   186  						Builder: "builder",
   187  					}
   188  					err := ValidateRequiredBuilderID(b)
   189  					So(err, ShouldBeNil)
   190  				})
   191  			})
   192  		})
   193  	})
   194  }
   195  
   196  func TestBuilderConversion(t *testing.T) {
   197  	t.Parallel()
   198  
   199  	Convey("FormatBuilderID", t, func() {
   200  		So(FormatBuilderID(&pb.BuilderID{
   201  			Project: "proj",
   202  			Bucket:  "bucket",
   203  			Builder: "builder",
   204  		}),
   205  			ShouldEqual,
   206  			"proj/bucket/builder")
   207  	})
   208  
   209  	Convey("FormatBucketID", t, func() {
   210  		So(FormatBucketID("proj", "bucket"), ShouldEqual, "proj/bucket")
   211  	})
   212  
   213  	Convey("ParseBucketID", t, func() {
   214  		Convey("valid", func() {
   215  			p, b, err := ParseBucketID("proj/bucket")
   216  			So(err, ShouldBeNil)
   217  			So(p, ShouldEqual, "proj")
   218  			So(b, ShouldEqual, "bucket")
   219  		})
   220  
   221  		Convey("invalid", func() {
   222  			_, _, err := ParseBucketID("proj/bucket/bldr")
   223  			So(err, ShouldErrLike, "invalid bucket id; must have 1 slash")
   224  
   225  			_, _, err = ParseBucketID(" / ")
   226  			So(err, ShouldErrLike, "invalid bucket id; project is empty")
   227  
   228  			_, _, err = ParseBucketID("proj/ ")
   229  			So(err, ShouldErrLike, "invalid bucket id; bucket is empty")
   230  		})
   231  	})
   232  }