blob: ce6cf906a02d89bb60918073d58a36aeb00d15f9 [file] [log] [blame]
// Copyright 2017 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 spec
import (
"testing"
"go.chromium.org/luci/vpython/api/vpython"
. "github.com/smartystreets/goconvey/convey"
. "go.chromium.org/luci/common/testing/assertions"
)
func TestNormalizeAndHash(t *testing.T) {
t.Parallel()
Convey(`Test manifest generation`, t, func() {
otherTag := &vpython.PEP425Tag{Python: "otherPython", Abi: "otherABI", Platform: "otherPlatform"}
maybeTag := &vpython.PEP425Tag{Python: "maybePython", Abi: "maybeABI", Platform: "maybePlatform"}
pkgFoo := &vpython.Spec_Package{Name: "foo", Version: "1"}
pkgFooV2 := &vpython.Spec_Package{Name: "foo", Version: "2"}
pkgBar := &vpython.Spec_Package{Name: "bar", Version: "2"}
pkgBaz := &vpython.Spec_Package{Name: "baz", Version: "3"}
env := vpython.Environment{
Pep425Tag: []*vpython.PEP425Tag{otherTag},
}
var rt vpython.Runtime
Convey(`Will normalize an empty spec`, func() {
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env, ShouldResemble, vpython.Environment{
Spec: &vpython.Spec{},
Runtime: &vpython.Runtime{},
Pep425Tag: []*vpython.PEP425Tag{otherTag},
})
})
Convey(`With a non-nil spec`, func() {
env.Spec = &vpython.Spec{}
Convey(`Will normalize to sorted order.`, func() {
env.Spec.Wheel = []*vpython.Spec_Package{pkgFoo, pkgBar, pkgBaz}
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgBar, pkgBaz, pkgFoo},
})
So(Hash(env.Spec, &rt), ShouldEqual, "1e32c02610b51f8c3807203fccd3e8d01d252868d52eb4ee9df135ef6533c5ae")
So(Hash(env.Spec, &rt, "extra"), ShouldEqual, "d047eb021f50534c050aaa10c70dc7b4a9b511fab00cf67a191b2b0805f24420")
})
Convey(`With a match entry, will match tags`, func() {
pkgMaybe := &vpython.Spec_Package{Name: "maybe", Version: "3", MatchTag: []*vpython.PEP425Tag{
{Python: maybeTag.Python},
}}
env.Spec.Wheel = []*vpython.Spec_Package{pkgFoo, pkgMaybe}
Convey(`Will omit the package if it doesn't match a tag`, func() {
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgFoo},
})
})
Convey(`Will include the package if it matches a tag, and strip the match field.`, func() {
env.Pep425Tag = append(env.Pep425Tag, maybeTag)
So(NormalizeEnvironment(&env), ShouldBeNil)
pkgMaybe.MatchTag = nil
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgFoo, pkgMaybe},
})
})
})
Convey(`With multiple match entries, will match tags`, func() {
pkgMaybe := &vpython.Spec_Package{Name: "maybe", Version: "3", MatchTag: []*vpython.PEP425Tag{
{Python: maybeTag.Python},
}}
pkgMaybeNonexistTag := &vpython.Spec_Package{Name: "maybe", Version: "3", MatchTag: []*vpython.PEP425Tag{
{Python: "nonexist"},
}}
env.Spec.Wheel = []*vpython.Spec_Package{pkgMaybe, pkgFoo, pkgMaybeNonexistTag}
env.Pep425Tag = append(env.Pep425Tag, maybeTag)
So(NormalizeEnvironment(&env), ShouldBeNil)
pkgMaybe.MatchTag = nil
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgFoo, pkgMaybe},
})
})
Convey(`With one absolute and one match, will always match`, func() {
pkgAlways := &vpython.Spec_Package{Name: "maybe", Version: "3"}
pkgMaybeNonexistTag := &vpython.Spec_Package{Name: "maybe", Version: "3", MatchTag: []*vpython.PEP425Tag{
{Python: "nonexist"},
}}
env.Spec.Wheel = []*vpython.Spec_Package{pkgFoo, pkgMaybeNonexistTag}
env.Pep425Tag = append(env.Pep425Tag, maybeTag)
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgFoo},
})
env.Spec.Wheel = []*vpython.Spec_Package{pkgAlways, pkgFoo, pkgMaybeNonexistTag}
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgFoo, pkgAlways},
})
})
Convey(`Will normalize if there are duplicate wheels that share a version.`, func() {
env.Spec.Wheel = []*vpython.Spec_Package{pkgFoo, pkgFoo, pkgBar, pkgBaz}
So(NormalizeEnvironment(&env), ShouldBeNil)
So(env.Spec, ShouldResemble, &vpython.Spec{
Wheel: []*vpython.Spec_Package{pkgBar, pkgBaz, pkgFoo},
})
})
Convey(`Will fail to normalize if there are duplicate wheels with different versions.`, func() {
env.Spec.Wheel = []*vpython.Spec_Package{pkgFoo, pkgFooV2, pkgFoo, pkgBar, pkgBaz}
So(NormalizeEnvironment(&env), ShouldErrLike, "multiple versions for package")
})
Convey(`Will normalize if there is a duplicate wheel with a different version, but it doesn't match.`, func() {
env.Pep425Tag = append(env.Pep425Tag, maybeTag)
pkgMaybe := &vpython.Spec_Package{Name: "maybe", Version: "3", MatchTag: []*vpython.PEP425Tag{
{Python: maybeTag.Python},
}}
pkgSkipped := &vpython.Spec_Package{Name: "maybe", Version: "4", NotMatchTag: []*vpython.PEP425Tag{
{Python: otherTag.Python},
}}
env.Spec.Wheel = []*vpython.Spec_Package{pkgMaybe, pkgSkipped}
So(NormalizeEnvironment(&env), ShouldBeNil)
})
})
})
}