From 8b0a7425f8674f152797687bc45fdba731f0c0b2 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Sat, 17 Oct 2020 13:45:52 +0100 Subject: [PATCH] Add tests for parsing shadowsocks binding addresses --- cmd/ck-server/ck-server_test.go | 115 ++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 5 deletions(-) diff --git a/cmd/ck-server/ck-server_test.go b/cmd/ck-server/ck-server_test.go index f4067f5..09de559 100644 --- a/cmd/ck-server/ck-server_test.go +++ b/cmd/ck-server/ck-server_test.go @@ -1,10 +1,14 @@ package main -import "testing" +import ( + "github.com/stretchr/testify/assert" + "net" + "testing" +) func TestParseBindAddr(t *testing.T) { t.Run("port only", func(t *testing.T) { - addrs, err := parseBindAddr([]string{":443"}) + addrs, err := resolveBindAddr([]string{":443"}) if err != nil { t.Error(err) return @@ -15,7 +19,7 @@ func TestParseBindAddr(t *testing.T) { }) t.Run("specific address", func(t *testing.T) { - addrs, err := parseBindAddr([]string{"192.168.1.123:443"}) + addrs, err := resolveBindAddr([]string{"192.168.1.123:443"}) if err != nil { t.Error(err) return @@ -26,7 +30,7 @@ func TestParseBindAddr(t *testing.T) { }) t.Run("ipv6", func(t *testing.T) { - addrs, err := parseBindAddr([]string{"[::]:443"}) + addrs, err := resolveBindAddr([]string{"[::]:443"}) if err != nil { t.Error(err) return @@ -37,7 +41,7 @@ func TestParseBindAddr(t *testing.T) { }) t.Run("mixed", func(t *testing.T) { - addrs, err := parseBindAddr([]string{":80", "[::]:443"}) + addrs, err := resolveBindAddr([]string{":80", "[::]:443"}) if err != nil { t.Error(err) return @@ -50,3 +54,104 @@ func TestParseBindAddr(t *testing.T) { } }) } + +func assertSetEqual(t *testing.T, list1, list2 interface{}, msgAndArgs ...interface{}) (ok bool) { + return assert.Subset(t, list1, list2, msgAndArgs) && assert.Subset(t, list2, list1, msgAndArgs) +} + +func TestParseSSBindAddr(t *testing.T) { + testTable := []struct { + name string + ssRemoteHost string + ssRemotePort string + ckBindAddr []net.Addr + expectedAddr []net.Addr + }{ + { + "ss only ipv4", + "127.0.0.1", + "443", + []net.Addr{}, + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("127.0.0.1"), + Port: 443, + }, + }, + }, + { + "ss only ipv6", + "::", + "443", + []net.Addr{}, + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("::"), + Port: 443, + }, + }, + }, + //{ + // "ss only ipv4 and v6", + // "::|127.0.0.1", + // "443", + // []net.Addr{}, + // []net.Addr{ + // &net.TCPAddr{ + // IP: net.ParseIP("::"), + // Port: 443, + // }, + // &net.TCPAddr{ + // IP: net.ParseIP("127.0.0.1"), + // Port: 443, + // }, + // }, + //}, + { + "ss and existing agrees", + "::", + "443", + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("::"), + Port: 443, + }, + }, + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("::"), + Port: 443, + }, + }, + }, + { + "ss adds onto existing", + "127.0.0.1", + "80", + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("::"), + Port: 443, + }, + }, + []net.Addr{ + &net.TCPAddr{ + IP: net.ParseIP("::"), + Port: 443, + }, + &net.TCPAddr{ + IP: net.ParseIP("127.0.0.1"), + Port: 80, + }, + }, + }, + } + + for _, test := range testTable { + test := test + t.Run(test.name, func(t *testing.T) { + assert.NoError(t, parseSSBindAddr(test.ssRemoteHost, test.ssRemotePort, &test.ckBindAddr)) + assertSetEqual(t, test.ckBindAddr, test.expectedAddr) + }) + } +}