This commit is contained in:
Rhys Williams 2025-02-03 17:21:25 -06:00 committed by GitHub
commit a9aedb377e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 85 additions and 4 deletions

View File

@ -110,8 +110,8 @@ const (
tunnelCmdErrorMessage = `You did not specify any valid additional argument to the cloudflared tunnel command. tunnelCmdErrorMessage = `You did not specify any valid additional argument to the cloudflared tunnel command.
If you are trying to run a Quick Tunnel then you need to explicitly pass the --url flag. If you are trying to run a Quick Tunnel then you need to explicitly pass a --url or --unix-socket flag.
Eg. cloudflared tunnel --url localhost:8080/. Eg. 'cloudflared tunnel --url localhost:8080/' or 'cloudflared tunnel --unix-socket /tmp/socket'.
Please note that Quick Tunnels are meant to be ephemeral and should only be used for testing purposes. Please note that Quick Tunnels are meant to be ephemeral and should only be used for testing purposes.
For production usage, we recommend creating Named Tunnels. (https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/) For production usage, we recommend creating Named Tunnels. (https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/)
@ -288,7 +288,14 @@ See https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/in
} }
} }
// This is so that we can mock QuickTunnelRunner for TunnelCommand test cases
type QuickTunnelRunner func(*subcommandContext) error
func TunnelCommand(c *cli.Context) error { func TunnelCommand(c *cli.Context) error {
return tunnelCommandImpl(c, RunQuickTunnel)
}
func tunnelCommandImpl(c *cli.Context, quickTunnelRunner QuickTunnelRunner) error {
sc, err := newSubcommandContext(c) sc, err := newSubcommandContext(c)
if err != nil { if err != nil {
return err return err
@ -315,9 +322,9 @@ func TunnelCommand(c *cli.Context) error {
// Run a quick tunnel // Run a quick tunnel
// A unauthenticated named tunnel hosted on <random>.<quick-tunnels-service>.com // A unauthenticated named tunnel hosted on <random>.<quick-tunnels-service>.com
// We don't support running proxy-dns and a quick tunnel at the same time as the same process // We don't support running proxy-dns and a quick tunnel at the same time as the same process
shouldRunQuickTunnel := c.IsSet("url") || c.IsSet(ingress.HelloWorldFlag) shouldRunQuickTunnel := c.IsSet("url") || c.IsSet("unix-socket") || c.IsSet(ingress.HelloWorldFlag)
if !c.IsSet("proxy-dns") && c.String("quick-service") != "" && shouldRunQuickTunnel { if !c.IsSet("proxy-dns") && c.String("quick-service") != "" && shouldRunQuickTunnel {
return RunQuickTunnel(sc) return quickTunnelRunner(sc)
} }
// If user provides a config, check to see if they meant to use `tunnel run` instead // If user provides a config, check to see if they meant to use `tunnel run` instead

View File

@ -1,9 +1,12 @@
package tunnel package tunnel
import ( import (
"flag"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"
) )
func TestHostnameFromURI(t *testing.T) { func TestHostnameFromURI(t *testing.T) {
@ -15,3 +18,74 @@ func TestHostnameFromURI(t *testing.T) {
assert.Equal(t, "", hostnameFromURI("trash")) assert.Equal(t, "", hostnameFromURI("trash"))
assert.Equal(t, "", hostnameFromURI("https://awesomesauce.com")) assert.Equal(t, "", hostnameFromURI("https://awesomesauce.com"))
} }
func TestShouldRunQuickTunnel(t *testing.T) {
tests := []struct {
name string
flags map[string]string
expectError bool
}{
{
name: "Quick tunnel with URL set",
flags: map[string]string{"url": "http://127.0.0.1:8080", "quick-service": "https://fakeapi.trycloudflare.com"},
expectError: false,
},
{
name: "Quick tunnel with unix-socket set",
flags: map[string]string{"unix-socket": "/tmp/socket", "quick-service": "https://fakeapi.trycloudflare.com"},
expectError: false,
},
{
name: "Quick tunnel with hello-world flag",
flags: map[string]string{"hello-world": "true", "quick-service": "https://fakeapi.trycloudflare.com"},
expectError: false,
},
{
name: "Quick tunnel with proxy-dns (invalid combo)",
flags: map[string]string{"url": "http://127.0.0.1:9090", "proxy-dns": "true", "quick-service": "https://fakeapi.trycloudflare.com"},
expectError: true,
},
{
name: "No quick-service set",
flags: map[string]string{"url": "http://127.0.0.1:9090"},
expectError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Mock RunQuickTunnel Function
mockCalled := false
mockQuickTunnelRunner := func(sc *subcommandContext) error {
mockCalled = true
return nil
}
// Mock App Context
app := &cli.App{}
set := flagSetFromMap(tt.flags)
context := cli.NewContext(app, set, nil)
// Call TunnelCommand
err := tunnelCommandImpl(context, mockQuickTunnelRunner)
// Validate
if tt.expectError {
assert.False(t, mockCalled)
require.Error(t, err)
} else {
assert.True(t, mockCalled)
require.NoError(t, err)
}
})
}
}
func flagSetFromMap(flags map[string]string) *flag.FlagSet {
set := flag.NewFlagSet("test", 0)
for key, value := range flags {
set.String(key, "", "")
set.Set(key, value)
}
return set
}