go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/analysis/pbutil/predicate_test.go (about)

     1  // Copyright 2022 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 pbutil
    16  
    17  import (
    18  	"context"
    19  	"strings"
    20  	"testing"
    21  	"time"
    22  
    23  	"google.golang.org/protobuf/types/known/timestamppb"
    24  
    25  	"go.chromium.org/luci/common/clock/testclock"
    26  
    27  	pb "go.chromium.org/luci/analysis/proto/v1"
    28  
    29  	. "github.com/smartystreets/goconvey/convey"
    30  	. "go.chromium.org/luci/common/testing/assertions"
    31  )
    32  
    33  func TestValidateVariantPredicate(t *testing.T) {
    34  	Convey(`TestValidateVariantPredicate`, t, func() {
    35  		validVariant := Variant("a", "b")
    36  		invalidVariant := Variant("", "")
    37  
    38  		Convey(`Equals`, func() {
    39  			Convey(`Valid`, func() {
    40  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    41  					Predicate: &pb.VariantPredicate_Equals{Equals: validVariant},
    42  				})
    43  				So(err, ShouldBeNil)
    44  			})
    45  			Convey(`Invalid`, func() {
    46  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    47  					Predicate: &pb.VariantPredicate_Equals{Equals: invalidVariant},
    48  				})
    49  				So(err, ShouldErrLike, `equals: "":"": key: unspecified`)
    50  			})
    51  		})
    52  
    53  		Convey(`Contains`, func() {
    54  			Convey(`Valid`, func() {
    55  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    56  					Predicate: &pb.VariantPredicate_Contains{Contains: validVariant},
    57  				})
    58  				So(err, ShouldBeNil)
    59  			})
    60  			Convey(`Invalid`, func() {
    61  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    62  					Predicate: &pb.VariantPredicate_Contains{Contains: invalidVariant},
    63  				})
    64  				So(err, ShouldErrLike, `contains: "":"": key: unspecified`)
    65  			})
    66  		})
    67  
    68  		Convey(`HashEquals`, func() {
    69  			Convey(`Valid`, func() {
    70  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    71  					Predicate: &pb.VariantPredicate_HashEquals{HashEquals: VariantHash(validVariant)},
    72  				})
    73  				So(err, ShouldBeNil)
    74  			})
    75  			Convey(`Empty string`, func() {
    76  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    77  					Predicate: &pb.VariantPredicate_HashEquals{HashEquals: ""},
    78  				})
    79  				So(err, ShouldErrLike, "hash_equals: unspecified")
    80  			})
    81  			Convey(`Upper case`, func() {
    82  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    83  					Predicate: &pb.VariantPredicate_HashEquals{HashEquals: strings.ToUpper(VariantHash(validVariant))},
    84  				})
    85  				So(err, ShouldErrLike, "hash_equals: does not match")
    86  			})
    87  			Convey(`Invalid length`, func() {
    88  				err := ValidateVariantPredicate(&pb.VariantPredicate{
    89  					Predicate: &pb.VariantPredicate_HashEquals{HashEquals: VariantHash(validVariant)[1:]},
    90  				})
    91  				So(err, ShouldErrLike, "hash_equals: does not match")
    92  			})
    93  		})
    94  
    95  		Convey(`Unspecified`, func() {
    96  			err := ValidateVariantPredicate(&pb.VariantPredicate{})
    97  			So(err, ShouldErrLike, `unspecified`)
    98  		})
    99  	})
   100  }
   101  
   102  func TestValidateTimeRange(t *testing.T) {
   103  	Convey(`ValidateTimeRange`, t, func() {
   104  		ctx := context.Background()
   105  		now := time.Date(2044, time.April, 4, 4, 4, 4, 4, time.UTC)
   106  		ctx, _ = testclock.UseTime(ctx, now)
   107  
   108  		Convey(`Unspecified`, func() {
   109  			err := ValidateTimeRange(ctx, nil)
   110  			So(err, ShouldErrLike, `unspecified`)
   111  		})
   112  		Convey(`Earliest unspecified`, func() {
   113  			tr := &pb.TimeRange{
   114  				Latest: timestamppb.New(now.Add(-1 * time.Hour)),
   115  			}
   116  			err := ValidateTimeRange(ctx, tr)
   117  			So(err, ShouldErrLike, `earliest: unspecified`)
   118  		})
   119  		Convey(`Latest unspecified`, func() {
   120  			tr := &pb.TimeRange{
   121  				Earliest: timestamppb.New(now.Add(-1 * time.Hour)),
   122  			}
   123  			err := ValidateTimeRange(ctx, tr)
   124  			So(err, ShouldErrLike, `latest: unspecified`)
   125  		})
   126  		Convey(`Earliest before Latest`, func() {
   127  			tr := &pb.TimeRange{
   128  				Earliest: timestamppb.New(now.Add(-1 * time.Hour)),
   129  				Latest:   timestamppb.New(now.Add(-2 * time.Hour)),
   130  			}
   131  			err := ValidateTimeRange(ctx, tr)
   132  			So(err, ShouldErrLike, `earliest must be before latest`)
   133  		})
   134  		Convey(`Valid`, func() {
   135  			tr := &pb.TimeRange{
   136  				Earliest: timestamppb.New(now.Add(-1 * time.Hour)),
   137  				Latest:   timestamppb.New(now.Add(-1 * time.Microsecond)),
   138  			}
   139  			err := ValidateTimeRange(ctx, tr)
   140  			So(err, ShouldBeNil)
   141  		})
   142  	})
   143  }