123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package targeting
- import (
- "net"
- "reflect"
- "testing"
- "github.com/abh/geodns/targeting/geoip2"
- )
- func TestTargetString(t *testing.T) {
- tgt := TargetOptions(TargetGlobal + TargetCountry + TargetContinent)
- str := tgt.String()
- if str != "@ continent country" {
- t.Logf("wrong target string '%s'", str)
- t.Fail()
- }
- }
- func TestTargetParse(t *testing.T) {
- tgt, err := ParseTargets("@ foo country")
- str := tgt.String()
- if str != "@ country" {
- t.Logf("Expected '@ country', got '%s'", str)
- t.Fail()
- }
- if err.Error() != "Unknown targeting option 'foo'" {
- t.Log("Failed erroring on an unknown targeting option")
- t.Fail()
- }
- tests := [][]string{
- {"@ continent country asn", "@ continent country asn"},
- {"asn country", "country asn"},
- {"continent @ country", "@ continent country"},
- }
- for _, strs := range tests {
- tgt, err = ParseTargets(strs[0])
- if err != nil {
- t.Fatalf("Parsing '%s': %s", strs[0], err)
- }
- if tgt.String() != strs[1] {
- t.Logf("Unexpected result parsing '%s', got '%s', expected '%s'",
- strs[0], tgt.String(), strs[1])
- t.Fail()
- }
- }
- }
- func TestGetTargets(t *testing.T) {
- ip := net.ParseIP("93.184.216.34")
- g, err := geoip2.New(geoip2.FindDB())
- if err != nil {
- t.Fatalf("opening geoip2: %s", err)
- }
- Setup(g)
- tgt, _ := ParseTargets("@ continent country")
- targets, _, _ := tgt.GetTargets(ip, false)
- expect := []string{"us", "north-america", "@"}
- if !reflect.DeepEqual(targets, expect) {
- t.Fatalf("Unexpected parse results of targets, got '%s', expected '%s'", targets, expect)
- }
- if ok, err := g.HasLocation(); !ok {
- t.Logf("City GeoIP database required for these tests: %s", err)
- return
- }
- type test struct {
- Str string
- Targets []string
- IP string
- }
- tests := []test{
- {
- "@ continent country region ",
- []string{"us-ma", "us", "north-america", "@"},
- "",
- },
- {
- "@ continent regiongroup country region ",
- []string{"us-ma", "us-east", "us", "north-america", "@"},
- "",
- },
- {
- "ip",
- []string{"[2607:f238:2::ff:4]", "[2607:f238:2::]"},
- "2607:f238:2:0::ff:4",
- },
- {
- // GeoLite2 doesn't have cities/regions for IPv6 addresses?
- "country",
- []string{"us"},
- "2606:2800:220:1:248:1893:25c8:1946",
- },
- }
- if ok, _ := g.HasASN(); ok {
- tests = append(tests,
- test{
- "@ continent regiongroup country region asn ip",
- []string{"[98.248.0.1]", "[98.248.0.0]", "as7922", "us-ca", "us-west", "us", "north-america", "@"},
- "98.248.0.1",
- },
- test{
- "country asn",
- []string{"as8674", "se"},
- "2a01:3f0:1:3::1",
- },
- )
- }
- for _, test := range tests {
- if len(test.IP) > 0 {
- ip = net.ParseIP(test.IP)
- }
- tgt, _ = ParseTargets(test.Str)
- targets, _, _ = tgt.GetTargets(ip, false)
- t.Logf("testing %s, got %q", ip, targets)
- if !reflect.DeepEqual(targets, test.Targets) {
- t.Logf("For IP '%s' targets '%s' expected '%s', got '%s'", ip, test.Str, test.Targets, targets)
- t.Fail()
- }
- }
- }
|