X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/00d1ef67636df59460bd4e060f6da4b0c9bcb24c..fd4ffd9ed4d78f9f0862bcf45b911f752bfd54b8:/hotline/file_path_test.go diff --git a/hotline/file_path_test.go b/hotline/file_path_test.go index a8ab2ce..effd462 100644 --- a/hotline/file_path_test.go +++ b/hotline/file_path_test.go @@ -1,15 +1,12 @@ package hotline import ( + "fmt" "github.com/stretchr/testify/assert" "testing" ) -func TestFilePath_UnmarshalBinary(t *testing.T) { - type fields struct { - ItemCount []byte - Items []FilePathItem - } +func TestFilePath_Write(t *testing.T) { type args struct { b []byte } @@ -45,12 +42,23 @@ func TestFilePath_UnmarshalBinary(t *testing.T) { }, wantErr: false, }, + { + name: "handles empty data payload", + args: args{b: []byte{ + 0x00, 0x00, + }}, + want: FilePath{ + ItemCount: [2]byte{0x00, 0x00}, + Items: []FilePathItem(nil), + }, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var fp FilePath - if err := fp.UnmarshalBinary(tt.args.b); (err != nil) != tt.wantErr { - t.Errorf("UnmarshalBinary() error = %v, wantErr %v", err, tt.wantErr) + if _, err := fp.Write(tt.args.b); (err != nil) != tt.wantErr { + t.Errorf("Write() error = %v, wantErr %v", err, tt.wantErr) } if !assert.Equal(t, tt.want, fp) { t.Errorf("Read() got = %v, want %v", fp, tt.want) @@ -58,3 +66,176 @@ func TestFilePath_UnmarshalBinary(t *testing.T) { }) } } + +func Test_readPath(t *testing.T) { + type args struct { + fileRoot string + filePath []byte + fileName []byte + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "when filePath is invalid", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: []byte{ + 0x61, + }, + fileName: []byte{ + 0x61, 0x61, 0x61, + }, + }, + want: "", + wantErr: true, + }, + { + name: "when filePath is nil", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: nil, + fileName: []byte("foo"), + }, + want: "/usr/local/var/mobius/Files/foo", + }, + { + name: "when fileName contains .. ", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: nil, + fileName: []byte("../../../foo"), + }, + want: "/usr/local/var/mobius/Files/foo", + }, + { + name: "when filePath contains .. ", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: []byte{ + 0x00, 0x02, + 0x00, 0x00, + 0x03, + 0x2e, 0x2e, 0x2f, + 0x00, 0x00, + 0x08, + 0x41, 0x20, 0x53, 0x75, 0x62, 0x44, 0x69, 0x72, + }, + fileName: []byte("foo"), + }, + want: "/usr/local/var/mobius/Files/A SubDir/foo", + }, + { + name: "when a filePath entry contains .. ", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: []byte{ + 0x00, 0x01, + 0x00, 0x00, + 0x0b, + 0x2e, 0x2e, 0x2f, 0x41, 0x20, 0x53, 0x75, 0x62, 0x44, 0x69, 0x72, + }, + fileName: []byte("foo"), + }, + want: "/usr/local/var/mobius/Files/A SubDir/foo", + }, + { + name: "when filePath and fileName are nil", + args: args{ + fileRoot: "/usr/local/var/mobius/Files", + filePath: nil, + fileName: nil, + }, + want: "/usr/local/var/mobius/Files", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := readPath(tt.args.fileRoot, tt.args.filePath, tt.args.fileName) + if (err != nil) != tt.wantErr { + t.Errorf("readPath() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("readPath() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_fileItemScanner(t *testing.T) { + type args struct { + data []byte + in1 bool + } + tests := []struct { + name string + args args + wantAdvance int + wantToken []byte + wantErr assert.ErrorAssertionFunc + }{ + { + name: "when a full fileItem is provided", + args: args{ + data: []byte{ + 0, 0, + 0x09, + 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + }, + in1: false, + }, + wantAdvance: 12, + wantToken: []byte{ + 0, 0, + 0x09, + 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + }, + wantErr: assert.NoError, + }, + { + name: "when a full fileItem with extra bytes is provided", + args: args{ + data: []byte{ + 0, 0, + 0x09, + 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 1, 1, 1, 1, 1, 1, + }, + in1: false, + }, + wantAdvance: 12, + wantToken: []byte{ + 0, 0, + 0x09, + 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + }, + wantErr: assert.NoError, + }, + { + name: "when insufficient bytes are provided", + args: args{ + data: []byte{ + 0, 0, + }, + in1: false, + }, + wantAdvance: 0, + wantToken: []byte(nil), + wantErr: assert.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotAdvance, gotToken, err := fileItemScanner(tt.args.data, tt.args.in1) + if !tt.wantErr(t, err, fmt.Sprintf("fileItemScanner(%v, %v)", tt.args.data, tt.args.in1)) { + return + } + assert.Equalf(t, tt.wantAdvance, gotAdvance, "fileItemScanner(%v, %v)", tt.args.data, tt.args.in1) + assert.Equalf(t, tt.wantToken, gotToken, "fileItemScanner(%v, %v)", tt.args.data, tt.args.in1) + }) + } +}