packer-cn/packer-plugin-sdk/communicator/ssh/tunnel_test.go

80 lines
2.0 KiB
Go

package ssh
import (
"testing"
"github.com/hashicorp/packer/packer-plugin-sdk/sdk-internals/communicator/ssh"
)
const (
tunnel8080ToLocal = "8080:localhost:1234"
tunnel8080ToRemote = "8080:example.com:80"
bindRemoteAddress_NYI = "redis:6379:localhost:6379"
)
func TestTCPToLocalTCP(t *testing.T) {
tun, err := ParseTunnelArgument(tunnel8080ToLocal, ssh.UnsetTunnel)
if err != nil {
t.Fatal(err.Error())
}
expectedTun := ssh.TunnelSpec{
Direction: ssh.UnsetTunnel,
ForwardAddr: "localhost:1234",
ForwardType: "tcp",
ListenAddr: "localhost:8080",
ListenType: "tcp",
}
if tun != expectedTun {
t.Errorf("Parsed tunnel (%v), want %v", tun, expectedTun)
}
}
func TestTCPToRemoteTCP(t *testing.T) {
tun, err := ParseTunnelArgument(tunnel8080ToRemote, ssh.UnsetTunnel)
if err != nil {
t.Fatal(err.Error())
}
expectedTun := ssh.TunnelSpec{
Direction: ssh.UnsetTunnel,
ForwardAddr: "example.com:80",
ForwardType: "tcp",
ListenAddr: "localhost:8080",
ListenType: "tcp",
}
if tun != expectedTun {
t.Errorf("Parsed tunnel (%v), want %v", tun, expectedTun)
}
}
func TestBindAddress_NYI(t *testing.T) {
tun, err := ParseTunnelArgument(bindRemoteAddress_NYI, ssh.UnsetTunnel)
if err == nil {
t.Fatal(err.Error())
}
expectedTun := ssh.TunnelSpec{
Direction: ssh.UnsetTunnel,
ForwardAddr: "redis:6379",
ForwardType: "tcp",
ListenAddr: "localhost:6379",
ListenType: "tcp",
}
if tun == expectedTun {
t.Errorf("Parsed tunnel (%v), want %v", tun, expectedTun)
}
}
func TestInvalidTunnels(t *testing.T) {
invalids := []string{
"nope:8080", // insufficient parts
"nope:localhost:8080", // listen port is not a number
"8080:localhost:nope", // forwarding port is not a number
"/unix/is/no/go:/path/to/nowhere", // unix socket is unsupported
}
for _, tunnelStr := range invalids {
tun, err := ParseTunnelArgument(tunnelStr, ssh.UnsetTunnel)
if err == nil {
t.Errorf("Parsed tunnel %v, want error", tun)
}
}
}