cmd/tailscale/cli: refactor TestServeDevConfigMutations

The TestServeDevConfigMutations test has 63 steps that all run
under the same scope. This tests breaks them out into isolated
subtests that can be run independently.

Updates #8489

Signed-off-by: Marwan Sulaiman <marwan@tailscale.com>
This commit is contained in:
Marwan Sulaiman 2023-10-24 17:14:49 -04:00 committed by Marwan Sulaiman
parent d79e0fde9c
commit a7e4cebb90
3 changed files with 803 additions and 773 deletions

View File

@ -171,6 +171,7 @@ type serveEnv struct {
// optional stuff for tests: // optional stuff for tests:
testFlagOut io.Writer testFlagOut io.Writer
testStdout io.Writer testStdout io.Writer
testStderr io.Writer
} }
// getSelfDNSName returns the DNS name of the current node. // getSelfDNSName returns the DNS name of the current node.
@ -681,13 +682,6 @@ func (e *serveEnv) runServeStatus(ctx context.Context, args []string) error {
return nil return nil
} }
func (e *serveEnv) stdout() io.Writer {
if e.testStdout != nil {
return e.testStdout
}
return os.Stdout
}
func printTCPStatusTree(ctx context.Context, sc *ipn.ServeConfig, st *ipnstate.Status) error { func printTCPStatusTree(ctx context.Context, sc *ipn.ServeConfig, st *ipnstate.Status) error {
dnsName := strings.TrimSuffix(st.Self.DNSName, ".") dnsName := strings.TrimSuffix(st.Self.DNSName, ".")
for p, h := range sc.TCP { for p, h := range sc.TCP {

View File

@ -156,26 +156,26 @@ func newServeV2Command(e *serveEnv, subcmd serveMode) *ffcli.Command {
} }
} }
func validateArgs(subcmd serveMode, args []string) error { func (e *serveEnv) validateArgs(subcmd serveMode, args []string) error {
if translation, ok := isLegacyInvocation(subcmd, args); ok { if translation, ok := isLegacyInvocation(subcmd, args); ok {
fmt.Fprint(os.Stderr, "Error: the CLI for serve and funnel has changed.") fmt.Fprint(e.stderr(), "Error: the CLI for serve and funnel has changed.")
if translation != "" { if translation != "" {
fmt.Fprint(os.Stderr, " You can run the following command instead:\n") fmt.Fprint(e.stderr(), " You can run the following command instead:\n")
fmt.Fprintf(os.Stderr, "\t- %s\n", translation) fmt.Fprintf(e.stderr(), "\t- %s\n", translation)
} }
fmt.Fprint(os.Stderr, "\nPlease see https://tailscale.com/kb/1242/tailscale-serve for more information.\n") fmt.Fprint(e.stderr(), "\nPlease see https://tailscale.com/kb/1242/tailscale-serve for more information.\n")
return errHelpFunc(subcmd) return errHelpFunc(subcmd)
} }
if len(args) == 0 { if len(args) == 0 {
return flag.ErrHelp return flag.ErrHelp
} }
if len(args) > 2 { if len(args) > 2 {
fmt.Fprintf(os.Stderr, "Error: invalid number of arguments (%d)\n", len(args)) fmt.Fprintf(e.stderr(), "Error: invalid number of arguments (%d)\n", len(args))
return errHelpFunc(subcmd) return errHelpFunc(subcmd)
} }
turnOff := args[len(args)-1] == "off" turnOff := args[len(args)-1] == "off"
if len(args) == 2 && !turnOff { if len(args) == 2 && !turnOff {
fmt.Fprintln(os.Stderr, "Error: invalid argument format") fmt.Fprintln(e.stderr(), "Error: invalid argument format")
return errHelpFunc(subcmd) return errHelpFunc(subcmd)
} }
@ -203,7 +203,7 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
return e.lc.SetServeConfig(ctx, sc) return e.lc.SetServeConfig(ctx, sc)
} }
if err := validateArgs(subcmd, args); err != nil { if err := e.validateArgs(subcmd, args); err != nil {
return err return err
} }
@ -230,7 +230,7 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
srvType, srvPort, err := srvTypeAndPortFromFlags(e) srvType, srvPort, err := srvTypeAndPortFromFlags(e)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n\n", err) fmt.Fprintf(e.stderr(), "error: %v\n\n", err)
return errHelpFunc(subcmd) return errHelpFunc(subcmd)
} }
@ -300,19 +300,19 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
msg = e.messageForPort(sc, st, dnsName, srvType, srvPort) msg = e.messageForPort(sc, st, dnsName, srvType, srvPort)
} }
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n\n", err) fmt.Fprintf(e.stderr(), "error: %v\n\n", err)
return errHelpFunc(subcmd) return errHelpFunc(subcmd)
} }
if err := e.lc.SetServeConfig(ctx, parentSC); err != nil { if err := e.lc.SetServeConfig(ctx, parentSC); err != nil {
if tailscale.IsPreconditionsFailedError(err) { if tailscale.IsPreconditionsFailedError(err) {
fmt.Fprintln(os.Stderr, "Another client is changing the serve config; please try again.") fmt.Fprintln(e.stderr(), "Another client is changing the serve config; please try again.")
} }
return err return err
} }
if msg != "" { if msg != "" {
fmt.Fprintln(os.Stderr, msg) fmt.Fprintln(e.stdout(), msg)
} }
if watcher != nil { if watcher != nil {
@ -621,7 +621,7 @@ func (e *serveEnv) applyFunnel(sc *ipn.ServeConfig, dnsName string, srvPort uint
if allowFunnel { if allowFunnel {
mak.Set(&sc.AllowFunnel, hp, true) mak.Set(&sc.AllowFunnel, hp, true)
} else if _, exists := sc.AllowFunnel[hp]; exists { } else if _, exists := sc.AllowFunnel[hp]; exists {
fmt.Printf("Removing Funnel for %s\n", hp) fmt.Fprintf(e.stderr(), "Removing Funnel for %s\n", hp)
delete(sc.AllowFunnel, hp) delete(sc.AllowFunnel, hp)
} }
} }
@ -953,3 +953,17 @@ func (s serveType) String() string {
return "unknownServeType" return "unknownServeType"
} }
} }
func (e *serveEnv) stdout() io.Writer {
if e.testStdout != nil {
return e.testStdout
}
return os.Stdout
}
func (e *serveEnv) stderr() io.Writer {
if e.testStderr != nil {
return e.testStderr
}
return os.Stderr
}

File diff suppressed because it is too large Load Diff