211 lines
5.3 KiB
Go
211 lines
5.3 KiB
Go
|
// Licensed to Elasticsearch B.V. under one or more contributor
|
||
|
// license agreements. See the NOTICE file distributed with
|
||
|
// this work for additional information regarding copyright
|
||
|
// ownership. Elasticsearch B.V. licenses this file to you 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 feature
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
var defaultDetails = &Details{stability: Stable}
|
||
|
|
||
|
func TestRegister(t *testing.T) {
|
||
|
f := func() {}
|
||
|
|
||
|
t.Run("when the factory is nil", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
err := r.Register(New("outputs", "null", nil, defaultDetails))
|
||
|
if !assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
})
|
||
|
|
||
|
t.Run("namespace and feature doesn't exist", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
err := r.Register(New("outputs", "null", f, defaultDetails))
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("namespace exists and feature doesn't exist", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "bar", f, defaultDetails))
|
||
|
err := r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, 2, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("namespace exists and feature exists and not the same factory", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", func() {}, defaultDetails))
|
||
|
err := r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
if !assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("when the exact feature is already registered", func(t *testing.T) {
|
||
|
feature := New("processor", "foo", f, defaultDetails)
|
||
|
r := NewRegistry()
|
||
|
r.Register(feature)
|
||
|
err := r.Register(feature)
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestFeature(t *testing.T) {
|
||
|
f := func() {}
|
||
|
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
r.Register(New("HOLA", "fOO", f, defaultDetails))
|
||
|
|
||
|
t.Run("when namespace and feature are present", func(t *testing.T) {
|
||
|
feature, err := r.Lookup("processor", "foo")
|
||
|
if !assert.NotNil(t, feature.Factory()) {
|
||
|
return
|
||
|
}
|
||
|
assert.NoError(t, err)
|
||
|
})
|
||
|
|
||
|
t.Run("when namespace doesn't exist", func(t *testing.T) {
|
||
|
_, err := r.Lookup("hello", "foo")
|
||
|
if !assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
})
|
||
|
|
||
|
t.Run("when namespace and key are normalized", func(t *testing.T) {
|
||
|
_, err := r.Lookup("HOLA", "foo")
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestLookup(t *testing.T) {
|
||
|
f := func() {}
|
||
|
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
r.Register(New("processor", "foo2", f, defaultDetails))
|
||
|
r.Register(New("HELLO", "fOO", f, defaultDetails))
|
||
|
|
||
|
t.Run("when namespace and feature are present", func(t *testing.T) {
|
||
|
features, err := r.LookupAll("processor")
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 2, len(features))
|
||
|
})
|
||
|
|
||
|
t.Run("when namespace is not present", func(t *testing.T) {
|
||
|
_, err := r.LookupAll("foobar")
|
||
|
if !assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
})
|
||
|
|
||
|
t.Run("when namespace and name are normalized", func(t *testing.T) {
|
||
|
features, err := r.LookupAll("hello")
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, 1, len(features))
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestUnregister(t *testing.T) {
|
||
|
f := func() {}
|
||
|
|
||
|
t.Run("when the namespace and the feature exists", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
err := r.Unregister("processor", "foo")
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 0, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("when the namespace exist and the feature doesn't", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
err := r.Unregister("processor", "bar")
|
||
|
if assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 0, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("when the namespace doesn't exists", func(t *testing.T) {
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
err := r.Unregister("outputs", "bar")
|
||
|
if assert.Error(t, err) {
|
||
|
return
|
||
|
}
|
||
|
assert.Equal(t, 0, r.Size())
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestOverwrite(t *testing.T) {
|
||
|
t.Run("when the feature doesn't exist", func(t *testing.T) {
|
||
|
f := func() {}
|
||
|
r := NewRegistry()
|
||
|
assert.Equal(t, 0, r.Size())
|
||
|
r.Overwrite(New("processor", "foo", f, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
})
|
||
|
|
||
|
t.Run("overwrite when the feature exists", func(t *testing.T) {
|
||
|
f := func() {}
|
||
|
r := NewRegistry()
|
||
|
r.Register(New("processor", "foo", f, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
|
||
|
check := 42
|
||
|
r.Overwrite(New("processor", "foo", check, defaultDetails))
|
||
|
assert.Equal(t, 1, r.Size())
|
||
|
|
||
|
feature, err := r.Lookup("processor", "foo")
|
||
|
if !assert.NoError(t, err) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
v, ok := feature.Factory().(int)
|
||
|
assert.True(t, ok)
|
||
|
assert.Equal(t, 42, v)
|
||
|
})
|
||
|
}
|