github.com/mckael/restic@v0.8.3/internal/backend/sftp/split_test.go (about)

     1  package sftp
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  func TestShellSplitter(t *testing.T) {
     9  	var tests = []struct {
    10  		data string
    11  		cmd  string
    12  		args []string
    13  	}{
    14  		{
    15  			`foo`,
    16  			"foo", []string{},
    17  		},
    18  		{
    19  			`'foo'`,
    20  			"foo", []string{},
    21  		},
    22  		{
    23  			`foo bar baz`,
    24  			"foo", []string{"bar", "baz"},
    25  		},
    26  		{
    27  			`foo 'bar' baz`,
    28  			"foo", []string{"bar", "baz"},
    29  		},
    30  		{
    31  			`'bar box' baz`,
    32  			"bar box", []string{"baz"},
    33  		},
    34  		{
    35  			`"bar 'box'" baz`,
    36  			"bar 'box'", []string{"baz"},
    37  		},
    38  		{
    39  			`'bar "box"' baz`,
    40  			`bar "box"`, []string{"baz"},
    41  		},
    42  		{
    43  			`\"bar box baz`,
    44  			`"bar`, []string{"box", "baz"},
    45  		},
    46  		{
    47  			`"bar/foo/x" "box baz"`,
    48  			"bar/foo/x", []string{"box baz"},
    49  		},
    50  	}
    51  
    52  	for _, test := range tests {
    53  		t.Run("", func(t *testing.T) {
    54  			cmd, args, err := SplitShellArgs(test.data)
    55  			if err != nil {
    56  				t.Fatal(err)
    57  			}
    58  
    59  			if cmd != test.cmd {
    60  				t.Fatalf("wrong cmd returned, want:\n  %#v\ngot:\n  %#v",
    61  					test.cmd, cmd)
    62  			}
    63  
    64  			if !reflect.DeepEqual(args, test.args) {
    65  				t.Fatalf("wrong args returned, want:\n  %#v\ngot:\n  %#v",
    66  					test.args, args)
    67  			}
    68  		})
    69  	}
    70  }
    71  
    72  func TestShellSplitterInvalid(t *testing.T) {
    73  	var tests = []struct {
    74  		data string
    75  		err  string
    76  	}{
    77  		{
    78  			"foo'",
    79  			"single-quoted string not terminated",
    80  		},
    81  		{
    82  			`foo"`,
    83  			"double-quoted string not terminated",
    84  		},
    85  		{
    86  			"foo 'bar",
    87  			"single-quoted string not terminated",
    88  		},
    89  		{
    90  			`foo "bar`,
    91  			"double-quoted string not terminated",
    92  		},
    93  	}
    94  
    95  	for _, test := range tests {
    96  		t.Run("", func(t *testing.T) {
    97  			cmd, args, err := SplitShellArgs(test.data)
    98  			if err == nil {
    99  				t.Fatalf("expected error not found: %v", test.err)
   100  			}
   101  
   102  			if err.Error() != test.err {
   103  				t.Fatalf("expected error not found, want:\n  %q\ngot:\n  %q", test.err, err.Error())
   104  			}
   105  
   106  			if cmd != "" {
   107  				t.Fatalf("splitter returned cmd from invalid data: %v", cmd)
   108  			}
   109  
   110  			if len(args) > 0 {
   111  				t.Fatalf("splitter returned fields from invalid data: %v", args)
   112  			}
   113  		})
   114  	}
   115  }