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  }