go.fuchsia.dev/infra@v0.0.0-20240507153436-9b593402251b/cmd/cl-util/run_postsubmit_tryjobs_test.go (about) 1 // Copyright 2022 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package main 6 7 import ( 8 "testing" 9 10 "github.com/google/go-cmp/cmp" 11 "github.com/google/go-cmp/cmp/cmpopts" 12 buildbucketpb "go.chromium.org/luci/buildbucket/proto" 13 cvpb "go.chromium.org/luci/cv/api/config/v2" 14 ) 15 16 func TestGetAvailablePresubmitBuilders(t *testing.T) { 17 testCases := []struct { 18 name string 19 gerritProject string 20 gerritHost string 21 lucicfg LUCIConfigurationFiles 22 cmd *rptCmd 23 expected []*buildbucketpb.BuilderID 24 }{ 25 { 26 name: "Can add presubmit builders that match the Change.Project and Change.Host", 27 gerritProject: "project", 28 gerritHost: "host.com", 29 lucicfg: LUCIConfigurationFiles{ 30 crBuildBucketConfigs: map[string]*buildbucketpb.BuildbucketCfg{ 31 "project": { 32 Buckets: []*buildbucketpb.Bucket{ 33 { 34 Name: "bucket", 35 Swarming: &buildbucketpb.Swarming{ 36 Builders: []*buildbucketpb.BuilderConfig{ 37 { 38 Name: "builder-a", 39 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 40 }, 41 }, 42 }, 43 }, 44 }, 45 }, 46 }, 47 commitQueueConfig: &cvpb.Config{ 48 ConfigGroups: []*cvpb.ConfigGroup{ 49 { 50 Gerrit: []*cvpb.ConfigGroup_Gerrit{ 51 { 52 Url: "https://host.com", 53 Projects: []*cvpb.ConfigGroup_Gerrit_Project{ 54 { 55 Name: "project", 56 }, 57 }, 58 }, 59 }, 60 Verifiers: &cvpb.Verifiers{ 61 Tryjob: &cvpb.Verifiers_Tryjob{ 62 Builders: []*cvpb.Verifiers_Tryjob_Builder{ 63 { 64 Name: "project/bucket/builder-a", 65 }, 66 { 67 Name: "project/bucket/builder-c", 68 }, 69 }, 70 }, 71 }, 72 }, 73 }, 74 }, 75 }, 76 cmd: &rptCmd{}, 77 expected: []*buildbucketpb.BuilderID{ 78 { 79 Bucket: "bucket", 80 Builder: "builder-a", 81 Project: "project", 82 }, 83 }, 84 }, 85 { 86 name: "Does not pick up builders from incompatible projects", 87 gerritProject: "project", 88 gerritHost: "host.com", 89 lucicfg: LUCIConfigurationFiles{ 90 crBuildBucketConfigs: map[string]*buildbucketpb.BuildbucketCfg{ 91 "project": { 92 Buckets: []*buildbucketpb.Bucket{ 93 { 94 Name: "bucket", 95 Swarming: &buildbucketpb.Swarming{ 96 Builders: []*buildbucketpb.BuilderConfig{ 97 { 98 Name: "builder-a", 99 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 100 }, 101 { 102 Name: "builder-b", 103 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 104 }, 105 }, 106 }, 107 }, 108 }, 109 }, 110 }, 111 commitQueueConfig: &cvpb.Config{ 112 ConfigGroups: []*cvpb.ConfigGroup{ 113 { 114 Gerrit: []*cvpb.ConfigGroup_Gerrit{ 115 { 116 Url: "https://host.com", 117 Projects: []*cvpb.ConfigGroup_Gerrit_Project{ 118 { 119 Name: "project", 120 }, 121 }, 122 }, 123 }, 124 Verifiers: &cvpb.Verifiers{ 125 Tryjob: &cvpb.Verifiers_Tryjob{ 126 Builders: []*cvpb.Verifiers_Tryjob_Builder{ 127 { 128 Name: "project/bucket/builder-a", 129 }, 130 }, 131 }, 132 }, 133 }, 134 { 135 Gerrit: []*cvpb.ConfigGroup_Gerrit{ 136 { 137 Url: "https://host.com", 138 Projects: []*cvpb.ConfigGroup_Gerrit_Project{ 139 { 140 Name: "not-project", 141 }, 142 }, 143 }, 144 }, 145 Verifiers: &cvpb.Verifiers{ 146 Tryjob: &cvpb.Verifiers_Tryjob{ 147 Builders: []*cvpb.Verifiers_Tryjob_Builder{ 148 { 149 Name: "not-project/bucket/builder-b", 150 }, 151 }, 152 }, 153 }, 154 }, 155 }, 156 }, 157 }, 158 cmd: &rptCmd{}, 159 expected: []*buildbucketpb.BuilderID{ 160 { 161 Bucket: "bucket", 162 Builder: "builder-a", 163 Project: "project", 164 }, 165 }, 166 }, 167 { 168 name: "Does not pick up builders from incompatible hosts", 169 gerritProject: "project", 170 gerritHost: "host.com", 171 lucicfg: LUCIConfigurationFiles{ 172 crBuildBucketConfigs: map[string]*buildbucketpb.BuildbucketCfg{ 173 "project": { 174 Buckets: []*buildbucketpb.Bucket{ 175 { 176 Name: "bucket", 177 Swarming: &buildbucketpb.Swarming{ 178 Builders: []*buildbucketpb.BuilderConfig{ 179 { 180 Name: "builder-a", 181 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 182 }, 183 { 184 Name: "builder-b", 185 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 186 }, 187 }, 188 }, 189 }, 190 }, 191 }, 192 }, 193 commitQueueConfig: &cvpb.Config{ 194 ConfigGroups: []*cvpb.ConfigGroup{ 195 { 196 Gerrit: []*cvpb.ConfigGroup_Gerrit{ 197 { 198 Url: "https://host.com", 199 Projects: []*cvpb.ConfigGroup_Gerrit_Project{ 200 { 201 Name: "project", 202 }, 203 }, 204 }, 205 }, 206 Verifiers: &cvpb.Verifiers{ 207 Tryjob: &cvpb.Verifiers_Tryjob{ 208 Builders: []*cvpb.Verifiers_Tryjob_Builder{ 209 { 210 Name: "project/bucket/builder-a", 211 }, 212 }, 213 }, 214 }, 215 }, 216 { 217 Gerrit: []*cvpb.ConfigGroup_Gerrit{ 218 { 219 Url: "https://not-host.com", 220 Projects: []*cvpb.ConfigGroup_Gerrit_Project{ 221 { 222 Name: "project", 223 }, 224 }, 225 }, 226 }, 227 Verifiers: &cvpb.Verifiers{ 228 Tryjob: &cvpb.Verifiers_Tryjob{ 229 Builders: []*cvpb.Verifiers_Tryjob_Builder{ 230 { 231 Name: "project/bucket/builder-b", 232 }, 233 }, 234 }, 235 }, 236 }, 237 }, 238 }, 239 }, 240 cmd: &rptCmd{}, 241 expected: []*buildbucketpb.BuilderID{ 242 { 243 Bucket: "bucket", 244 Builder: "builder-a", 245 Project: "project", 246 }, 247 }, 248 }, 249 } 250 251 for _, tc := range testCases { 252 t.Run(tc.name, func(t *testing.T) { 253 availablePresubmitBuilders := tc.cmd.getAvailablePresubmitBuilders(tc.lucicfg, tc.gerritHost, tc.gerritProject) 254 if diff := cmp.Diff(availablePresubmitBuilders, tc.expected, cmpopts.IgnoreUnexported(buildbucketpb.BuilderID{})); diff != "" { 255 t.Fatalf("unexpected output: (-got +want):\n%s", diff) 256 } 257 }) 258 } 259 } 260 261 func TestGetMissingBuilders(t *testing.T) { 262 t.Run("Returns the diff between TriggeredPresubmitBuilders and AvailablePresubmitBuilders", func(t *testing.T) { 263 triggeredPresubmitBuilds := []*buildbucketpb.Build{ 264 { 265 Builder: &buildbucketpb.BuilderID{ 266 Bucket: "bucket", 267 Builder: "builder-a", 268 Project: "project", 269 }, 270 }, 271 } 272 availablePresubmitBuilders := []*buildbucketpb.BuilderID{ 273 { 274 Bucket: "bucket", 275 Builder: "builder-a", 276 Project: "project", 277 }, 278 { 279 Bucket: "bucket", 280 Builder: "builder-b", 281 Project: "project", 282 }, 283 } 284 cmd := &rptCmd{} 285 expected := []*buildbucketpb.BuilderID{ 286 { 287 Bucket: "bucket", 288 Builder: "builder-b", 289 Project: "project", 290 }, 291 } 292 buildersToTrigger := cmd.getMissingBuilders(availablePresubmitBuilders, triggeredPresubmitBuilds) 293 if diff := cmp.Diff(buildersToTrigger, expected, cmpopts.IgnoreUnexported(buildbucketpb.BuilderID{})); diff != "" { 294 t.Fatalf("unexpected output: (-got +want):\n%s", diff) 295 } 296 }) 297 } 298 299 func TestGetBuildersFlaggedForRpt(t *testing.T) { 300 t.Run("Marks builders flagged for run_postsubmit_tryjobs_include", func(t *testing.T) { 301 bucketWithFlag := &buildbucketpb.Bucket{ 302 Swarming: &buildbucketpb.Swarming{ 303 Builders: []*buildbucketpb.BuilderConfig{ 304 { 305 Name: "builder-a", 306 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": true }}", 307 }, 308 { 309 Name: "builder-b", 310 Properties: "{ \"$fuchsia/builder_tags\": { \"run_postsubmit_tryjobs_include\": false }}", 311 }, 312 }, 313 }, 314 } 315 res := getBuildersFlaggedForRpt(bucketWithFlag) 316 expected := map[string]bool{ 317 "builder-a": true, 318 "builder-b": false, 319 } 320 if diff := cmp.Diff(res, expected); diff != "" { 321 t.Fatalf("unexpected output: (-got +want):\n%s", diff) 322 } 323 }) 324 t.Run("Marks builders that do not have run_postsubmit_tryjobs set as false", func(t *testing.T) { 325 bucketWithoutFlag := &buildbucketpb.Bucket{ 326 Swarming: &buildbucketpb.Swarming{ 327 Builders: []*buildbucketpb.BuilderConfig{ 328 { 329 Name: "builder-a", 330 Properties: "", 331 }, 332 }, 333 }, 334 } 335 res := getBuildersFlaggedForRpt(bucketWithoutFlag) 336 expected := map[string]bool{"builder-a": false} 337 if diff := cmp.Diff(res, expected); diff != "" { 338 t.Fatalf("unexpected output: (-got +want):\n%s", diff) 339 } 340 }) 341 }