Allow `tailscale serve --tcp <port> unix:/path/to/socket` and `tailscale serve --tls-terminated-tcp <port> unix:/path/to/socket` to forward TCP connections to a Unix domain socket. Previously only host:port targets were supported for TCP serve mode. Updates #20161 Signed-off-by: ayanamist <ayanamist@gmail.com>
106 lines
2.9 KiB
Go
106 lines
2.9 KiB
Go
// Copyright (c) Tailscale Inc & contributors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package ipn
|
|
|
|
import (
|
|
"runtime"
|
|
"testing"
|
|
)
|
|
|
|
func TestExpandProxyTargetValueUnix(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
target string
|
|
supportedSchemes []string
|
|
defaultScheme string
|
|
want string
|
|
wantErr bool
|
|
skipOnWindows bool
|
|
}{
|
|
{
|
|
name: "unix-socket-absolute-path",
|
|
target: "unix:/tmp/myservice.sock",
|
|
supportedSchemes: []string{"http", "https", "unix"},
|
|
defaultScheme: "http",
|
|
want: "unix:/tmp/myservice.sock",
|
|
skipOnWindows: true,
|
|
},
|
|
{
|
|
name: "unix-socket-var-run",
|
|
target: "unix:/var/run/docker.sock",
|
|
supportedSchemes: []string{"http", "https", "unix"},
|
|
defaultScheme: "http",
|
|
want: "unix:/var/run/docker.sock",
|
|
skipOnWindows: true,
|
|
},
|
|
{
|
|
name: "unix-socket-relative-path",
|
|
target: "unix:./myservice.sock",
|
|
supportedSchemes: []string{"http", "https", "unix"},
|
|
defaultScheme: "http",
|
|
want: "unix:./myservice.sock",
|
|
skipOnWindows: true,
|
|
},
|
|
{
|
|
name: "unix-socket-bare-relative-path",
|
|
target: "unix:myservice.sock",
|
|
supportedSchemes: []string{"http", "https", "unix"},
|
|
defaultScheme: "http",
|
|
want: "unix:myservice.sock",
|
|
skipOnWindows: true,
|
|
},
|
|
{
|
|
name: "unix-socket-empty-path",
|
|
target: "unix:",
|
|
supportedSchemes: []string{"http", "https", "unix"},
|
|
defaultScheme: "http",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "unix-socket-not-in-supported-schemes",
|
|
target: "unix:/tmp/myservice.sock",
|
|
supportedSchemes: []string{"http", "https"},
|
|
defaultScheme: "http",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "unix-socket-tcp-supported",
|
|
target: "unix:/var/run/app.sock",
|
|
supportedSchemes: []string{"tcp", "unix"},
|
|
defaultScheme: "tcp",
|
|
want: "unix:/var/run/app.sock",
|
|
skipOnWindows: true,
|
|
},
|
|
{
|
|
name: "unix-socket-tcp-not-supported",
|
|
target: "unix:/var/run/app.sock",
|
|
supportedSchemes: []string{"tcp"},
|
|
defaultScheme: "tcp",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if tt.skipOnWindows && runtime.GOOS == "windows" {
|
|
t.Skip("skipping unix socket test on Windows")
|
|
}
|
|
|
|
// On Windows, unix sockets should always error
|
|
if runtime.GOOS == "windows" && !tt.wantErr {
|
|
tt.wantErr = true
|
|
}
|
|
|
|
got, err := ExpandProxyTargetValue(tt.target, tt.supportedSchemes, tt.defaultScheme)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("ExpandProxyTargetValue() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if !tt.wantErr && got != tt.want {
|
|
t.Errorf("ExpandProxyTargetValue() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|