| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "io/ioutil" |
| "os" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| buildbucketpb "go.chromium.org/luci/buildbucket/proto" |
| "google.golang.org/protobuf/types/known/structpb" |
| ) |
| |
| func TestResolveBuildProperties(t *testing.T) { |
| t.Parallel() |
| |
| tests := []struct { |
| name string |
| inputProperties map[string]interface{} |
| builderData string |
| expectProperties map[string]interface{} |
| expectErr bool |
| }{ |
| { |
| name: "property versioning disabled", |
| inputProperties: map[string]interface{}{ |
| "foo": "bar", |
| }, |
| expectProperties: map[string]interface{}{ |
| "foo": "bar", |
| }, |
| }, |
| { |
| name: "property versioning enabled", |
| inputProperties: map[string]interface{}{ |
| "enable_property_versioning": true, |
| }, |
| builderData: ` |
| swarming { |
| builders { |
| properties: '{"foo": "bar"}' |
| } |
| }`, |
| expectProperties: map[string]interface{}{ |
| "enable_property_versioning": true, |
| "foo": "bar", |
| }, |
| }, |
| { |
| name: "request properties override integration.git properties", |
| builderData: ` |
| swarming { |
| builders { |
| properties: '{"foo": "bar"}' |
| } |
| }`, |
| inputProperties: map[string]interface{}{ |
| "enable_property_versioning": true, |
| "foo": "user", |
| }, |
| expectProperties: map[string]interface{}{ |
| "enable_property_versioning": true, |
| "foo": "user", |
| }, |
| }, |
| { |
| name: "Multiple builders", |
| inputProperties: map[string]interface{}{ |
| "enable_property_versioning": true, |
| }, |
| builderData: ` |
| swarming { |
| builders { |
| properties: '{"mock_property": "1"}' |
| } |
| builders { |
| properties: '{"mock_property": "2"}' |
| } |
| }`, |
| expectErr: true, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| tmpFile, err := ioutil.TempFile(t.TempDir(), "builder.textproto") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer tmpFile.Close() |
| defer os.Remove(tmpFile.Name()) |
| if _, err := tmpFile.Write([]byte(test.builderData)); err != nil { |
| t.Fatal(err) |
| } |
| build := &buildbucketpb.Build{Input: &buildbucketpb.Build_Input{}} |
| build.Input.Properties, err = structpb.NewStruct(test.inputProperties) |
| if err != nil { |
| t.Fatal(err) |
| } |
| err = resolveBuildProperties(tmpFile.Name(), build) |
| if err != nil { |
| if !test.expectErr { |
| t.Fatalf("got unexpected error: %v", err) |
| } |
| return |
| } else if test.expectErr { |
| t.Fatalf("expected error, got nil") |
| } |
| if diff := cmp.Diff(test.expectProperties, build.Input.Properties.AsMap()); diff != "" { |
| t.Errorf("mergeProperties(): output differs (-want, +got):\n%s", diff) |
| } |
| }) |
| } |
| } |
| |
| func TestBuilderProperties(t *testing.T) { |
| t.Parallel() |
| |
| tests := []struct { |
| name string |
| builderData string |
| expectProperties map[string]interface{} |
| expectErr bool |
| }{ |
| { |
| name: "Builder file data doesn't match the Bucket schema", |
| builderData: `"foo":bar`, |
| expectErr: true, |
| }, |
| { |
| name: "Different type of properties", |
| builderData: ` |
| swarming { |
| builders { |
| properties: |
| '{' |
| ' "nested_map": {' |
| ' "server": "url"' |
| ' },' |
| ' "number": 1234,' |
| ' "bool": true' |
| '}' |
| } |
| }`, |
| expectProperties: map[string]interface{}{ |
| "nested_map": map[string]interface{}{ |
| "server": "url", |
| }, |
| "number": float64(1234), |
| "bool": true, |
| }, |
| }, |
| { |
| name: "No builders in builder file", |
| expectErr: true, |
| }, |
| { |
| name: "Multiple builders in builder file", |
| builderData: ` |
| swarming { |
| builders { |
| properties: '{"mock_property": ""}' |
| } |
| builders { |
| properties: '{"mock_property": ""}' |
| } |
| }`, |
| expectErr: true, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| got, err := builderProperties([]byte(test.builderData)) |
| if err != nil { |
| if !test.expectErr { |
| t.Fatalf("got unexpected error: %v", err) |
| } |
| return |
| } else if test.expectErr { |
| t.Fatalf("expected error, got nil") |
| } |
| if diff := cmp.Diff(test.expectProperties, got.AsMap()); diff != "" { |
| t.Errorf("builderProperties(): output differs (-want, +got):\n%s", diff) |
| } |
| }) |
| } |
| } |