| // Copyright 2018 The LUCI Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package cipd |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| "strings" |
| "testing" |
| "time" |
| |
| "google.golang.org/protobuf/types/known/timestamppb" |
| |
| api "go.chromium.org/luci/cipd/api/cipd/v1" |
| "go.chromium.org/luci/cipd/common" |
| |
| . "github.com/smartystreets/goconvey/convey" |
| ) |
| |
| func TestUnixTime(t *testing.T) { |
| t.Parallel() |
| |
| Convey("Zero works", t, func() { |
| z := UnixTime{} |
| |
| So(z.IsZero(), ShouldBeTrue) |
| So(z.String(), ShouldEqual, "0001-01-01 00:00:00 +0000 UTC") |
| |
| buf, err := json.Marshal(map[string]interface{}{ |
| "key": z, |
| }) |
| So(err, ShouldBeNil) |
| So(string(buf), ShouldEqual, `{"key":0}`) |
| }) |
| |
| Convey("Non-zero works", t, func() { |
| t1 := UnixTime(time.Unix(1530934723, 0).UTC()) |
| |
| So(t1.IsZero(), ShouldBeFalse) |
| So(t1.String(), ShouldEqual, "2018-07-07 03:38:43 +0000 UTC") |
| |
| buf, err := json.Marshal(map[string]interface{}{ |
| "key": t1, |
| }) |
| So(err, ShouldBeNil) |
| So(string(buf), ShouldEqual, `{"key":1530934723}`) |
| |
| So(t1.Before(UnixTime{}), ShouldBeFalse) |
| }) |
| } |
| |
| func TestJSONError(t *testing.T) { |
| t.Parallel() |
| |
| Convey("Nil works", t, func() { |
| buf, err := json.Marshal(map[string]interface{}{ |
| "key": JSONError{}, |
| }) |
| So(err, ShouldBeNil) |
| So(string(buf), ShouldEqual, `{"key":null}`) |
| }) |
| |
| Convey("Non-nil works", t, func() { |
| buf, err := json.Marshal(map[string]interface{}{ |
| "key": JSONError{fmt.Errorf("some error message")}, |
| }) |
| So(err, ShouldBeNil) |
| So(string(buf), ShouldEqual, `{"key":"some error message"}`) |
| }) |
| } |
| |
| func TestApiDescToInfo(t *testing.T) { |
| t.Parallel() |
| |
| ts := time.Unix(1530934723, 0).UTC() |
| |
| apiInst := &api.Instance{ |
| Package: "a", |
| Instance: &api.ObjectRef{ |
| HashAlgo: api.HashAlgo_SHA256, |
| HexDigest: strings.Repeat("0", 64), |
| }, |
| RegisteredBy: "user:a@example.com", |
| RegisteredTs: timestamppb.New(ts), |
| } |
| |
| instInfo := InstanceInfo{ |
| Pin: common.Pin{ |
| PackageName: "a", |
| InstanceID: common.ObjectRefToInstanceID(apiInst.Instance), |
| }, |
| RegisteredBy: "user:a@example.com", |
| RegisteredTs: UnixTime(ts), |
| } |
| |
| Convey("Only instance info", t, func() { |
| So( |
| apiDescToInfo(&api.DescribeInstanceResponse{Instance: apiInst}), |
| ShouldResemble, |
| &InstanceDescription{InstanceInfo: instInfo}, |
| ) |
| }) |
| |
| Convey("With tags and refs", t, func() { |
| in := &api.DescribeInstanceResponse{ |
| Instance: apiInst, |
| Tags: []*api.Tag{ |
| { |
| Key: "k", |
| Value: "v", |
| AttachedBy: "user:t@example.com", |
| AttachedTs: timestamppb.New(ts.Add(time.Second)), |
| }, |
| }, |
| Refs: []*api.Ref{ |
| { |
| Name: "ref", |
| Instance: apiInst.Instance, |
| ModifiedBy: "user:r@example.com", |
| ModifiedTs: timestamppb.New(ts.Add(2 * time.Second)), |
| }, |
| }, |
| } |
| So(apiDescToInfo(in), ShouldResemble, &InstanceDescription{ |
| InstanceInfo: instInfo, |
| Tags: []TagInfo{ |
| { |
| Tag: "k:v", |
| RegisteredBy: "user:t@example.com", |
| RegisteredTs: UnixTime(ts.Add(time.Second)), |
| }, |
| }, |
| Refs: []RefInfo{ |
| { |
| Ref: "ref", |
| InstanceID: instInfo.Pin.InstanceID, |
| ModifiedBy: "user:r@example.com", |
| ModifiedTs: UnixTime(ts.Add(2 * time.Second)), |
| }, |
| }, |
| }) |
| }) |
| } |