coredns/plugin/metadata/metadata_test.go
Miek Gieben 2fd31cd3e0
plugin/metadata: some cleanups (#1906)
* plugin/metadata: some cleanups

Name to provider.go as that's what being defined right now in the file.
Use request.Request because that's done in variables.go anyway. Name the
main storage M, because there is no further meaning behind.

Remove superfluous methods

Signed-off-by: Miek Gieben <miek@miek.nl>

* Fix test

Signed-off-by: Miek Gieben <miek@miek.nl>
2018-06-29 15:03:25 +01:00

79 lines
2.1 KiB
Go

package metadata
import (
"context"
"testing"
"github.com/coredns/coredns/plugin/test"
"github.com/coredns/coredns/request"
"github.com/miekg/dns"
)
// testProvider implements fake Providers. Plugins which inmplement Provider interface
type testProvider map[string]interface{}
func (m testProvider) MetadataVarNames() []string {
keys := []string{}
for k := range m {
keys = append(keys, k)
}
return keys
}
func (m testProvider) Metadata(ctx context.Context, state request.Request, key string) (val interface{}, ok bool) {
value, ok := m[key]
return value, ok
}
// testHandler implements plugin.Handler.
type testHandler struct{ ctx context.Context }
func (m *testHandler) Name() string { return "testHandler" }
func (m *testHandler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
m.ctx = ctx
return 0, nil
}
func TestMetadataServeDNS(t *testing.T) {
expectedMetadata := []testProvider{
testProvider{"testkey1": "testvalue1"},
testProvider{"testkey2": 2, "testkey3": "testvalue3"},
}
// Create fake Providers based on expectedMetadata
providers := []Provider{}
for _, e := range expectedMetadata {
providers = append(providers, e)
}
next := &testHandler{} // fake handler which stores the resulting context
metadata := Metadata{
Zones: []string{"."},
Providers: providers,
Next: next,
}
metadata.ServeDNS(context.TODO(), &test.ResponseWriter{}, new(dns.Msg))
// Verify that next plugin can find metadata in context from all Providers
for _, expected := range expectedMetadata {
md, ok := FromContext(next.ctx)
if !ok {
t.Fatalf("Metadata is expected but not present inside the context")
}
for expKey, expVal := range expected {
metadataVal, valOk := md.Value(expKey)
if !valOk {
t.Fatalf("Value by key %v can't be retrieved", expKey)
}
if metadataVal != expVal {
t.Errorf("Expected value %v, but got %v", expVal, metadataVal)
}
}
wrongKey := "wrong_key"
metadataVal, ok := md.Value(wrongKey)
if ok {
t.Fatalf("Value by key %v is not expected to be recieved, but got: %v", wrongKey, metadataVal)
}
}
}