2019-07-01 06:07:58 +08:00
|
|
|
// Copyright 2015 Matthew Holt and The Caddy Authors
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2019-07-09 06:46:38 +08:00
|
|
|
package caddy
|
2019-03-27 05:45:51 +08:00
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2019-09-06 03:14:39 +08:00
|
|
|
func TestSplitNetworkAddress(t *testing.T) {
|
2019-05-08 00:15:46 +08:00
|
|
|
for i, tc := range []struct {
|
|
|
|
input string
|
|
|
|
expectNetwork string
|
|
|
|
expectHost string
|
|
|
|
expectPort string
|
|
|
|
expectErr bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
input: "",
|
|
|
|
expectErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "foo",
|
|
|
|
expectErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "foo:1234",
|
|
|
|
expectHost: "foo",
|
|
|
|
expectPort: "1234",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "foo:1234-5678",
|
|
|
|
expectHost: "foo",
|
|
|
|
expectPort: "1234-5678",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "udp/foo:1234",
|
|
|
|
expectNetwork: "udp",
|
|
|
|
expectHost: "foo",
|
|
|
|
expectPort: "1234",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "tcp6/foo:1234-5678",
|
|
|
|
expectNetwork: "tcp6",
|
|
|
|
expectHost: "foo",
|
|
|
|
expectPort: "1234-5678",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "udp/",
|
|
|
|
expectNetwork: "udp",
|
|
|
|
expectErr: true,
|
|
|
|
},
|
2019-07-09 06:46:38 +08:00
|
|
|
{
|
|
|
|
input: "unix//foo/bar",
|
|
|
|
expectNetwork: "unix",
|
|
|
|
expectHost: "/foo/bar",
|
|
|
|
},
|
2019-09-06 03:14:39 +08:00
|
|
|
{
|
|
|
|
input: "unixgram//foo/bar",
|
|
|
|
expectNetwork: "unixgram",
|
|
|
|
expectHost: "/foo/bar",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "unixpacket//foo/bar",
|
|
|
|
expectNetwork: "unixpacket",
|
|
|
|
expectHost: "/foo/bar",
|
|
|
|
},
|
2019-05-08 00:15:46 +08:00
|
|
|
} {
|
2019-09-06 03:14:39 +08:00
|
|
|
actualNetwork, actualHost, actualPort, err := SplitNetworkAddress(tc.input)
|
2019-05-08 00:15:46 +08:00
|
|
|
if tc.expectErr && err == nil {
|
|
|
|
t.Errorf("Test %d: Expected error but got: %v", i, err)
|
|
|
|
}
|
|
|
|
if !tc.expectErr && err != nil {
|
|
|
|
t.Errorf("Test %d: Expected no error but got: %v", i, err)
|
|
|
|
}
|
|
|
|
if actualNetwork != tc.expectNetwork {
|
|
|
|
t.Errorf("Test %d: Expected network '%s' but got '%s'", i, tc.expectNetwork, actualNetwork)
|
|
|
|
}
|
|
|
|
if actualHost != tc.expectHost {
|
|
|
|
t.Errorf("Test %d: Expected host '%s' but got '%s'", i, tc.expectHost, actualHost)
|
|
|
|
}
|
|
|
|
if actualPort != tc.expectPort {
|
|
|
|
t.Errorf("Test %d: Expected port '%s' but got '%s'", i, tc.expectPort, actualPort)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-06 03:14:39 +08:00
|
|
|
func TestJoinNetworkAddress(t *testing.T) {
|
2019-05-08 00:15:46 +08:00
|
|
|
for i, tc := range []struct {
|
|
|
|
network, host, port string
|
|
|
|
expect string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
network: "", host: "", port: "",
|
|
|
|
expect: "",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "tcp", host: "", port: "",
|
|
|
|
expect: "tcp/",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "", host: "foo", port: "",
|
|
|
|
expect: "foo",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "", host: "", port: "1234",
|
|
|
|
expect: ":1234",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "", host: "", port: "1234-5678",
|
|
|
|
expect: ":1234-5678",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "", host: "foo", port: "1234",
|
|
|
|
expect: "foo:1234",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "udp", host: "foo", port: "1234",
|
|
|
|
expect: "udp/foo:1234",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "udp", host: "", port: "1234",
|
|
|
|
expect: "udp/:1234",
|
|
|
|
},
|
2019-07-09 06:46:38 +08:00
|
|
|
{
|
|
|
|
network: "unix", host: "/foo/bar", port: "",
|
|
|
|
expect: "unix//foo/bar",
|
|
|
|
},
|
2020-04-11 07:31:38 +08:00
|
|
|
{
|
|
|
|
network: "unix", host: "/foo/bar", port: "0",
|
|
|
|
expect: "unix//foo/bar",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
network: "unix", host: "/foo/bar", port: "1234",
|
|
|
|
expect: "unix//foo/bar",
|
|
|
|
},
|
2019-10-12 04:25:39 +08:00
|
|
|
{
|
|
|
|
network: "", host: "::1", port: "1234",
|
|
|
|
expect: "[::1]:1234",
|
|
|
|
},
|
2019-05-08 00:15:46 +08:00
|
|
|
} {
|
2019-09-06 03:14:39 +08:00
|
|
|
actual := JoinNetworkAddress(tc.network, tc.host, tc.port)
|
2019-05-08 00:15:46 +08:00
|
|
|
if actual != tc.expect {
|
|
|
|
t.Errorf("Test %d: Expected '%s' but got '%s'", i, tc.expect, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-06 03:14:39 +08:00
|
|
|
func TestParseNetworkAddress(t *testing.T) {
|
2019-03-27 05:45:51 +08:00
|
|
|
for i, tc := range []struct {
|
2019-11-12 06:33:38 +08:00
|
|
|
input string
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr NetworkAddress
|
2019-11-12 06:33:38 +08:00
|
|
|
expectErr bool
|
2019-03-27 05:45:51 +08:00
|
|
|
}{
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "",
|
|
|
|
expectErr: true,
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: ":",
|
|
|
|
expectErr: true,
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: ":1234",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "tcp/:1234",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "tcp6/:1234",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp6",
|
|
|
|
Host: "",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "tcp4/localhost:1234",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp4",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "unix//foo/bar",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "unix",
|
|
|
|
Host: "/foo/bar",
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "localhost:1234-1234",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "localhost:2-1",
|
|
|
|
expectErr: true,
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
{
|
2019-11-12 06:33:38 +08:00
|
|
|
input: "localhost:0",
|
2020-04-07 22:33:45 +08:00
|
|
|
expectAddr: NetworkAddress{
|
2019-11-12 06:33:38 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 0,
|
|
|
|
EndPort: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: "localhost:1-999999999999",
|
|
|
|
expectErr: true,
|
2019-03-27 05:45:51 +08:00
|
|
|
},
|
|
|
|
} {
|
2019-11-12 06:33:38 +08:00
|
|
|
actualAddr, err := ParseNetworkAddress(tc.input)
|
2019-03-27 05:45:51 +08:00
|
|
|
if tc.expectErr && err == nil {
|
|
|
|
t.Errorf("Test %d: Expected error but got: %v", i, err)
|
|
|
|
}
|
|
|
|
if !tc.expectErr && err != nil {
|
|
|
|
t.Errorf("Test %d: Expected no error but got: %v", i, err)
|
|
|
|
}
|
2019-11-12 06:33:38 +08:00
|
|
|
|
|
|
|
if actualAddr.Network != tc.expectAddr.Network {
|
|
|
|
t.Errorf("Test %d: Expected network '%v' but got '%v'", i, tc.expectAddr, actualAddr)
|
2019-03-27 05:45:51 +08:00
|
|
|
}
|
2019-11-12 06:33:38 +08:00
|
|
|
if !reflect.DeepEqual(tc.expectAddr, actualAddr) {
|
|
|
|
t.Errorf("Test %d: Expected addresses %v but got %v", i, tc.expectAddr, actualAddr)
|
2019-03-27 05:45:51 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-12-07 02:45:50 +08:00
|
|
|
|
|
|
|
func TestJoinHostPort(t *testing.T) {
|
|
|
|
for i, tc := range []struct {
|
2020-04-07 22:33:45 +08:00
|
|
|
pa NetworkAddress
|
2019-12-07 02:45:50 +08:00
|
|
|
offset uint
|
|
|
|
expect string
|
|
|
|
}{
|
|
|
|
{
|
2020-04-07 22:33:45 +08:00
|
|
|
pa: NetworkAddress{
|
2019-12-07 02:45:50 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1234,
|
|
|
|
},
|
|
|
|
expect: "localhost:1234",
|
|
|
|
},
|
|
|
|
{
|
2020-04-07 22:33:45 +08:00
|
|
|
pa: NetworkAddress{
|
2019-12-07 02:45:50 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1235,
|
|
|
|
},
|
|
|
|
expect: "localhost:1234",
|
|
|
|
},
|
|
|
|
{
|
2020-04-07 22:33:45 +08:00
|
|
|
pa: NetworkAddress{
|
2019-12-07 02:45:50 +08:00
|
|
|
Network: "tcp",
|
|
|
|
Host: "localhost",
|
|
|
|
StartPort: 1234,
|
|
|
|
EndPort: 1235,
|
|
|
|
},
|
|
|
|
offset: 1,
|
|
|
|
expect: "localhost:1235",
|
|
|
|
},
|
|
|
|
{
|
2020-04-07 22:33:45 +08:00
|
|
|
pa: NetworkAddress{
|
2019-12-07 02:45:50 +08:00
|
|
|
Network: "unix",
|
|
|
|
Host: "/run/php/php7.3-fpm.sock",
|
|
|
|
},
|
|
|
|
expect: "/run/php/php7.3-fpm.sock",
|
|
|
|
},
|
|
|
|
} {
|
|
|
|
actual := tc.pa.JoinHostPort(tc.offset)
|
|
|
|
if actual != tc.expect {
|
|
|
|
t.Errorf("Test %d: Expected '%s' but got '%s'", i, tc.expect, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|