blob: 4a5a7c287fbbd9543adc137ec540ceeffde24e2f [file] [log] [blame]
// 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 digests
import (
"bytes"
"strings"
"testing"
api "go.chromium.org/luci/cipd/api/cipd/v1"
. "github.com/smartystreets/goconvey/convey"
. "go.chromium.org/luci/common/testing/assertions"
)
func TestClientDigestsFile(t *testing.T) {
t.Parallel()
sha1 := func(char string) *api.ObjectRef {
return &api.ObjectRef{
HashAlgo: api.HashAlgo_SHA1,
HexDigest: strings.Repeat(char, 40),
}
}
sha256 := func(char string) *api.ObjectRef {
return &api.ObjectRef{
HashAlgo: api.HashAlgo_SHA256,
HexDigest: strings.Repeat(char, 64),
}
}
Convey("Works", t, func() {
df := ClientDigestsFile{}
df.AddClientRef("linux-amd64", sha1("a"))
df.AddClientRef("linux-amd64", sha256("b"))
df.AddClientRef("windows-amd64", sha1("c"))
So(df.ClientRef("linux-amd64"), ShouldResemble, sha256("b"))
So(df.ClientRef("windows-amd64"), ShouldResemble, sha1("c"))
So(df.ClientRef("unknown"), ShouldBeNil)
So(df.Contains("linux-amd64", sha1("a")), ShouldBeTrue)
So(df.Contains("linux-amd64", sha256("b")), ShouldBeTrue)
So(df.Contains("linux-amd64", sha1("c")), ShouldBeFalse)
So(df.Contains("unknown", sha1("a")), ShouldBeFalse)
})
Convey("Errors in AddClientRef", t, func() {
df := ClientDigestsFile{}
So(df.AddClientRef("linux-amd64", &api.ObjectRef{
HashAlgo: 12345,
HexDigest: "aaaa",
}), ShouldErrLike, "unsupported hash algorithm")
df.AddClientRef("linux-amd64", sha1("a"))
So(df.AddClientRef("linux-amd64", sha1("a")), ShouldErrLike, "has already been added")
})
Convey("Equal", t, func() {
df1 := ClientDigestsFile{
entries: []clientDigestEntry{
{"a", sha1("a")}, {"b", sha1("b")},
},
}
df2 := ClientDigestsFile{
entries: []clientDigestEntry{
{"b", sha1("b")}, {"a", sha1("a")},
},
}
df3 := ClientDigestsFile{
entries: []clientDigestEntry{
{"a", sha1("a")},
},
}
df4 := ClientDigestsFile{
entries: []clientDigestEntry{
{"a", sha1("b")},
},
}
So(df1.Equal(&df1), ShouldBeTrue)
So(df1.Equal(&df2), ShouldBeFalse)
So(df1.Equal(&df3), ShouldBeFalse)
So(df3.Equal(&df4), ShouldBeFalse)
})
Convey("Sort", t, func() {
df := ClientDigestsFile{
entries: []clientDigestEntry{
{"windows-amd64", sha1("a")},
{"linux-amd64", sha1("b")},
{"linux-amd64", sha256("c")},
},
}
df.Sort()
So(df, ShouldResemble, ClientDigestsFile{
entries: []clientDigestEntry{
{"linux-amd64", sha256("c")},
{"linux-amd64", sha1("b")},
{"windows-amd64", sha1("a")},
},
})
})
Convey("Serialization", t, func() {
df := ClientDigestsFile{
entries: []clientDigestEntry{
{"windows-amd64", sha1("a")},
{"linux-amd64", sha1("b")},
{"linux-amd64", sha256("c")},
},
}
buf := bytes.Buffer{}
So(df.Serialize(&buf, "tag:val", "cipd_client_version"), ShouldBeNil)
So(buf.String(), ShouldEqual, strings.Join([]string{
`# This file was generated by`,
`#`,
`# cipd selfupdate-roll -version-file cipd_client_version \`,
`# -version tag:val`,
`#`,
`# Do not modify manually. All changes will be overwritten.`,
`# Use 'cipd selfupdate-roll ...' to modify.`,
``,
`windows-amd64 sha1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`,
`linux-amd64 sha1 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`,
`linux-amd64 sha256 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`,
``,
}, "\n"))
})
Convey("Parsing success", t, func() {
df, err := ParseClientDigestsFile(strings.NewReader(strings.Join([]string{
"# Comment",
"linux-amd64 sha256 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"",
" # Another comment",
"linux-amd64 unknown bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"linux-amd64 sha1 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"windows-amd64 sha1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
}, "\n")))
So(err, ShouldBeNil)
So(df, ShouldResemble, &ClientDigestsFile{
entries: []clientDigestEntry{
{"linux-amd64", sha256("c")},
{"linux-amd64", sha1("b")},
{"windows-amd64", sha1("a")},
},
})
})
Convey("Parsing errors", t, func() {
call := func(lines ...string) error {
df, err := ParseClientDigestsFile(strings.NewReader(strings.Join(lines, "\n")))
So(err, ShouldNotBeNil)
So(df, ShouldBeNil)
return err
}
So(call("linux-amd64 sha1"), ShouldErrLike, "must have format")
So(call("linux-amd64 sha256 aaaaaa"), ShouldErrLike, "invalid SHA256 digest")
So(call(
"linux-amd64 sha1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"linux-amd64 sha1 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
), ShouldErrLike, "has already been added")
})
}