...

Source file src/github.com/jackc/pgtype/inet_test.go

Documentation: github.com/jackc/pgtype

     1  package pgtype_test
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"reflect"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/jackc/pgtype"
    11  	"github.com/jackc/pgtype/testutil"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestInetTranscode(t *testing.T) {
    16  	testutil.TestSuccessfulTranscode(t, "inet", []interface{}{
    17  		&pgtype.Inet{IPNet: mustParseInet(t, "0.0.0.0/32"), Status: pgtype.Present},
    18  		&pgtype.Inet{IPNet: mustParseInet(t, "127.0.0.1/8"), Status: pgtype.Present},
    19  		&pgtype.Inet{IPNet: mustParseInet(t, "12.34.56.65/32"), Status: pgtype.Present},
    20  		&pgtype.Inet{IPNet: mustParseInet(t, "192.168.1.16/24"), Status: pgtype.Present},
    21  		&pgtype.Inet{IPNet: mustParseInet(t, "255.0.0.0/8"), Status: pgtype.Present},
    22  		&pgtype.Inet{IPNet: mustParseInet(t, "255.255.255.255/32"), Status: pgtype.Present},
    23  		&pgtype.Inet{IPNet: mustParseInet(t, "10.0.0.1"), Status: pgtype.Present},
    24  		&pgtype.Inet{IPNet: mustParseInet(t, "2607:f8b0:4009:80b::200e"), Status: pgtype.Present},
    25  		&pgtype.Inet{IPNet: mustParseInet(t, "::1/64"), Status: pgtype.Present},
    26  		&pgtype.Inet{IPNet: mustParseInet(t, "::/0"), Status: pgtype.Present},
    27  		&pgtype.Inet{IPNet: mustParseInet(t, "::1/128"), Status: pgtype.Present},
    28  		&pgtype.Inet{IPNet: mustParseInet(t, "2607:f8b0:4009:80b::200e/64"), Status: pgtype.Present},
    29  		&pgtype.Inet{Status: pgtype.Null},
    30  	})
    31  }
    32  
    33  func TestCidrTranscode(t *testing.T) {
    34  	testutil.TestSuccessfulTranscode(t, "cidr", []interface{}{
    35  		&pgtype.Inet{IPNet: mustParseCIDR(t, "0.0.0.0/32"), Status: pgtype.Present},
    36  		&pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present},
    37  		&pgtype.Inet{IPNet: mustParseCIDR(t, "12.34.56.0/32"), Status: pgtype.Present},
    38  		&pgtype.Inet{IPNet: mustParseCIDR(t, "192.168.1.0/24"), Status: pgtype.Present},
    39  		&pgtype.Inet{IPNet: mustParseCIDR(t, "255.0.0.0/8"), Status: pgtype.Present},
    40  		&pgtype.Inet{IPNet: mustParseCIDR(t, "255.255.255.255/32"), Status: pgtype.Present},
    41  		&pgtype.Inet{IPNet: mustParseCIDR(t, "::/128"), Status: pgtype.Present},
    42  		&pgtype.Inet{IPNet: mustParseCIDR(t, "::/0"), Status: pgtype.Present},
    43  		&pgtype.Inet{IPNet: mustParseCIDR(t, "::1/128"), Status: pgtype.Present},
    44  		&pgtype.Inet{IPNet: mustParseCIDR(t, "2607:f8b0:4009:80b::200e/128"), Status: pgtype.Present},
    45  		&pgtype.Inet{Status: pgtype.Null},
    46  	})
    47  }
    48  
    49  type textMarshaler struct {
    50  	Text string
    51  }
    52  
    53  func (t textMarshaler) MarshalText() (text []byte, err error) {
    54  	return []byte(t.Text), err
    55  }
    56  
    57  func TestInetSet(t *testing.T) {
    58  	successfulTests := []struct {
    59  		source interface{}
    60  		result pgtype.Inet
    61  	}{
    62  		{source: mustParseCIDR(t, "127.0.0.1/32"), result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}},
    63  		{source: mustParseCIDR(t, "127.0.0.1/32").IP, result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}},
    64  		{source: "127.0.0.1/32", result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}},
    65  		{source: "1.2.3.4/24", result: pgtype.Inet{IPNet: &net.IPNet{IP: net.ParseIP("1.2.3.4").To4(), Mask: net.CIDRMask(24, 32)}, Status: pgtype.Present}},
    66  		{source: "10.0.0.1", result: pgtype.Inet{IPNet: mustParseInet(t, "10.0.0.1"), Status: pgtype.Present}},
    67  		{source: "2607:f8b0:4009:80b::200e", result: pgtype.Inet{IPNet: mustParseInet(t, "2607:f8b0:4009:80b::200e"), Status: pgtype.Present}},
    68  		{source: net.ParseIP(""), result: pgtype.Inet{Status: pgtype.Null}},
    69  		{source: "0.0.0.0/8", result: pgtype.Inet{IPNet: mustParseInet(t, "0.0.0.0/8"), Status: pgtype.Present}},
    70  		{source: "::ffff:0.0.0.0/104", result: pgtype.Inet{IPNet: &net.IPNet{IP: net.ParseIP("::ffff:0.0.0.0"), Mask: net.CIDRMask(104, 128)}, Status: pgtype.Present}},
    71  		{source: textMarshaler{"127.0.0.1"}, result: pgtype.Inet{IPNet: mustParseInet(t, "127.0.0.1"), Status: pgtype.Present}},
    72  		{source: func(s string) fmt.Stringer {
    73  			var b strings.Builder
    74  			b.WriteString(s)
    75  			return &b
    76  		}("127.0.0.1"), result: pgtype.Inet{IPNet: mustParseInet(t, "127.0.0.1"), Status: pgtype.Present}},
    77  	}
    78  
    79  	for i, tt := range successfulTests {
    80  		var r pgtype.Inet
    81  		err := r.Set(tt.source)
    82  		if err != nil {
    83  			t.Errorf("%d: %v", i, err)
    84  			continue
    85  		}
    86  
    87  		assert.Equalf(t, tt.result.Status, r.Status, "%d: Status", i)
    88  		if tt.result.Status == pgtype.Present {
    89  			assert.Equalf(t, tt.result.IPNet.Mask, r.IPNet.Mask, "%d: Mask", i)
    90  			assert.Truef(t, tt.result.IPNet.IP.Equal(r.IPNet.IP), "%d: IP", i)
    91  			assert.Equalf(t, len(tt.result.IPNet.IP), len(r.IPNet.IP), "%d: IP length", i)
    92  		}
    93  	}
    94  }
    95  
    96  type textUnmarshaler struct {
    97  	Text string
    98  }
    99  
   100  func (u *textUnmarshaler) UnmarshalText(text []byte) error {
   101  	u.Text = string(text)
   102  	return nil
   103  }
   104  
   105  func TestInetAssignTo(t *testing.T) {
   106  	var ipnet net.IPNet
   107  	var pipnet *net.IPNet
   108  	var ip net.IP
   109  	var pip *net.IP
   110  	var um textUnmarshaler
   111  	var pum *textUnmarshaler
   112  
   113  	simpleTests := []struct {
   114  		src      pgtype.Inet
   115  		dst      interface{}
   116  		expected interface{}
   117  	}{
   118  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}, dst: &ipnet, expected: *mustParseCIDR(t, "127.0.0.1/32")},
   119  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}, dst: &ip, expected: mustParseCIDR(t, "127.0.0.1/32").IP},
   120  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}, dst: &um, expected: textUnmarshaler{"127.0.0.1/32"}},
   121  		{src: pgtype.Inet{Status: pgtype.Null}, dst: &pipnet, expected: ((*net.IPNet)(nil))},
   122  		{src: pgtype.Inet{Status: pgtype.Null}, dst: &pip, expected: ((*net.IP)(nil))},
   123  		{src: pgtype.Inet{Status: pgtype.Null}, dst: &pum, expected: ((*textUnmarshaler)(nil))},
   124  	}
   125  
   126  	for i, tt := range simpleTests {
   127  		err := tt.src.AssignTo(tt.dst)
   128  		if err != nil {
   129  			t.Errorf("%d: %v", i, err)
   130  		}
   131  
   132  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   133  			t.Errorf("%d: expected %v to assign %#v, but result was %#v", i, tt.src, tt.expected, dst)
   134  		}
   135  	}
   136  
   137  	pointerAllocTests := []struct {
   138  		src      pgtype.Inet
   139  		dst      interface{}
   140  		expected interface{}
   141  	}{
   142  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}, dst: &pipnet, expected: *mustParseCIDR(t, "127.0.0.1/32")},
   143  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}, dst: &pip, expected: mustParseCIDR(t, "127.0.0.1/32").IP},
   144  	}
   145  
   146  	for i, tt := range pointerAllocTests {
   147  		err := tt.src.AssignTo(tt.dst)
   148  		if err != nil {
   149  			t.Errorf("%d: %v", i, err)
   150  		}
   151  
   152  		if dst := reflect.ValueOf(tt.dst).Elem().Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   153  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   154  		}
   155  	}
   156  
   157  	errorTests := []struct {
   158  		src pgtype.Inet
   159  		dst interface{}
   160  	}{
   161  		{src: pgtype.Inet{IPNet: mustParseCIDR(t, "192.168.0.0/16"), Status: pgtype.Present}, dst: &ip},
   162  		{src: pgtype.Inet{Status: pgtype.Null}, dst: &ipnet},
   163  	}
   164  
   165  	for i, tt := range errorTests {
   166  		err := tt.src.AssignTo(tt.dst)
   167  		if err == nil {
   168  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   169  		}
   170  	}
   171  }
   172  

View as plain text