diff options
Diffstat (limited to 'plugin/geoip/geoip_test.go')
-rw-r--r-- | plugin/geoip/geoip_test.go | 102 |
1 files changed, 67 insertions, 35 deletions
diff --git a/plugin/geoip/geoip_test.go b/plugin/geoip/geoip_test.go index 99213138b..eb5c04c2a 100644 --- a/plugin/geoip/geoip_test.go +++ b/plugin/geoip/geoip_test.go @@ -3,59 +3,91 @@ package geoip import ( "context" "fmt" + "net" "testing" "github.com/coredns/coredns/plugin/metadata" "github.com/coredns/coredns/plugin/test" "github.com/coredns/coredns/request" + + "github.com/miekg/dns" ) func TestMetadata(t *testing.T) { tests := []struct { - dbPath string label string expectedValue string }{ - {cityDBPath, "geoip/city/name", "Cambridge"}, + {"geoip/city/name", "Cambridge"}, - {cityDBPath, "geoip/country/code", "GB"}, - {cityDBPath, "geoip/country/name", "United Kingdom"}, + {"geoip/country/code", "GB"}, + {"geoip/country/name", "United Kingdom"}, // is_in_european_union is set to true only to work around bool zero value, and test is really being set. - {cityDBPath, "geoip/country/is_in_european_union", "true"}, + {"geoip/country/is_in_european_union", "true"}, + + {"geoip/continent/code", "EU"}, + {"geoip/continent/name", "Europe"}, + + {"geoip/latitude", "52.2242"}, + {"geoip/longitude", "0.1315"}, + {"geoip/timezone", "Europe/London"}, + {"geoip/postalcode", "CB4"}, + } + + knownIPAddr := "81.2.69.142" // This IP should be be part of the CDIR address range used to create the database fixtures. + for _, tc := range tests { - {cityDBPath, "geoip/continent/code", "EU"}, - {cityDBPath, "geoip/continent/name", "Europe"}, + t.Run(fmt.Sprintf("%s/%s", tc.label, "direct"), func(t *testing.T) { + geoIP, err := newGeoIP(cityDBPath, false) + if err != nil { + t.Fatalf("unable to create geoIP plugin: %v", err) + } + state := request.Request{ + Req: new(dns.Msg), + W: &test.ResponseWriter{RemoteIP: knownIPAddr}, + } + testMetadata(t, state, geoIP, tc.label, tc.expectedValue) + }) - {cityDBPath, "geoip/latitude", "52.2242"}, - {cityDBPath, "geoip/longitude", "0.1315"}, - {cityDBPath, "geoip/timezone", "Europe/London"}, - {cityDBPath, "geoip/postalcode", "CB4"}, + t.Run(fmt.Sprintf("%s/%s", tc.label, "subnet"), func(t *testing.T) { + geoIP, err := newGeoIP(cityDBPath, true) + if err != nil { + t.Fatalf("unable to create geoIP plugin: %v", err) + } + state := request.Request{ + Req: new(dns.Msg), + W: &test.ResponseWriter{RemoteIP: "127.0.0.1"}, + } + state.Req.SetEdns0(4096, false) + if o := state.Req.IsEdns0(); o != nil { + addr := net.ParseIP(knownIPAddr) + o.Option = append(o.Option, (&dns.EDNS0_SUBNET{ + SourceNetmask: 32, + Address: addr, + })) + } + testMetadata(t, state, geoIP, tc.label, tc.expectedValue) + }) + } +} + +func testMetadata(t *testing.T, state request.Request, geoIP *GeoIP, label, expectedValue string) { + ctx := metadata.ContextWithMetadata(context.Background()) + rCtx := geoIP.Metadata(ctx, state) + if fmt.Sprintf("%p", ctx) != fmt.Sprintf("%p", rCtx) { + t.Errorf("returned context is expected to be the same one passed in the Metadata function") } - for i, _test := range tests { - geoIP, err := newGeoIP(_test.dbPath) - if err != nil { - t.Fatalf("Test %d: unable to create geoIP plugin: %v", i, err) - } - state := request.Request{ - W: &test.ResponseWriter{RemoteIP: "81.2.69.142"}, // This IP should be be part of the CDIR address range used to create the database fixtures. - } - ctx := metadata.ContextWithMetadata(context.Background()) - rCtx := geoIP.Metadata(ctx, state) - if fmt.Sprintf("%p", ctx) != fmt.Sprintf("%p", rCtx) { - t.Errorf("Test %d: returned context is expected to be the same one passed in the Metadata function", i) - } - - fn := metadata.ValueFunc(ctx, _test.label) - if fn == nil { - t.Errorf("Test %d: label %q not set in metadata plugin context", i, _test.label) - continue - } - value := fn() - if value != _test.expectedValue { - t.Errorf("Test %d: expected value for label %q should be %q, got %q instead", - i, _test.label, _test.expectedValue, value) - } + fn := metadata.ValueFunc(ctx, label) + if fn == nil { + t.Errorf("label %q not set in metadata plugin context", label) + return } + value := fn() + if value != expectedValue { + t.Errorf("expected value for label %q should be %q, got %q instead", + label, expectedValue, value) + } + } |