mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 03:27:23 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package middleware
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestSplitCommandAndArgs(t *testing.T) {
 | 
						|
	var parseErrorContent = "error parsing command:"
 | 
						|
	var noCommandErrContent = "no command contained in"
 | 
						|
 | 
						|
	tests := []struct {
 | 
						|
		input              string
 | 
						|
		expectedCommand    string
 | 
						|
		expectedArgs       []string
 | 
						|
		expectedErrContent string
 | 
						|
	}{
 | 
						|
		// Test case 0 - emtpy command
 | 
						|
		{
 | 
						|
			input:              ``,
 | 
						|
			expectedCommand:    ``,
 | 
						|
			expectedArgs:       nil,
 | 
						|
			expectedErrContent: noCommandErrContent,
 | 
						|
		},
 | 
						|
		// Test case 1 - command without arguments
 | 
						|
		{
 | 
						|
			input:              `command`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       nil,
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 2 - command with single argument
 | 
						|
		{
 | 
						|
			input:              `command arg1`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 3 - command with multiple arguments
 | 
						|
		{
 | 
						|
			input:              `command arg1 arg2`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1`, `arg2`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 4 - command with single argument with space character - in quotes
 | 
						|
		{
 | 
						|
			input:              `command "arg1 arg1"`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1 arg1`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 4 - command with single argument with space character - escaped
 | 
						|
		{
 | 
						|
			input:              `command arg1\ arg1`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1 arg1`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 6 - command with escaped quote character
 | 
						|
		{
 | 
						|
			input:              `command "arg1 \" arg1"`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1 " arg1`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 7 - command with escaped backslash
 | 
						|
		{
 | 
						|
			input:              `command '\arg1'`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`\arg1`},
 | 
						|
			expectedErrContent: ``,
 | 
						|
		},
 | 
						|
		// Test case 8 - command with comments
 | 
						|
		{
 | 
						|
			input:              `command arg1 #comment1 comment2`,
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1`},
 | 
						|
			expectedErrContent: "",
 | 
						|
		},
 | 
						|
		// Test case 9 - command with multiple spaces and tab character
 | 
						|
		{
 | 
						|
			input:              "command arg1    arg2\targ3",
 | 
						|
			expectedCommand:    `command`,
 | 
						|
			expectedArgs:       []string{`arg1`, `arg2`, "arg3"},
 | 
						|
			expectedErrContent: "",
 | 
						|
		},
 | 
						|
		// Test case 10 - command with unclosed quotes
 | 
						|
		{
 | 
						|
			input:              `command "arg1 arg2`,
 | 
						|
			expectedCommand:    "",
 | 
						|
			expectedArgs:       nil,
 | 
						|
			expectedErrContent: parseErrorContent,
 | 
						|
		},
 | 
						|
		// Test case 11 - command with unclosed quotes
 | 
						|
		{
 | 
						|
			input:              `command 'arg1 arg2"`,
 | 
						|
			expectedCommand:    "",
 | 
						|
			expectedArgs:       nil,
 | 
						|
			expectedErrContent: parseErrorContent,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for i, test := range tests {
 | 
						|
		errorPrefix := fmt.Sprintf("Test [%d]: ", i)
 | 
						|
		errorSuffix := fmt.Sprintf(" Command to parse: [%s]", test.input)
 | 
						|
		actualCommand, actualArgs, actualErr := SplitCommandAndArgs(test.input)
 | 
						|
 | 
						|
		// test if error matches expectation
 | 
						|
		if test.expectedErrContent != "" {
 | 
						|
			if actualErr == nil {
 | 
						|
				t.Errorf(errorPrefix+"Expected error with content [%s], found no error."+errorSuffix, test.expectedErrContent)
 | 
						|
			} else if !strings.Contains(actualErr.Error(), test.expectedErrContent) {
 | 
						|
				t.Errorf(errorPrefix+"Expected error with content [%s], found [%v]."+errorSuffix, test.expectedErrContent, actualErr)
 | 
						|
			}
 | 
						|
		} else if actualErr != nil {
 | 
						|
			t.Errorf(errorPrefix+"Expected no error, found [%v]."+errorSuffix, actualErr)
 | 
						|
		}
 | 
						|
 | 
						|
		// test if command matches
 | 
						|
		if test.expectedCommand != actualCommand {
 | 
						|
			t.Errorf("Expected command: [%s], actual: [%s]."+errorSuffix, test.expectedCommand, actualCommand)
 | 
						|
		}
 | 
						|
 | 
						|
		// test if arguments match
 | 
						|
		if len(test.expectedArgs) != len(actualArgs) {
 | 
						|
			t.Errorf("Wrong number of arguments! Expected [%v], actual [%v]."+errorSuffix, test.expectedArgs, actualArgs)
 | 
						|
		}
 | 
						|
 | 
						|
		for j, actualArg := range actualArgs {
 | 
						|
			expectedArg := test.expectedArgs[j]
 | 
						|
			if actualArg != expectedArg {
 | 
						|
				t.Errorf(errorPrefix+"Argument at position [%d] differ! Expected [%s], actual [%s]"+errorSuffix, j, expectedArg, actualArg)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |