Make registered more testable

This commit is contained in:
Daniel Smith 2016-08-15 16:52:12 -07:00
parent 2b34988712
commit 7ac0b929b8
2 changed files with 127 additions and 98 deletions

View File

@ -32,8 +32,13 @@ import (
) )
var ( var (
DefaultAPIRegistrationManager = NewOrDie(os.Getenv("KUBE_API_VERSIONS"))
)
// APIRegistrationManager
type APIRegistrationManager struct {
// registeredGroupVersions stores all API group versions for which RegisterGroup is called. // registeredGroupVersions stores all API group versions for which RegisterGroup is called.
registeredVersions = map[unversioned.GroupVersion]struct{}{} registeredVersions map[unversioned.GroupVersion]struct{}
// thirdPartyGroupVersions are API versions which are dynamically // thirdPartyGroupVersions are API versions which are dynamically
// registered (and unregistered) via API calls to the apiserver // registered (and unregistered) via API calls to the apiserver
@ -42,75 +47,99 @@ var (
// enabledVersions represents all enabled API versions. It should be a // enabledVersions represents all enabled API versions. It should be a
// subset of registeredVersions. Please call EnableVersions() to add // subset of registeredVersions. Please call EnableVersions() to add
// enabled versions. // enabled versions.
enabledVersions = map[unversioned.GroupVersion]struct{}{} enabledVersions map[unversioned.GroupVersion]struct{}
// map of group meta for all groups. // map of group meta for all groups.
groupMetaMap = map[string]*apimachinery.GroupMeta{} groupMetaMap map[string]*apimachinery.GroupMeta
// envRequestedVersions represents the versions requested via the // envRequestedVersions represents the versions requested via the
// KUBE_API_VERSIONS environment variable. The install package of each group // KUBE_API_VERSIONS environment variable. The install package of each group
// checks this list before add their versions to the latest package and // checks this list before add their versions to the latest package and
// Scheme. This list is small and order matters, so represent as a slice // Scheme. This list is small and order matters, so represent as a slice
envRequestedVersions = []unversioned.GroupVersion{} envRequestedVersions []unversioned.GroupVersion
)
func init() {
loadKubeAPIVersions()
} }
func loadKubeAPIVersions() { // NewAPIRegistrationManager constructs a new manager. The argument ought to be
// Env var KUBE_API_VERSIONS is a comma separated list of API versions that // the value of the KUBE_API_VERSIONS env var, or a value of this which you
// should be registered in the scheme. // wish to test.
kubeAPIVersions := os.Getenv("KUBE_API_VERSIONS") func NewAPIRegistrationManager(kubeAPIVersions string) (*APIRegistrationManager, error) {
m := &APIRegistrationManager{
registeredVersions: map[unversioned.GroupVersion]struct{}{},
thirdPartyGroupVersions: []unversioned.GroupVersion{},
enabledVersions: map[unversioned.GroupVersion]struct{}{},
groupMetaMap: map[string]*apimachinery.GroupMeta{},
envRequestedVersions: []unversioned.GroupVersion{},
}
if len(kubeAPIVersions) != 0 { if len(kubeAPIVersions) != 0 {
for _, version := range strings.Split(kubeAPIVersions, ",") { for _, version := range strings.Split(kubeAPIVersions, ",") {
gv, err := unversioned.ParseGroupVersion(version) gv, err := unversioned.ParseGroupVersion(version)
if err != nil { if err != nil {
glog.Fatalf("invalid api version: %s in KUBE_API_VERSIONS: %s.", return nil, fmt.Errorf("invalid api version: %s in KUBE_API_VERSIONS: %s.",
version, os.Getenv("KUBE_API_VERSIONS")) version, kubeAPIVersions)
} }
envRequestedVersions = append(envRequestedVersions, gv) m.envRequestedVersions = append(m.envRequestedVersions, gv)
} }
} }
return m, nil
} }
// Resets everything to clean room for the start of a test func NewOrDie(kubeAPIVersions string) *APIRegistrationManager {
func clearForTesting() { m, err := NewAPIRegistrationManager(kubeAPIVersions)
registeredVersions = map[unversioned.GroupVersion]struct{}{} if err != nil {
thirdPartyGroupVersions = []unversioned.GroupVersion{} glog.Fatalf("Could not construct version manager: %v (KUBE_API_VERSIONS=%q)", err, kubeAPIVersions)
enabledVersions = map[unversioned.GroupVersion]struct{}{} }
groupMetaMap = map[string]*apimachinery.GroupMeta{} return m
envRequestedVersions = []unversioned.GroupVersion{}
loadKubeAPIVersions()
} }
// People are calling global functions. Let them continue to do that (for now).
var (
ValidateEnvRequestedVersions = DefaultAPIRegistrationManager.ValidateEnvRequestedVersions
AllPreferredGroupVersions = DefaultAPIRegistrationManager.AllPreferredGroupVersions
RESTMapper = DefaultAPIRegistrationManager.RESTMapper
GroupOrDie = DefaultAPIRegistrationManager.GroupOrDie
AddThirdPartyAPIGroupVersions = DefaultAPIRegistrationManager.AddThirdPartyAPIGroupVersions
IsThirdPartyAPIGroupVersion = DefaultAPIRegistrationManager.IsThirdPartyAPIGroupVersion
RegisteredGroupVersions = DefaultAPIRegistrationManager.RegisteredGroupVersions
IsRegisteredVersion = DefaultAPIRegistrationManager.IsRegisteredVersion
IsRegistered = DefaultAPIRegistrationManager.IsRegistered
Group = DefaultAPIRegistrationManager.Group
EnabledVersionsForGroup = DefaultAPIRegistrationManager.EnabledVersionsForGroup
EnabledVersions = DefaultAPIRegistrationManager.EnabledVersions
IsEnabledVersion = DefaultAPIRegistrationManager.IsEnabledVersion
IsAllowedVersion = DefaultAPIRegistrationManager.IsAllowedVersion
EnableVersions = DefaultAPIRegistrationManager.EnableVersions
RegisterGroup = DefaultAPIRegistrationManager.RegisterGroup
RegisterVersions = DefaultAPIRegistrationManager.RegisterVersions
)
// RegisterVersions adds the given group versions to the list of registered group versions. // RegisterVersions adds the given group versions to the list of registered group versions.
func RegisterVersions(availableVersions []unversioned.GroupVersion) { func (m *APIRegistrationManager) RegisterVersions(availableVersions []unversioned.GroupVersion) {
for _, v := range availableVersions { for _, v := range availableVersions {
registeredVersions[v] = struct{}{} m.registeredVersions[v] = struct{}{}
} }
} }
// RegisterGroup adds the given group to the list of registered groups. // RegisterGroup adds the given group to the list of registered groups.
func RegisterGroup(groupMeta apimachinery.GroupMeta) error { func (m *APIRegistrationManager) RegisterGroup(groupMeta apimachinery.GroupMeta) error {
groupName := groupMeta.GroupVersion.Group groupName := groupMeta.GroupVersion.Group
if _, found := groupMetaMap[groupName]; found { if _, found := m.groupMetaMap[groupName]; found {
return fmt.Errorf("group %v is already registered", groupMetaMap) return fmt.Errorf("group %v is already registered", m.groupMetaMap)
} }
groupMetaMap[groupName] = &groupMeta m.groupMetaMap[groupName] = &groupMeta
return nil return nil
} }
// EnableVersions adds the versions for the given group to the list of enabled versions. // EnableVersions adds the versions for the given group to the list of enabled versions.
// Note that the caller should call RegisterGroup before calling this method. // Note that the caller should call RegisterGroup before calling this method.
// The caller of this function is responsible to add the versions to scheme and RESTMapper. // The caller of this function is responsible to add the versions to scheme and RESTMapper.
func EnableVersions(versions ...unversioned.GroupVersion) error { func (m *APIRegistrationManager) EnableVersions(versions ...unversioned.GroupVersion) error {
var unregisteredVersions []unversioned.GroupVersion var unregisteredVersions []unversioned.GroupVersion
for _, v := range versions { for _, v := range versions {
if _, found := registeredVersions[v]; !found { if _, found := m.registeredVersions[v]; !found {
unregisteredVersions = append(unregisteredVersions, v) unregisteredVersions = append(unregisteredVersions, v)
} }
enabledVersions[v] = struct{}{} m.enabledVersions[v] = struct{}{}
} }
if len(unregisteredVersions) != 0 { if len(unregisteredVersions) != 0 {
return fmt.Errorf("Please register versions before enabling them: %v", unregisteredVersions) return fmt.Errorf("Please register versions before enabling them: %v", unregisteredVersions)
@ -121,11 +150,11 @@ func EnableVersions(versions ...unversioned.GroupVersion) error {
// IsAllowedVersion returns if the version is allowed by the KUBE_API_VERSIONS // IsAllowedVersion returns if the version is allowed by the KUBE_API_VERSIONS
// environment variable. If the environment variable is empty, then it always // environment variable. If the environment variable is empty, then it always
// returns true. // returns true.
func IsAllowedVersion(v unversioned.GroupVersion) bool { func (m *APIRegistrationManager) IsAllowedVersion(v unversioned.GroupVersion) bool {
if len(envRequestedVersions) == 0 { if len(m.envRequestedVersions) == 0 {
return true return true
} }
for _, envGV := range envRequestedVersions { for _, envGV := range m.envRequestedVersions {
if v == envGV { if v == envGV {
return true return true
} }
@ -134,24 +163,24 @@ func IsAllowedVersion(v unversioned.GroupVersion) bool {
} }
// IsEnabledVersion returns if a version is enabled. // IsEnabledVersion returns if a version is enabled.
func IsEnabledVersion(v unversioned.GroupVersion) bool { func (m *APIRegistrationManager) IsEnabledVersion(v unversioned.GroupVersion) bool {
_, found := enabledVersions[v] _, found := m.enabledVersions[v]
return found return found
} }
// EnabledVersions returns all enabled versions. Groups are randomly ordered, but versions within groups // EnabledVersions returns all enabled versions. Groups are randomly ordered, but versions within groups
// are priority order from best to worst // are priority order from best to worst
func EnabledVersions() []unversioned.GroupVersion { func (m *APIRegistrationManager) EnabledVersions() []unversioned.GroupVersion {
ret := []unversioned.GroupVersion{} ret := []unversioned.GroupVersion{}
for _, groupMeta := range groupMetaMap { for _, groupMeta := range m.groupMetaMap {
ret = append(ret, groupMeta.GroupVersions...) ret = append(ret, groupMeta.GroupVersions...)
} }
return ret return ret
} }
// EnabledVersionsForGroup returns all enabled versions for a group in order of best to worst // EnabledVersionsForGroup returns all enabled versions for a group in order of best to worst
func EnabledVersionsForGroup(group string) []unversioned.GroupVersion { func (m *APIRegistrationManager) EnabledVersionsForGroup(group string) []unversioned.GroupVersion {
groupMeta, ok := groupMetaMap[group] groupMeta, ok := m.groupMetaMap[group]
if !ok { if !ok {
return []unversioned.GroupVersion{} return []unversioned.GroupVersion{}
} }
@ -159,10 +188,10 @@ func EnabledVersionsForGroup(group string) []unversioned.GroupVersion {
return append([]unversioned.GroupVersion{}, groupMeta.GroupVersions...) return append([]unversioned.GroupVersion{}, groupMeta.GroupVersions...)
} }
// Group returns the metadata of a group if the gruop is registered, otherwise // Group returns the metadata of a group if the group is registered, otherwise
// an erorr is returned. // an error is returned.
func Group(group string) (*apimachinery.GroupMeta, error) { func (m *APIRegistrationManager) Group(group string) (*apimachinery.GroupMeta, error) {
groupMeta, found := groupMetaMap[group] groupMeta, found := m.groupMetaMap[group]
if !found { if !found {
return nil, fmt.Errorf("group %v has not been registered", group) return nil, fmt.Errorf("group %v has not been registered", group)
} }
@ -171,30 +200,30 @@ func Group(group string) (*apimachinery.GroupMeta, error) {
} }
// IsRegistered takes a string and determines if it's one of the registered groups // IsRegistered takes a string and determines if it's one of the registered groups
func IsRegistered(group string) bool { func (m *APIRegistrationManager) IsRegistered(group string) bool {
_, found := groupMetaMap[group] _, found := m.groupMetaMap[group]
return found return found
} }
// IsRegisteredVersion returns if a version is registered. // IsRegisteredVersion returns if a version is registered.
func IsRegisteredVersion(v unversioned.GroupVersion) bool { func (m *APIRegistrationManager) IsRegisteredVersion(v unversioned.GroupVersion) bool {
_, found := registeredVersions[v] _, found := m.registeredVersions[v]
return found return found
} }
// RegisteredGroupVersions returns all registered group versions. // RegisteredGroupVersions returns all registered group versions.
func RegisteredGroupVersions() []unversioned.GroupVersion { func (m *APIRegistrationManager) RegisteredGroupVersions() []unversioned.GroupVersion {
ret := []unversioned.GroupVersion{} ret := []unversioned.GroupVersion{}
for groupVersion := range registeredVersions { for groupVersion := range m.registeredVersions {
ret = append(ret, groupVersion) ret = append(ret, groupVersion)
} }
return ret return ret
} }
// IsThirdPartyAPIGroupVersion returns true if the api version is a user-registered group/version. // IsThirdPartyAPIGroupVersion returns true if the api version is a user-registered group/version.
func IsThirdPartyAPIGroupVersion(gv unversioned.GroupVersion) bool { func (m *APIRegistrationManager) IsThirdPartyAPIGroupVersion(gv unversioned.GroupVersion) bool {
for ix := range thirdPartyGroupVersions { for ix := range m.thirdPartyGroupVersions {
if thirdPartyGroupVersions[ix] == gv { if m.thirdPartyGroupVersions[ix] == gv {
return true return true
} }
} }
@ -205,11 +234,11 @@ func IsThirdPartyAPIGroupVersion(gv unversioned.GroupVersion) bool {
// registers them in the API machinery and enables them. // registers them in the API machinery and enables them.
// Skips GroupVersions that are already registered. // Skips GroupVersions that are already registered.
// Returns the list of GroupVersions that were skipped. // Returns the list of GroupVersions that were skipped.
func AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversioned.GroupVersion { func (m *APIRegistrationManager) AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversioned.GroupVersion {
filteredGVs := []unversioned.GroupVersion{} filteredGVs := []unversioned.GroupVersion{}
skippedGVs := []unversioned.GroupVersion{} skippedGVs := []unversioned.GroupVersion{}
for ix := range gvs { for ix := range gvs {
if !IsRegisteredVersion(gvs[ix]) { if !m.IsRegisteredVersion(gvs[ix]) {
filteredGVs = append(filteredGVs, gvs[ix]) filteredGVs = append(filteredGVs, gvs[ix])
} else { } else {
glog.V(3).Infof("Skipping %s, because its already registered", gvs[ix].String()) glog.V(3).Infof("Skipping %s, because its already registered", gvs[ix].String())
@ -219,17 +248,18 @@ func AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversione
if len(filteredGVs) == 0 { if len(filteredGVs) == 0 {
return skippedGVs return skippedGVs
} }
RegisterVersions(filteredGVs) m.RegisterVersions(filteredGVs)
EnableVersions(filteredGVs...) m.EnableVersions(filteredGVs...)
thirdPartyGroupVersions = append(thirdPartyGroupVersions, filteredGVs...) m.thirdPartyGroupVersions = append(m.thirdPartyGroupVersions, filteredGVs...)
return skippedGVs return skippedGVs
} }
// TODO: This is an expedient function, because we don't check if a Group is // TODO: This is an expedient function, because we don't check if a Group is
// supported throughout the code base. We will abandon this function and // supported throughout the code base. We will abandon this function and
// checking the error returned by the Group() function. // checking the error returned by the Group() function.
func GroupOrDie(group string) *apimachinery.GroupMeta { func (m *APIRegistrationManager) GroupOrDie(group string) *apimachinery.GroupMeta {
groupMeta, found := groupMetaMap[group] groupMeta, found := m.groupMetaMap[group]
if !found { if !found {
if group == "" { if group == "" {
panic("The legacy v1 API is not registered.") panic("The legacy v1 API is not registered.")
@ -246,13 +276,13 @@ func GroupOrDie(group string) *apimachinery.GroupMeta {
// 1. legacy kube group preferred version, extensions preferred version, metrics perferred version, legacy // 1. legacy kube group preferred version, extensions preferred version, metrics perferred version, legacy
// kube any version, extensions any version, metrics any version, all other groups alphabetical preferred version, // kube any version, extensions any version, metrics any version, all other groups alphabetical preferred version,
// all other groups alphabetical. // all other groups alphabetical.
func RESTMapper(versionPatterns ...unversioned.GroupVersion) meta.RESTMapper { func (m *APIRegistrationManager) RESTMapper(versionPatterns ...unversioned.GroupVersion) meta.RESTMapper {
unionMapper := meta.MultiRESTMapper{} unionMapper := meta.MultiRESTMapper{}
unionedGroups := sets.NewString() unionedGroups := sets.NewString()
for enabledVersion := range enabledVersions { for enabledVersion := range m.enabledVersions {
if !unionedGroups.Has(enabledVersion.Group) { if !unionedGroups.Has(enabledVersion.Group) {
unionedGroups.Insert(enabledVersion.Group) unionedGroups.Insert(enabledVersion.Group)
groupMeta := groupMetaMap[enabledVersion.Group] groupMeta := m.groupMetaMap[enabledVersion.Group]
unionMapper = append(unionMapper, groupMeta.RESTMapper) unionMapper = append(unionMapper, groupMeta.RESTMapper)
} }
} }
@ -268,11 +298,11 @@ func RESTMapper(versionPatterns ...unversioned.GroupVersion) meta.RESTMapper {
return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority}
} }
if len(envRequestedVersions) != 0 { if len(m.envRequestedVersions) != 0 {
resourcePriority := []unversioned.GroupVersionResource{} resourcePriority := []unversioned.GroupVersionResource{}
kindPriority := []unversioned.GroupVersionKind{} kindPriority := []unversioned.GroupVersionKind{}
for _, versionPriority := range envRequestedVersions { for _, versionPriority := range m.envRequestedVersions {
resourcePriority = append(resourcePriority, versionPriority.WithResource(meta.AnyResource)) resourcePriority = append(resourcePriority, versionPriority.WithResource(meta.AnyResource))
kindPriority = append(kindPriority, versionPriority.WithKind(meta.AnyKind)) kindPriority = append(kindPriority, versionPriority.WithKind(meta.AnyKind))
} }
@ -281,17 +311,17 @@ func RESTMapper(versionPatterns ...unversioned.GroupVersion) meta.RESTMapper {
} }
prioritizedGroups := []string{"", "extensions", "metrics"} prioritizedGroups := []string{"", "extensions", "metrics"}
resourcePriority, kindPriority := prioritiesForGroups(prioritizedGroups...) resourcePriority, kindPriority := m.prioritiesForGroups(prioritizedGroups...)
prioritizedGroupsSet := sets.NewString(prioritizedGroups...) prioritizedGroupsSet := sets.NewString(prioritizedGroups...)
remainingGroups := sets.String{} remainingGroups := sets.String{}
for enabledVersion := range enabledVersions { for enabledVersion := range m.enabledVersions {
if !prioritizedGroupsSet.Has(enabledVersion.Group) { if !prioritizedGroupsSet.Has(enabledVersion.Group) {
remainingGroups.Insert(enabledVersion.Group) remainingGroups.Insert(enabledVersion.Group)
} }
} }
remainingResourcePriority, remainingKindPriority := prioritiesForGroups(remainingGroups.List()...) remainingResourcePriority, remainingKindPriority := m.prioritiesForGroups(remainingGroups.List()...)
resourcePriority = append(resourcePriority, remainingResourcePriority...) resourcePriority = append(resourcePriority, remainingResourcePriority...)
kindPriority = append(kindPriority, remainingKindPriority...) kindPriority = append(kindPriority, remainingKindPriority...)
@ -300,12 +330,12 @@ func RESTMapper(versionPatterns ...unversioned.GroupVersion) meta.RESTMapper {
// prioritiesForGroups returns the resource and kind priorities for a PriorityRESTMapper, preferring the preferred version of each group first, // prioritiesForGroups returns the resource and kind priorities for a PriorityRESTMapper, preferring the preferred version of each group first,
// then any non-preferred version of the group second. // then any non-preferred version of the group second.
func prioritiesForGroups(groups ...string) ([]unversioned.GroupVersionResource, []unversioned.GroupVersionKind) { func (m *APIRegistrationManager) prioritiesForGroups(groups ...string) ([]unversioned.GroupVersionResource, []unversioned.GroupVersionKind) {
resourcePriority := []unversioned.GroupVersionResource{} resourcePriority := []unversioned.GroupVersionResource{}
kindPriority := []unversioned.GroupVersionKind{} kindPriority := []unversioned.GroupVersionKind{}
for _, group := range groups { for _, group := range groups {
availableVersions := EnabledVersionsForGroup(group) availableVersions := m.EnabledVersionsForGroup(group)
if len(availableVersions) > 0 { if len(availableVersions) > 0 {
resourcePriority = append(resourcePriority, availableVersions[0].WithResource(meta.AnyResource)) resourcePriority = append(resourcePriority, availableVersions[0].WithResource(meta.AnyResource))
kindPriority = append(kindPriority, availableVersions[0].WithKind(meta.AnyKind)) kindPriority = append(kindPriority, availableVersions[0].WithKind(meta.AnyKind))
@ -321,12 +351,12 @@ func prioritiesForGroups(groups ...string) ([]unversioned.GroupVersionResource,
// AllPreferredGroupVersions returns the preferred versions of all registered // AllPreferredGroupVersions returns the preferred versions of all registered
// groups in the form of "group1/version1,group2/version2,..." // groups in the form of "group1/version1,group2/version2,..."
func AllPreferredGroupVersions() string { func (m *APIRegistrationManager) AllPreferredGroupVersions() string {
if len(groupMetaMap) == 0 { if len(m.groupMetaMap) == 0 {
return "" return ""
} }
var defaults []string var defaults []string
for _, groupMeta := range groupMetaMap { for _, groupMeta := range m.groupMetaMap {
defaults = append(defaults, groupMeta.GroupVersion.String()) defaults = append(defaults, groupMeta.GroupVersion.String())
} }
sort.Strings(defaults) sort.Strings(defaults)
@ -335,21 +365,12 @@ func AllPreferredGroupVersions() string {
// ValidateEnvRequestedVersions returns a list of versions that are requested in // ValidateEnvRequestedVersions returns a list of versions that are requested in
// the KUBE_API_VERSIONS environment variable, but not enabled. // the KUBE_API_VERSIONS environment variable, but not enabled.
func ValidateEnvRequestedVersions() []unversioned.GroupVersion { func (m *APIRegistrationManager) ValidateEnvRequestedVersions() []unversioned.GroupVersion {
var missingVersions []unversioned.GroupVersion var missingVersions []unversioned.GroupVersion
for _, v := range envRequestedVersions { for _, v := range m.envRequestedVersions {
if _, found := enabledVersions[v]; !found { if _, found := m.enabledVersions[v]; !found {
missingVersions = append(missingVersions, v) missingVersions = append(missingVersions, v)
} }
} }
return missingVersions return missingVersions
} }
// Resets the state.
// Should not be used by anyone else than tests.
func reset() {
registeredVersions = map[unversioned.GroupVersion]struct{}{}
enabledVersions = map[unversioned.GroupVersion]struct{}{}
groupMetaMap = map[string]*apimachinery.GroupMeta{}
}

View File

@ -24,7 +24,10 @@ import (
) )
func TestAddThirdPartyVersionsBasic(t *testing.T) { func TestAddThirdPartyVersionsBasic(t *testing.T) {
clearForTesting() m, err := NewAPIRegistrationManager("")
if err != nil {
t.Fatalf("Unexpected failure to make a manager: %v", err)
}
registered := []unversioned.GroupVersion{ registered := []unversioned.GroupVersion{
{ {
@ -45,8 +48,8 @@ func TestAddThirdPartyVersionsBasic(t *testing.T) {
} }
gvs := append(registered, thirdParty...) gvs := append(registered, thirdParty...)
RegisterVersions(registered) m.RegisterVersions(registered)
wasSkipped := AddThirdPartyAPIGroupVersions(gvs...) wasSkipped := m.AddThirdPartyAPIGroupVersions(gvs...)
if len(wasSkipped) != len(skipped) { if len(wasSkipped) != len(skipped) {
t.Errorf("Expected %v, found %v", skipped, wasSkipped) t.Errorf("Expected %v, found %v", skipped, wasSkipped)
} }
@ -63,15 +66,13 @@ func TestAddThirdPartyVersionsBasic(t *testing.T) {
} }
} }
for _, gv := range thirdParty { for _, gv := range thirdParty {
if !IsThirdPartyAPIGroupVersion(gv) { if !m.IsThirdPartyAPIGroupVersion(gv) {
t.Errorf("Expected %v to be third party.", gv) t.Errorf("Expected %v to be third party.", gv)
} }
} }
} }
func TestAddThirdPartyVersionsMultiple(t *testing.T) { func TestAddThirdPartyVersionsMultiple(t *testing.T) {
clearForTesting()
thirdParty := []unversioned.GroupVersion{ thirdParty := []unversioned.GroupVersion{
{ {
Group: "company.com", Group: "company.com",
@ -82,14 +83,18 @@ func TestAddThirdPartyVersionsMultiple(t *testing.T) {
Version: "v2", Version: "v2",
}, },
} }
m, err := NewAPIRegistrationManager("")
if err != nil {
t.Fatalf("Unexpected failure to make a manager: %v", err)
}
for _, gv := range thirdParty { for _, gv := range thirdParty {
wasSkipped := AddThirdPartyAPIGroupVersions(gv) wasSkipped := m.AddThirdPartyAPIGroupVersions(gv)
if len(wasSkipped) != 0 { if len(wasSkipped) != 0 {
t.Errorf("Expected length 0, found %v", wasSkipped) t.Errorf("Expected length 0, found %v", wasSkipped)
} }
} }
for _, gv := range thirdParty { for _, gv := range thirdParty {
if !IsThirdPartyAPIGroupVersion(gv) { if !m.IsThirdPartyAPIGroupVersion(gv) {
t.Errorf("Expected %v to be third party.", gv) t.Errorf("Expected %v to be third party.", gv)
} }
} }
@ -128,13 +133,16 @@ func TestAllPreferredGroupVersions(t *testing.T) {
}, },
} }
for _, testCase := range testCases { for _, testCase := range testCases {
for _, groupMeta := range testCase.groupMetas { m, err := NewAPIRegistrationManager("")
RegisterGroup(groupMeta) if err != nil {
t.Fatalf("Unexpected failure to make a manager: %v", err)
} }
output := AllPreferredGroupVersions() for _, groupMeta := range testCase.groupMetas {
m.RegisterGroup(groupMeta)
}
output := m.AllPreferredGroupVersions()
if testCase.expect != output { if testCase.expect != output {
t.Errorf("Error. expect: %s, got: %s", testCase.expect, output) t.Errorf("Error. expect: %s, got: %s", testCase.expect, output)
} }
reset()
} }
} }