go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/scheduler/appengine/engine/policy/request_builder_test.go (about) 1 // Copyright 2018 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 policy 16 17 import ( 18 "testing" 19 20 "google.golang.org/protobuf/types/known/structpb" 21 22 api "go.chromium.org/luci/scheduler/api/scheduler/v1" 23 "go.chromium.org/luci/scheduler/appengine/internal" 24 "go.chromium.org/luci/scheduler/appengine/task" 25 26 . "github.com/smartystreets/goconvey/convey" 27 28 . "go.chromium.org/luci/common/testing/assertions" 29 ) 30 31 func TestRequestBuilder(t *testing.T) { 32 t.Parallel() 33 34 Convey("FromCronTrigger", t, func() { 35 r := RequestBuilder{} 36 r.FromTrigger(&internal.Trigger{ 37 Payload: &internal.Trigger_Cron{}, 38 }) 39 So(r.Request, ShouldResemble, task.Request{}) 40 }) 41 42 Convey("FromWebUITrigger", t, func() { 43 r := RequestBuilder{} 44 r.FromTrigger(&internal.Trigger{ 45 Payload: &internal.Trigger_Webui{}, 46 }) 47 So(r.Request, ShouldResemble, task.Request{}) 48 }) 49 50 Convey("FromNoopTrigger", t, func() { 51 r := RequestBuilder{} 52 r.FromTrigger(&internal.Trigger{ 53 Payload: &internal.Trigger_Noop{Noop: &api.NoopTrigger{Data: "abc"}}, 54 }) 55 So(r.Request.Properties, ShouldResembleProto, &structpb.Struct{ 56 Fields: map[string]*structpb.Value{ 57 "noop_trigger_data": { 58 Kind: &structpb.Value_StringValue{StringValue: "abc"}, 59 }, 60 }, 61 }) 62 So(r.Request.Tags, ShouldBeEmpty) 63 }) 64 65 Convey("FromGitilesTrigger good", t, func() { 66 r := RequestBuilder{} 67 r.FromTrigger(&internal.Trigger{ 68 Payload: &internal.Trigger_Gitiles{Gitiles: &api.GitilesTrigger{ 69 Repo: "https://example.googlesource.com/repo.git", 70 Ref: "refs/heads/master", 71 Revision: "aaaaaaaa", 72 }}, 73 }) 74 So(r.Request.Properties, ShouldResembleProto, &structpb.Struct{ 75 Fields: map[string]*structpb.Value{ 76 "revision": { 77 Kind: &structpb.Value_StringValue{StringValue: "aaaaaaaa"}, 78 }, 79 "branch": { 80 Kind: &structpb.Value_StringValue{StringValue: "refs/heads/master"}, 81 }, 82 "repository": { 83 Kind: &structpb.Value_StringValue{StringValue: "https://example.googlesource.com/repo.git"}, 84 }, 85 }, 86 }) 87 So(r.Request.Tags, ShouldResemble, []string{ 88 "buildset:commit/gitiles/example.googlesource.com/repo/+/aaaaaaaa", 89 "gitiles_ref:refs/heads/master", 90 }) 91 }) 92 93 Convey("FromGitilesTrigger with extra properties and tags", t, func() { 94 r := RequestBuilder{} 95 r.FromTrigger(&internal.Trigger{ 96 Payload: &internal.Trigger_Gitiles{Gitiles: &api.GitilesTrigger{ 97 Repo: "https://example.googlesource.com/repo.git", 98 Ref: "refs/heads/master", 99 Revision: "aaaaaaaa", 100 Properties: mergeIntoStruct(&structpb.Struct{}, map[string]string{ 101 "revision": "will-be-overridden", 102 "stuff": "remains", 103 }), 104 Tags: []string{ 105 "tag1:val1", 106 "gitiles_ref:not-overridden", 107 "tag1:val1", // dup 108 }, 109 }}, 110 }) 111 So(r.Request.Properties, ShouldResembleProto, &structpb.Struct{ 112 Fields: map[string]*structpb.Value{ 113 "revision": { 114 Kind: &structpb.Value_StringValue{StringValue: "aaaaaaaa"}, 115 }, 116 "branch": { 117 Kind: &structpb.Value_StringValue{StringValue: "refs/heads/master"}, 118 }, 119 "repository": { 120 Kind: &structpb.Value_StringValue{StringValue: "https://example.googlesource.com/repo.git"}, 121 }, 122 "stuff": { 123 Kind: &structpb.Value_StringValue{StringValue: "remains"}, 124 }, 125 }, 126 }) 127 So(r.Request.Tags, ShouldResemble, []string{ 128 "buildset:commit/gitiles/example.googlesource.com/repo/+/aaaaaaaa", 129 "gitiles_ref:refs/heads/master", 130 "tag1:val1", 131 "gitiles_ref:not-overridden", 132 }) 133 }) 134 135 Convey("FromGitilesTrigger bad", t, func() { 136 r := RequestBuilder{} 137 r.FromTrigger(&internal.Trigger{ 138 Payload: &internal.Trigger_Gitiles{Gitiles: &api.GitilesTrigger{ 139 Repo: "https://zzz.example.com/repo", 140 Ref: "refs/heads/master", 141 Revision: "aaaaaaaa", 142 }}, 143 }) 144 So(r.Request, ShouldResemble, task.Request{ 145 DebugLog: "Bad repo URL \"https://zzz.example.com/repo\" in the trigger " + 146 "- only .googlesource.com repos are supported\n", 147 }) 148 }) 149 150 Convey("FromBuildbucketTrigger", t, func() { 151 r := RequestBuilder{} 152 r.FromTrigger(&internal.Trigger{ 153 Payload: &internal.Trigger_Buildbucket{Buildbucket: &api.BuildbucketTrigger{ 154 Properties: mergeIntoStruct(&structpb.Struct{}, map[string]string{"a": "b"}), 155 Tags: []string{"c:d"}, 156 }}, 157 }) 158 So(r.Request.Properties, ShouldResembleProto, &structpb.Struct{ 159 Fields: map[string]*structpb.Value{ 160 "a": { 161 Kind: &structpb.Value_StringValue{StringValue: "b"}, 162 }, 163 }, 164 }) 165 So(r.Request.Tags, ShouldResemble, []string{"c:d"}) 166 }) 167 168 Convey("From unknown", t, func() { 169 r := RequestBuilder{} 170 r.FromTrigger(&internal.Trigger{}) 171 So(r.Request, ShouldResemble, task.Request{ 172 DebugLog: "Unrecognized trigger payload of type <nil>, ignoring\n", 173 }) 174 }) 175 }