diff options
Diffstat (limited to 'plugin/metadata/metadata_test.go')
-rw-r--r-- | plugin/metadata/metadata_test.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/plugin/metadata/metadata_test.go b/plugin/metadata/metadata_test.go new file mode 100644 index 000000000..413ba874e --- /dev/null +++ b/plugin/metadata/metadata_test.go @@ -0,0 +1,79 @@ +package metadata + +import ( + "context" + "testing" + + "github.com/coredns/coredns/plugin/test" + + "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, w dns.ResponseWriter, r *dns.Msg, 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 TestMetadataServDns(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) + } + // Fake handler which stores the resulting context + next := &testHandler{} + + 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) + } + } +} |