github.com/StackExchange/DNSControl@v0.2.8/pkg/transform/transform_test.go (about)

     1  package transform
     2  
     3  import (
     4  	"net"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestIPToUint(t *testing.T) {
    10  	ip := net.ParseIP("1.2.3.4")
    11  	u, err := ipToUint(ip)
    12  	if err != nil {
    13  		t.Fatal(err)
    14  	}
    15  	if u != 16909060 {
    16  		t.Fatalf("I to uint conversion failed. Should be 16909060. Got %d", u)
    17  	}
    18  	ip2 := UintToIP(u)
    19  	if !ip.Equal(ip2) {
    20  		t.Fatalf("IPs should be equal. %s is not %s", ip2, ip)
    21  	}
    22  }
    23  
    24  func TestDecodeTransformTableFailures(t *testing.T) {
    25  	result, err := DecodeTransformTable("1.2.3.4 ~ 3.4.5.6")
    26  	if result != nil {
    27  		t.Errorf("expected nil, got (%v)\n", result)
    28  	}
    29  	if err == nil {
    30  		t.Error("expect error, got none")
    31  	}
    32  }
    33  
    34  func testIP(t *testing.T, test string, expected string, actual net.IP) {
    35  	if !net.ParseIP(expected).Equal(actual) {
    36  		t.Errorf("Test %v: expected Low (%v), got (%v)\n", test, actual, expected)
    37  	}
    38  }
    39  
    40  func Test_DecodeTransformTable_0(t *testing.T) {
    41  	result, err := DecodeTransformTable("1.2.3.4 ~ 2.3.4.5 ~ 3.4.5.6 ~ ")
    42  	if err != nil {
    43  		t.Fatal(err)
    44  	}
    45  	if len(result) != 1 {
    46  		t.Errorf("Test %v: expected col length (%v), got (%v)\n", 1, 1, len(result))
    47  	}
    48  	testIP(t, "low", "1.2.3.4", result[0].Low)
    49  	testIP(t, "high", "2.3.4.5", result[0].High)
    50  	testIP(t, "newBase", "3.4.5.6", result[0].NewBases[0])
    51  	// test_ip(t, "newIP", "", result[0].NewIPs)
    52  }
    53  
    54  func Test_DecodeTransformTable_1(t *testing.T) {
    55  	result, err := DecodeTransformTable("1.2.3.4~2.3.4.5~3.4.5.6 ~;8.7.6.5 ~ 9.8.7.6 ~ 7.6.5.4 ~ ")
    56  	if err != nil {
    57  		t.Fatal(err)
    58  	}
    59  	if len(result) != 2 {
    60  		t.Errorf("Test %v: expected col length (%v), got (%v)\n", 1, 2, len(result))
    61  	}
    62  	testIP(t, "Low[0]", "1.2.3.4", result[0].Low)
    63  	testIP(t, "High[0]", "2.3.4.5", result[0].High)
    64  	testIP(t, "NewBase[0]", "3.4.5.6", result[0].NewBases[0])
    65  	// test_ip(t, "newIP[0]", "", result[0].NewIP)
    66  	testIP(t, "Low[1]", "8.7.6.5", result[1].Low)
    67  	testIP(t, "High[1]", "9.8.7.6", result[1].High)
    68  	testIP(t, "NewBase[1]", "7.6.5.4", result[1].NewBases[0])
    69  	// test_ip(t, "newIP[1]", "", result[0].NewIP)
    70  }
    71  func Test_DecodeTransformTable_NewIP(t *testing.T) {
    72  	result, err := DecodeTransformTable("1.2.3.4 ~ 2.3.4.5 ~  ~ 3.4.5.6 ")
    73  	if err != nil {
    74  		t.Fatal(err)
    75  	}
    76  	if len(result) != 1 {
    77  		t.Errorf("Test %v: expected col length (%v), got (%v)\n", 1, 1, len(result))
    78  	}
    79  	testIP(t, "low", "1.2.3.4", result[0].Low)
    80  	testIP(t, "high", "2.3.4.5", result[0].High)
    81  	testIP(t, "newIP", "3.4.5.6", result[0].NewIPs[0])
    82  }
    83  
    84  func Test_DecodeTransformTable_order(t *testing.T) {
    85  	raw := "9.8.7.6 ~ 8.7.6.5 ~ 7.6.5.4 ~"
    86  	result, err := DecodeTransformTable(raw)
    87  	if result != nil {
    88  		t.Errorf("Invalid range not detected: (%v)\n", raw)
    89  	}
    90  	if err == nil {
    91  		t.Error("expect error, got none")
    92  	}
    93  }
    94  
    95  func Test_DecodeTransformTable_Base_and_IP(t *testing.T) {
    96  	raw := "1.1.1.1~ 8.7.6.5 ~ 7.6.5.4 ~ 4.4.4.4"
    97  	result, err := DecodeTransformTable(raw)
    98  	if result != nil {
    99  		t.Errorf("NewBase and NewIP should not both be specified: (%v)\n", raw)
   100  	}
   101  	if err == nil {
   102  		t.Error("expect error, got none")
   103  	}
   104  }
   105  
   106  func Test_TransformIP(t *testing.T) {
   107  
   108  	var transforms1 = []IpConversion{{
   109  		Low:      net.ParseIP("11.11.11.0"),
   110  		High:     net.ParseIP("11.11.11.20"),
   111  		NewBases: []net.IP{net.ParseIP("99.99.99.0")},
   112  	}, {
   113  		Low:      net.ParseIP("22.22.22.0"),
   114  		High:     net.ParseIP("22.22.22.40"),
   115  		NewBases: []net.IP{net.ParseIP("99.99.99.100")},
   116  	}, {
   117  		Low:      net.ParseIP("33.33.33.20"),
   118  		High:     net.ParseIP("33.33.35.40"),
   119  		NewBases: []net.IP{net.ParseIP("100.100.100.0")},
   120  	}, {
   121  		Low:      net.ParseIP("44.44.44.20"),
   122  		High:     net.ParseIP("44.44.44.40"),
   123  		NewBases: []net.IP{net.ParseIP("100.100.100.40")},
   124  	}, {
   125  		Low:      net.ParseIP("55.0.0.0"),
   126  		High:     net.ParseIP("55.255.0.0"),
   127  		NewBases: []net.IP{net.ParseIP("66.0.0.0"), net.ParseIP("77.0.0.0")},
   128  	}}
   129  	// NO TRANSFORMS ON 99.x.x.x PLZ
   130  
   131  	var tests = []struct {
   132  		experiment string
   133  		expected   string
   134  	}{
   135  		{"11.11.11.0", "99.99.99.0"},
   136  		{"11.11.11.1", "99.99.99.1"},
   137  		{"11.11.11.11", "99.99.99.11"},
   138  		{"11.11.11.19", "99.99.99.19"},
   139  		{"11.11.11.20", "99.99.99.20"},
   140  		{"11.11.11.21", "11.11.11.21"},
   141  		{"22.22.22.22", "99.99.99.122"},
   142  		{"22.22.22.255", "22.22.22.255"},
   143  		{"33.33.33.0", "33.33.33.0"},
   144  		{"33.33.33.19", "33.33.33.19"},
   145  		{"33.33.33.20", "100.100.100.0"},
   146  		{"33.33.33.21", "100.100.100.1"},
   147  		{"33.33.33.33", "100.100.100.13"},
   148  		{"33.33.35.39", "100.100.102.19"},
   149  		{"33.33.35.40", "100.100.102.20"},
   150  		{"33.33.35.41", "33.33.35.41"},
   151  		{"44.44.44.24", "100.100.100.44"},
   152  		{"44.44.44.44", "44.44.44.44"},
   153  		{"55.0.42.42", "66.0.42.42,77.0.42.42"},
   154  		{"99.0.0.42", "99.0.0.42"},
   155  	}
   156  
   157  	for _, test := range tests {
   158  		experiment := net.ParseIP(test.experiment)
   159  		actual, err := TransformIPToList(experiment, transforms1)
   160  		if err != nil {
   161  			t.Errorf("%v: got an err: %v\n", experiment, err)
   162  		}
   163  		list := []string{}
   164  		for _, ip := range actual {
   165  			list = append(list, ip.String())
   166  		}
   167  		act := strings.Join(list, ",")
   168  		if test.expected != act {
   169  			t.Errorf("%v: expected (%v) got (%v)\n", experiment, test.expected, act)
   170  		}
   171  	}
   172  }
   173  
   174  func Test_TransformIP_NewIP(t *testing.T) {
   175  
   176  	var transforms1 = []IpConversion{{
   177  		Low:    net.ParseIP("11.11.11.0"),
   178  		High:   net.ParseIP("11.11.11.20"),
   179  		NewIPs: []net.IP{net.ParseIP("1.1.1.1")},
   180  	}, {
   181  		Low:    net.ParseIP("22.22.22.0"),
   182  		High:   net.ParseIP("22.22.22.40"),
   183  		NewIPs: []net.IP{net.ParseIP("2.2.2.2")},
   184  	}, {
   185  		Low:    net.ParseIP("33.33.33.20"),
   186  		High:   net.ParseIP("33.33.35.40"),
   187  		NewIPs: []net.IP{net.ParseIP("3.3.3.3")},
   188  	},
   189  	}
   190  
   191  	var tests = []struct {
   192  		experiment string
   193  		expected   string
   194  	}{
   195  		{"11.11.11.0", "1.1.1.1"},
   196  		{"11.11.11.1", "1.1.1.1"},
   197  		{"11.11.11.11", "1.1.1.1"},
   198  		{"11.11.11.19", "1.1.1.1"},
   199  		{"11.11.11.20", "1.1.1.1"},
   200  		{"11.11.11.21", "11.11.11.21"},
   201  		{"22.22.22.22", "2.2.2.2"},
   202  		{"22.22.22.255", "22.22.22.255"},
   203  		{"33.33.33.0", "33.33.33.0"},
   204  		{"33.33.33.19", "33.33.33.19"},
   205  		{"33.33.33.20", "3.3.3.3"},
   206  		{"33.33.33.21", "3.3.3.3"},
   207  		{"33.33.33.33", "3.3.3.3"},
   208  		{"33.33.35.39", "3.3.3.3"},
   209  		{"33.33.35.40", "3.3.3.3"},
   210  		{"33.33.35.41", "33.33.35.41"},
   211  	}
   212  
   213  	for _, test := range tests {
   214  		experiment := net.ParseIP(test.experiment)
   215  		expected := net.ParseIP(test.expected)
   216  		actual, err := TransformIP(experiment, transforms1)
   217  		if err != nil {
   218  			t.Errorf("%v: got an err: %v\n", experiment, err)
   219  		}
   220  		if !expected.Equal(actual) {
   221  			t.Errorf("%v: expected (%v) got (%v)\n", experiment, expected, actual)
   222  		}
   223  	}
   224  }