* 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>
79 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|