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  }