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 }