6 "github.com/stretchr/testify/assert"
16 func TestHandleSetChatSubject(t *testing.T) {
28 name: "sends chat subject to private chat members",
31 UserName: []byte{0x00, 0x01},
33 PrivateChats: map[uint32]*PrivateChat{
36 ClientConn: map[uint16]*ClientConn{
39 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
45 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
52 Clients: map[uint16]*ClientConn{
55 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
61 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
71 Type: []byte{0, 0x6a},
72 ID: []byte{0, 0, 0, 1},
73 ErrorCode: []byte{0, 0, 0, 0},
75 NewField(fieldChatID, []byte{0, 0, 0, 1}),
76 NewField(fieldChatSubject, []byte("Test Subject")),
82 clientID: &[]byte{0, 1},
85 Type: []byte{0, 0x77},
86 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
87 ErrorCode: []byte{0, 0, 0, 0},
89 NewField(fieldChatID, []byte{0, 0, 0, 1}),
90 NewField(fieldChatSubject, []byte("Test Subject")),
94 clientID: &[]byte{0, 2},
97 Type: []byte{0, 0x77},
98 ID: []byte{0xf0, 0xc5, 0x34, 0x1e}, // Random ID from rand.Seed(1)
99 ErrorCode: []byte{0, 0, 0, 0},
101 NewField(fieldChatID, []byte{0, 0, 0, 1}),
102 NewField(fieldChatSubject, []byte("Test Subject")),
109 for _, tt := range tests {
110 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
112 t.Run(tt.name, func(t *testing.T) {
113 got, err := HandleSetChatSubject(tt.args.cc, tt.args.t)
114 if (err != nil) != tt.wantErr {
115 t.Errorf("HandleSetChatSubject() error = %v, wantErr %v", err, tt.wantErr)
118 if !assert.Equal(t, tt.want, got) {
119 t.Errorf("HandleSetChatSubject() got = %v, want %v", got, tt.want)
125 func TestHandleLeaveChat(t *testing.T) {
137 name: "returns expected transactions",
142 PrivateChats: map[uint32]*PrivateChat{
144 ClientConn: map[uint16]*ClientConn{
147 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
153 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
160 Clients: map[uint16]*ClientConn{
163 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
169 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
176 t: NewTransaction(tranDeleteUser, nil, NewField(fieldChatID, []byte{0, 0, 0, 1})),
180 clientID: &[]byte{0, 1},
183 Type: []byte{0, 0x76},
184 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
185 ErrorCode: []byte{0, 0, 0, 0},
187 NewField(fieldChatID, []byte{0, 0, 0, 1}),
188 NewField(fieldUserID, []byte{0, 2}),
195 for _, tt := range tests {
197 t.Run(tt.name, func(t *testing.T) {
198 got, err := HandleLeaveChat(tt.args.cc, tt.args.t)
199 if (err != nil) != tt.wantErr {
200 t.Errorf("HandleLeaveChat() error = %v, wantErr %v", err, tt.wantErr)
203 if !assert.Equal(t, tt.want, got) {
204 t.Errorf("HandleLeaveChat() got = %v, want %v", got, tt.want)
210 func TestHandleGetUserNameList(t *testing.T) {
222 name: "replies with userlist transaction",
228 Clients: map[uint16]*ClientConn{
232 Flags: &[]byte{0, 3},
233 UserName: []byte{0, 4},
239 Flags: &[]byte{0, 3},
240 UserName: []byte{0, 4},
246 Flags: &[]byte{0, 3},
247 UserName: []byte{0, 4},
254 ID: []byte{0, 0, 0, 1},
260 clientID: &[]byte{1, 1},
264 ID: []byte{0, 0, 0, 1},
265 ErrorCode: []byte{0, 0, 0, 0},
268 fieldUsernameWithInfo,
269 []byte{00, 01, 00, 02, 00, 03, 00, 02, 00, 04},
272 fieldUsernameWithInfo,
273 []byte{00, 02, 00, 02, 00, 03, 00, 02, 00, 04},
281 for _, tt := range tests {
282 t.Run(tt.name, func(t *testing.T) {
283 got, err := HandleGetUserNameList(tt.args.cc, tt.args.t)
284 if (err != nil) != tt.wantErr {
285 t.Errorf("HandleGetUserNameList() error = %v, wantErr %v", err, tt.wantErr)
288 assert.Equal(t, tt.want, got)
293 func TestHandleChatSend(t *testing.T) {
305 name: "sends chat msg transaction to all clients",
309 Access: func() *[]byte {
310 var bits accessBitmap
311 bits.Set(accessSendChat)
316 UserName: []byte{0x00, 0x01},
318 Clients: map[uint16]*ClientConn{
321 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
327 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
336 NewField(fieldData, []byte("hai")),
342 clientID: &[]byte{0, 1},
345 Type: []byte{0, 0x6a},
346 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
347 ErrorCode: []byte{0, 0, 0, 0},
349 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
353 clientID: &[]byte{0, 2},
356 Type: []byte{0, 0x6a},
357 ID: []byte{0xf0, 0xc5, 0x34, 0x1e}, // Random ID from rand.Seed(1)
358 ErrorCode: []byte{0, 0, 0, 0},
360 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
367 name: "when user does not have required permission",
371 Access: func() *[]byte {
372 var bits accessBitmap
378 Accounts: map[string]*Account{},
382 tranChatSend, &[]byte{0, 1},
383 NewField(fieldData, []byte("hai")),
390 Type: []byte{0, 0x00},
391 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
392 ErrorCode: []byte{0, 0, 0, 1},
394 NewField(fieldError, []byte("You are not allowed to participate in chat.")),
401 name: "sends chat msg as emote if fieldChatOptions is set",
405 Access: func() *[]byte {
406 var bits accessBitmap
407 bits.Set(accessSendChat)
412 UserName: []byte("Testy McTest"),
414 Clients: map[uint16]*ClientConn{
417 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
423 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
432 NewField(fieldData, []byte("performed action")),
433 NewField(fieldChatOptions, []byte{0x00, 0x01}),
439 clientID: &[]byte{0, 1},
442 Type: []byte{0, 0x6a},
443 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
444 ErrorCode: []byte{0, 0, 0, 0},
446 NewField(fieldData, []byte("\r*** Testy McTest performed action")),
450 clientID: &[]byte{0, 2},
453 Type: []byte{0, 0x6a},
454 ID: []byte{0xf0, 0xc5, 0x34, 0x1e},
455 ErrorCode: []byte{0, 0, 0, 0},
457 NewField(fieldData, []byte("\r*** Testy McTest performed action")),
464 name: "only sends chat msg to clients with accessReadChat permission",
468 Access: func() *[]byte {
469 var bits accessBitmap
470 bits.Set(accessSendChat)
475 UserName: []byte{0x00, 0x01},
477 Clients: map[uint16]*ClientConn{
480 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
486 Access: &[]byte{0, 0, 0, 0, 0, 0, 0, 0},
495 NewField(fieldData, []byte("hai")),
501 clientID: &[]byte{0, 1},
504 Type: []byte{0, 0x6a},
505 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
506 ErrorCode: []byte{0, 0, 0, 0},
508 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
515 name: "only sends private chat msg to members of private chat",
519 Access: func() *[]byte {
520 var bits accessBitmap
521 bits.Set(accessSendChat)
526 UserName: []byte{0x00, 0x01},
528 PrivateChats: map[uint32]*PrivateChat{
530 ClientConn: map[uint16]*ClientConn{
540 Clients: map[uint16]*ClientConn{
543 Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
549 Access: &[]byte{0, 0, 0, 0, 0, 0, 0, 0},
555 Access: &[]byte{0, 0, 0, 0, 0, 0, 0, 0},
564 NewField(fieldData, []byte("hai")),
565 NewField(fieldChatID, []byte{0, 0, 0, 1}),
571 clientID: &[]byte{0, 1},
574 Type: []byte{0, 0x6a},
575 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
576 ErrorCode: []byte{0, 0, 0, 0},
578 NewField(fieldChatID, []byte{0, 0, 0, 1}),
579 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
583 clientID: &[]byte{0, 2},
586 Type: []byte{0, 0x6a},
587 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
588 ErrorCode: []byte{0, 0, 0, 0},
590 NewField(fieldChatID, []byte{0, 0, 0, 1}),
591 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
598 for _, tt := range tests {
599 t.Run(tt.name, func(t *testing.T) {
600 got, err := HandleChatSend(tt.args.cc, tt.args.t)
602 if (err != nil) != tt.wantErr {
603 t.Errorf("HandleChatSend() error = %v, wantErr %v", err, tt.wantErr)
606 tranAssertEqual(t, tt.want, got)
611 func TestHandleGetFileInfo(t *testing.T) {
612 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
621 wantRes []Transaction
625 name: "returns expected fields when a valid file is requested",
628 ID: &[]byte{0x00, 0x01},
632 FileRoot: func() string {
633 path, _ := os.Getwd()
634 return filepath.Join(path, "/test/config/Files")
640 tranGetFileInfo, nil,
641 NewField(fieldFileName, []byte("testfile.txt")),
642 NewField(fieldFilePath, []byte{0x00, 0x00}),
645 wantRes: []Transaction{
647 clientID: &[]byte{0, 1},
650 Type: []byte{0, 0xce},
651 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
652 ErrorCode: []byte{0, 0, 0, 0},
654 NewField(fieldFileName, []byte("testfile.txt")),
655 NewField(fieldFileTypeString, []byte("Text File")),
656 NewField(fieldFileCreatorString, []byte("ttxt")),
657 NewField(fieldFileComment, []byte{}),
658 NewField(fieldFileType, []byte("TEXT")),
659 NewField(fieldFileCreateDate, make([]byte, 8)),
660 NewField(fieldFileModifyDate, make([]byte, 8)),
661 NewField(fieldFileSize, []byte{0x0, 0x0, 0x0, 0x17}),
668 for _, tt := range tests {
669 t.Run(tt.name, func(t *testing.T) {
670 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
672 gotRes, err := HandleGetFileInfo(tt.args.cc, tt.args.t)
673 if (err != nil) != tt.wantErr {
674 t.Errorf("HandleGetFileInfo() error = %v, wantErr %v", err, tt.wantErr)
678 // Clear the fileWrapper timestamp fields to work around problems running the tests in multiple timezones
679 // TODO: revisit how to test this by mocking the stat calls
680 gotRes[0].Fields[5].Data = make([]byte, 8)
681 gotRes[0].Fields[6].Data = make([]byte, 8)
682 if !assert.Equal(t, tt.wantRes, gotRes) {
683 t.Errorf("HandleGetFileInfo() gotRes = %v, want %v", gotRes, tt.wantRes)
689 func TestHandleNewFolder(t *testing.T) {
697 wantRes []Transaction
701 name: "without required permission",
705 Access: func() *[]byte {
706 var bits accessBitmap
717 wantRes: []Transaction{
721 Type: []byte{0, 0x00},
722 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
723 ErrorCode: []byte{0, 0, 0, 1},
725 NewField(fieldError, []byte("You are not allowed to create folders.")),
732 name: "when path is nested",
736 Access: func() *[]byte {
737 var bits accessBitmap
738 bits.Set(accessCreateFolder)
748 FS: func() *MockFileStore {
749 mfs := &MockFileStore{}
750 mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil)
751 mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist)
757 tranNewFolder, &[]byte{0, 1},
758 NewField(fieldFileName, []byte("testFolder")),
759 NewField(fieldFilePath, []byte{
767 wantRes: []Transaction{
769 clientID: &[]byte{0, 1},
772 Type: []byte{0, 0xcd},
773 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
774 ErrorCode: []byte{0, 0, 0, 0},
780 name: "when path is not nested",
784 Access: func() *[]byte {
785 var bits accessBitmap
786 bits.Set(accessCreateFolder)
796 FS: func() *MockFileStore {
797 mfs := &MockFileStore{}
798 mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil)
799 mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist)
805 tranNewFolder, &[]byte{0, 1},
806 NewField(fieldFileName, []byte("testFolder")),
809 wantRes: []Transaction{
811 clientID: &[]byte{0, 1},
814 Type: []byte{0, 0xcd},
815 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
816 ErrorCode: []byte{0, 0, 0, 0},
822 name: "when UnmarshalBinary returns an err",
826 Access: func() *[]byte {
827 var bits accessBitmap
828 bits.Set(accessCreateFolder)
838 FS: func() *MockFileStore {
839 mfs := &MockFileStore{}
840 mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil)
841 mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist)
847 tranNewFolder, &[]byte{0, 1},
848 NewField(fieldFileName, []byte("testFolder")),
849 NewField(fieldFilePath, []byte{
854 wantRes: []Transaction{},
858 name: "fieldFileName does not allow directory traversal",
862 Access: func() *[]byte {
863 var bits accessBitmap
864 bits.Set(accessCreateFolder)
874 FS: func() *MockFileStore {
875 mfs := &MockFileStore{}
876 mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil)
877 mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist)
883 tranNewFolder, &[]byte{0, 1},
884 NewField(fieldFileName, []byte("../../testFolder")),
887 wantRes: []Transaction{
889 clientID: &[]byte{0, 1},
892 Type: []byte{0, 0xcd},
893 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
894 ErrorCode: []byte{0, 0, 0, 0},
899 name: "fieldFilePath does not allow directory traversal",
903 Access: func() *[]byte {
904 var bits accessBitmap
905 bits.Set(accessCreateFolder)
915 FS: func() *MockFileStore {
916 mfs := &MockFileStore{}
917 mfs.On("Mkdir", "/Files/foo/testFolder", fs.FileMode(0777)).Return(nil)
918 mfs.On("Stat", "/Files/foo/testFolder").Return(nil, os.ErrNotExist)
924 tranNewFolder, &[]byte{0, 1},
925 NewField(fieldFileName, []byte("testFolder")),
926 NewField(fieldFilePath, []byte{
937 wantRes: []Transaction{
939 clientID: &[]byte{0, 1},
942 Type: []byte{0, 0xcd},
943 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
944 ErrorCode: []byte{0, 0, 0, 0},
949 for _, tt := range tests {
950 t.Run(tt.name, func(t *testing.T) {
952 gotRes, err := HandleNewFolder(tt.args.cc, tt.args.t)
953 if (err != nil) != tt.wantErr {
954 t.Errorf("HandleNewFolder() error = %v, wantErr %v", err, tt.wantErr)
958 if !tranAssertEqual(t, tt.wantRes, gotRes) {
959 t.Errorf("HandleNewFolder() gotRes = %v, want %v", gotRes, tt.wantRes)
965 func TestHandleUploadFile(t *testing.T) {
973 wantRes []Transaction
977 name: "when request is valid and user has Upload Anywhere permission",
982 fileTransfers: map[[4]byte]*FileTransfer{},
984 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
986 transfers: map[int]map[[4]byte]*FileTransfer{
990 Access: func() *[]byte {
991 var bits accessBitmap
992 bits.Set(accessUploadFile)
993 bits.Set(accessUploadAnywhere)
1000 tranUploadFile, &[]byte{0, 1},
1001 NewField(fieldFileName, []byte("testFile")),
1002 NewField(fieldFilePath, []byte{
1010 wantRes: []Transaction{
1014 Type: []byte{0, 0xcb},
1015 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1016 ErrorCode: []byte{0, 0, 0, 0},
1018 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}), // rand.Seed(1)
1025 name: "when user does not have required access",
1029 Access: func() *[]byte {
1030 var bits accessBitmap
1037 tranUploadFile, &[]byte{0, 1},
1038 NewField(fieldFileName, []byte("testFile")),
1039 NewField(fieldFilePath, []byte{
1047 wantRes: []Transaction{
1051 Type: []byte{0, 0x00},
1052 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1053 ErrorCode: []byte{0, 0, 0, 1},
1055 NewField(fieldError, []byte("You are not allowed to upload files.")), // rand.Seed(1)
1062 for _, tt := range tests {
1063 t.Run(tt.name, func(t *testing.T) {
1065 gotRes, err := HandleUploadFile(tt.args.cc, tt.args.t)
1066 if (err != nil) != tt.wantErr {
1067 t.Errorf("HandleUploadFile() error = %v, wantErr %v", err, tt.wantErr)
1071 tranAssertEqual(t, tt.wantRes, gotRes)
1077 func TestHandleMakeAlias(t *testing.T) {
1085 wantRes []Transaction
1089 name: "with valid input and required permissions",
1092 logger: NewTestLogger(),
1094 Access: func() *[]byte {
1095 var bits accessBitmap
1096 bits.Set(accessMakeAlias)
1103 FileRoot: func() string {
1104 path, _ := os.Getwd()
1105 return path + "/test/config/Files"
1108 Logger: NewTestLogger(),
1109 FS: func() *MockFileStore {
1110 mfs := &MockFileStore{}
1111 path, _ := os.Getwd()
1114 path+"/test/config/Files/foo/testFile",
1115 path+"/test/config/Files/bar/testFile",
1122 tranMakeFileAlias, &[]byte{0, 1},
1123 NewField(fieldFileName, []byte("testFile")),
1124 NewField(fieldFilePath, EncodeFilePath(strings.Join([]string{"foo"}, "/"))),
1125 NewField(fieldFileNewPath, EncodeFilePath(strings.Join([]string{"bar"}, "/"))),
1128 wantRes: []Transaction{
1132 Type: []byte{0, 0xd1},
1133 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1134 ErrorCode: []byte{0, 0, 0, 0},
1135 Fields: []Field(nil),
1141 name: "when symlink returns an error",
1144 logger: NewTestLogger(),
1146 Access: func() *[]byte {
1147 var bits accessBitmap
1148 bits.Set(accessMakeAlias)
1155 FileRoot: func() string {
1156 path, _ := os.Getwd()
1157 return path + "/test/config/Files"
1160 Logger: NewTestLogger(),
1161 FS: func() *MockFileStore {
1162 mfs := &MockFileStore{}
1163 path, _ := os.Getwd()
1166 path+"/test/config/Files/foo/testFile",
1167 path+"/test/config/Files/bar/testFile",
1168 ).Return(errors.New("ohno"))
1174 tranMakeFileAlias, &[]byte{0, 1},
1175 NewField(fieldFileName, []byte("testFile")),
1176 NewField(fieldFilePath, EncodeFilePath(strings.Join([]string{"foo"}, "/"))),
1177 NewField(fieldFileNewPath, EncodeFilePath(strings.Join([]string{"bar"}, "/"))),
1180 wantRes: []Transaction{
1184 Type: []byte{0, 0x00},
1185 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1186 ErrorCode: []byte{0, 0, 0, 1},
1188 NewField(fieldError, []byte("Error creating alias")),
1195 name: "when user does not have required permission",
1198 logger: NewTestLogger(),
1200 Access: func() *[]byte {
1201 var bits accessBitmap
1208 FileRoot: func() string {
1209 path, _ := os.Getwd()
1210 return path + "/test/config/Files"
1216 tranMakeFileAlias, &[]byte{0, 1},
1217 NewField(fieldFileName, []byte("testFile")),
1218 NewField(fieldFilePath, []byte{
1224 NewField(fieldFileNewPath, []byte{
1232 wantRes: []Transaction{
1236 Type: []byte{0, 0x00},
1237 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1238 ErrorCode: []byte{0, 0, 0, 1},
1240 NewField(fieldError, []byte("You are not allowed to make aliases.")),
1247 for _, tt := range tests {
1248 t.Run(tt.name, func(t *testing.T) {
1249 gotRes, err := HandleMakeAlias(tt.args.cc, tt.args.t)
1250 if (err != nil) != tt.wantErr {
1251 t.Errorf("HandleMakeAlias(%v, %v)", tt.args.cc, tt.args.t)
1255 tranAssertEqual(t, tt.wantRes, gotRes)
1260 func TestHandleGetUser(t *testing.T) {
1268 wantRes []Transaction
1269 wantErr assert.ErrorAssertionFunc
1272 name: "when account is valid",
1276 Access: func() *[]byte {
1277 var bits accessBitmap
1278 bits.Set(accessOpenUser)
1284 Accounts: map[string]*Account{
1288 Password: "password",
1295 tranGetUser, &[]byte{0, 1},
1296 NewField(fieldUserLogin, []byte("guest")),
1299 wantRes: []Transaction{
1303 Type: []byte{0x01, 0x60},
1304 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1305 ErrorCode: []byte{0, 0, 0, 0},
1307 NewField(fieldUserName, []byte("Guest")),
1308 NewField(fieldUserLogin, negateString([]byte("guest"))),
1309 NewField(fieldUserPassword, []byte("password")),
1310 NewField(fieldUserAccess, []byte{1}),
1314 wantErr: assert.NoError,
1317 name: "when user does not have required permission",
1321 Access: func() *[]byte {
1322 var bits accessBitmap
1328 Accounts: map[string]*Account{},
1332 tranGetUser, &[]byte{0, 1},
1333 NewField(fieldUserLogin, []byte("nonExistentUser")),
1336 wantRes: []Transaction{
1340 Type: []byte{0, 0x00},
1341 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1342 ErrorCode: []byte{0, 0, 0, 1},
1344 NewField(fieldError, []byte("You are not allowed to view accounts.")),
1348 wantErr: assert.NoError,
1351 name: "when account does not exist",
1355 Access: func() *[]byte {
1356 var bits accessBitmap
1357 bits.Set(accessOpenUser)
1363 Accounts: map[string]*Account{},
1367 tranGetUser, &[]byte{0, 1},
1368 NewField(fieldUserLogin, []byte("nonExistentUser")),
1371 wantRes: []Transaction{
1375 Type: []byte{0, 0x00},
1376 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1377 ErrorCode: []byte{0, 0, 0, 1},
1379 NewField(fieldError, []byte("Account does not exist.")),
1383 wantErr: assert.NoError,
1386 for _, tt := range tests {
1387 t.Run(tt.name, func(t *testing.T) {
1388 gotRes, err := HandleGetUser(tt.args.cc, tt.args.t)
1389 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetUser(%v, %v)", tt.args.cc, tt.args.t)) {
1393 tranAssertEqual(t, tt.wantRes, gotRes)
1398 func TestHandleDeleteUser(t *testing.T) {
1406 wantRes []Transaction
1407 wantErr assert.ErrorAssertionFunc
1410 name: "when user dataFile",
1414 Access: func() *[]byte {
1415 var bits accessBitmap
1416 bits.Set(accessDeleteUser)
1422 Accounts: map[string]*Account{
1425 Name: "Testy McTest",
1426 Password: "password",
1430 FS: func() *MockFileStore {
1431 mfs := &MockFileStore{}
1432 mfs.On("Remove", "Users/testuser.yaml").Return(nil)
1438 tranDeleteUser, &[]byte{0, 1},
1439 NewField(fieldUserLogin, negateString([]byte("testuser"))),
1442 wantRes: []Transaction{
1446 Type: []byte{0x1, 0x5f},
1447 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1448 ErrorCode: []byte{0, 0, 0, 0},
1449 Fields: []Field(nil),
1452 wantErr: assert.NoError,
1455 name: "when user does not have required permission",
1459 Access: func() *[]byte {
1460 var bits accessBitmap
1466 Accounts: map[string]*Account{},
1470 tranDeleteUser, &[]byte{0, 1},
1471 NewField(fieldUserLogin, negateString([]byte("testuser"))),
1474 wantRes: []Transaction{
1478 Type: []byte{0, 0x00},
1479 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1480 ErrorCode: []byte{0, 0, 0, 1},
1482 NewField(fieldError, []byte("You are not allowed to delete accounts.")),
1486 wantErr: assert.NoError,
1489 for _, tt := range tests {
1490 t.Run(tt.name, func(t *testing.T) {
1491 gotRes, err := HandleDeleteUser(tt.args.cc, tt.args.t)
1492 if !tt.wantErr(t, err, fmt.Sprintf("HandleDeleteUser(%v, %v)", tt.args.cc, tt.args.t)) {
1496 tranAssertEqual(t, tt.wantRes, gotRes)
1501 func TestHandleGetMsgs(t *testing.T) {
1509 wantRes []Transaction
1510 wantErr assert.ErrorAssertionFunc
1513 name: "returns news data",
1517 Access: func() *[]byte {
1518 var bits accessBitmap
1519 bits.Set(accessNewsReadArt)
1525 FlatNews: []byte("TEST"),
1529 tranGetMsgs, &[]byte{0, 1},
1532 wantRes: []Transaction{
1536 Type: []byte{0, 0x65},
1537 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1538 ErrorCode: []byte{0, 0, 0, 0},
1540 NewField(fieldData, []byte("TEST")),
1544 wantErr: assert.NoError,
1547 name: "when user does not have required permission",
1551 Access: func() *[]byte {
1552 var bits accessBitmap
1558 Accounts: map[string]*Account{},
1562 tranGetMsgs, &[]byte{0, 1},
1565 wantRes: []Transaction{
1569 Type: []byte{0, 0x00},
1570 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1571 ErrorCode: []byte{0, 0, 0, 1},
1573 NewField(fieldError, []byte("You are not allowed to read news.")),
1577 wantErr: assert.NoError,
1580 for _, tt := range tests {
1581 t.Run(tt.name, func(t *testing.T) {
1582 gotRes, err := HandleGetMsgs(tt.args.cc, tt.args.t)
1583 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetMsgs(%v, %v)", tt.args.cc, tt.args.t)) {
1587 tranAssertEqual(t, tt.wantRes, gotRes)
1592 func TestHandleNewUser(t *testing.T) {
1600 wantRes []Transaction
1601 wantErr assert.ErrorAssertionFunc
1604 name: "when user does not have required permission",
1608 Access: func() *[]byte {
1609 var bits accessBitmap
1615 Accounts: map[string]*Account{},
1619 tranNewUser, &[]byte{0, 1},
1622 wantRes: []Transaction{
1626 Type: []byte{0, 0x00},
1627 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1628 ErrorCode: []byte{0, 0, 0, 1},
1630 NewField(fieldError, []byte("You are not allowed to create new accounts.")),
1634 wantErr: assert.NoError,
1637 for _, tt := range tests {
1638 t.Run(tt.name, func(t *testing.T) {
1639 gotRes, err := HandleNewUser(tt.args.cc, tt.args.t)
1640 if !tt.wantErr(t, err, fmt.Sprintf("HandleNewUser(%v, %v)", tt.args.cc, tt.args.t)) {
1644 tranAssertEqual(t, tt.wantRes, gotRes)
1649 func TestHandleListUsers(t *testing.T) {
1657 wantRes []Transaction
1658 wantErr assert.ErrorAssertionFunc
1661 name: "when user does not have required permission",
1665 Access: func() *[]byte {
1666 var bits accessBitmap
1672 Accounts: map[string]*Account{},
1676 tranNewUser, &[]byte{0, 1},
1679 wantRes: []Transaction{
1683 Type: []byte{0, 0x00},
1684 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1685 ErrorCode: []byte{0, 0, 0, 1},
1687 NewField(fieldError, []byte("You are not allowed to view accounts.")),
1691 wantErr: assert.NoError,
1694 for _, tt := range tests {
1695 t.Run(tt.name, func(t *testing.T) {
1696 gotRes, err := HandleListUsers(tt.args.cc, tt.args.t)
1697 if !tt.wantErr(t, err, fmt.Sprintf("HandleListUsers(%v, %v)", tt.args.cc, tt.args.t)) {
1701 tranAssertEqual(t, tt.wantRes, gotRes)
1706 func TestHandleDownloadFile(t *testing.T) {
1714 wantRes []Transaction
1715 wantErr assert.ErrorAssertionFunc
1718 name: "when user does not have required permission",
1722 Access: func() *[]byte {
1723 var bits accessBitmap
1730 t: NewTransaction(tranDownloadFile, &[]byte{0, 1}),
1732 wantRes: []Transaction{
1736 Type: []byte{0, 0x00},
1737 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1738 ErrorCode: []byte{0, 0, 0, 1},
1740 NewField(fieldError, []byte("You are not allowed to download files.")),
1744 wantErr: assert.NoError,
1747 name: "with a valid file",
1750 transfers: map[int]map[[4]byte]*FileTransfer{
1754 Access: func() *[]byte {
1755 var bits accessBitmap
1756 bits.Set(accessDownloadFile)
1763 fileTransfers: map[[4]byte]*FileTransfer{},
1765 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
1767 Accounts: map[string]*Account{},
1773 NewField(fieldFileName, []byte("testfile.txt")),
1774 NewField(fieldFilePath, []byte{0x0, 0x00}),
1777 wantRes: []Transaction{
1781 Type: []byte{0, 0x2},
1782 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1783 ErrorCode: []byte{0, 0, 0, 0},
1785 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}),
1786 NewField(fieldWaitingCount, []byte{0x00, 0x00}),
1787 NewField(fieldTransferSize, []byte{0x00, 0x00, 0x00, 0xa5}),
1788 NewField(fieldFileSize, []byte{0x00, 0x00, 0x00, 0x17}),
1792 wantErr: assert.NoError,
1795 name: "when client requests to resume 1k test file at offset 256",
1798 transfers: map[int]map[[4]byte]*FileTransfer{
1800 }, Account: &Account{
1801 Access: func() *[]byte {
1802 var bits accessBitmap
1803 bits.Set(accessDownloadFile)
1811 // FS: func() *MockFileStore {
1812 // path, _ := os.Getwd()
1813 // testFile, err := os.Open(path + "/test/config/Files/testfile-1k")
1818 // mfi := &MockFileInfo{}
1819 // mfi.On("Mode").Return(fs.FileMode(0))
1820 // mfs := &MockFileStore{}
1821 // mfs.On("Stat", "/fakeRoot/Files/testfile.txt").Return(mfi, nil)
1822 // mfs.On("Open", "/fakeRoot/Files/testfile.txt").Return(testFile, nil)
1823 // mfs.On("Stat", "/fakeRoot/Files/.info_testfile.txt").Return(nil, errors.New("no"))
1824 // mfs.On("Stat", "/fakeRoot/Files/.rsrc_testfile.txt").Return(nil, errors.New("no"))
1828 fileTransfers: map[[4]byte]*FileTransfer{},
1830 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
1832 Accounts: map[string]*Account{},
1838 NewField(fieldFileName, []byte("testfile-1k")),
1839 NewField(fieldFilePath, []byte{0x00, 0x00}),
1841 fieldFileResumeData,
1843 frd := FileResumeData{
1847 ForkCount: [2]byte{0, 2},
1848 ForkInfoList: []ForkInfoList{
1850 Fork: [4]byte{0x44, 0x41, 0x54, 0x41}, // "DATA"
1851 DataSize: [4]byte{0, 0, 0x01, 0x00}, // request offset 256
1856 Fork: [4]byte{0x4d, 0x41, 0x43, 0x52}, // "MACR"
1857 DataSize: [4]byte{0, 0, 0, 0},
1863 b, _ := frd.BinaryMarshal()
1869 wantRes: []Transaction{
1873 Type: []byte{0, 0x2},
1874 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1875 ErrorCode: []byte{0, 0, 0, 0},
1877 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}),
1878 NewField(fieldWaitingCount, []byte{0x00, 0x00}),
1879 NewField(fieldTransferSize, []byte{0x00, 0x00, 0x03, 0x8d}),
1880 NewField(fieldFileSize, []byte{0x00, 0x00, 0x03, 0x00}),
1884 wantErr: assert.NoError,
1887 for _, tt := range tests {
1888 t.Run(tt.name, func(t *testing.T) {
1889 gotRes, err := HandleDownloadFile(tt.args.cc, tt.args.t)
1890 if !tt.wantErr(t, err, fmt.Sprintf("HandleDownloadFile(%v, %v)", tt.args.cc, tt.args.t)) {
1894 tranAssertEqual(t, tt.wantRes, gotRes)
1899 func TestHandleUpdateUser(t *testing.T) {
1907 wantRes []Transaction
1908 wantErr assert.ErrorAssertionFunc
1911 name: "when action is create user without required permission",
1914 logger: NewTestLogger(),
1916 Logger: NewTestLogger(),
1919 Access: func() *[]byte {
1920 var bits accessBitmap
1929 NewField(fieldData, []byte{
1930 0x00, 0x04, // field count
1932 0x00, 0x69, // fieldUserLogin = 105
1936 0x00, 0x6a, // fieldUserPassword = 106
1940 0x00, 0x66, // fieldUserName = 102
1944 0x00, 0x6e, // fieldUserAccess = 110
1946 0x60, 0x70, 0x0c, 0x20, 0x03, 0x80, 0x00, 0x00,
1950 wantRes: []Transaction{
1954 Type: []byte{0, 0x00},
1955 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1956 ErrorCode: []byte{0, 0, 0, 1},
1958 NewField(fieldError, []byte("You are not allowed to create new accounts.")),
1962 wantErr: assert.NoError,
1965 name: "when action is modify user without required permission",
1968 logger: NewTestLogger(),
1970 Logger: NewTestLogger(),
1971 Accounts: map[string]*Account{
1976 Access: func() *[]byte {
1977 var bits accessBitmap
1986 NewField(fieldData, []byte{
1987 0x00, 0x04, // field count
1989 0x00, 0x69, // fieldUserLogin = 105
1993 0x00, 0x6a, // fieldUserPassword = 106
1997 0x00, 0x66, // fieldUserName = 102
2001 0x00, 0x6e, // fieldUserAccess = 110
2003 0x60, 0x70, 0x0c, 0x20, 0x03, 0x80, 0x00, 0x00,
2007 wantRes: []Transaction{
2011 Type: []byte{0, 0x00},
2012 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2013 ErrorCode: []byte{0, 0, 0, 1},
2015 NewField(fieldError, []byte("You are not allowed to modify accounts.")),
2019 wantErr: assert.NoError,
2022 name: "when action is delete user without required permission",
2025 logger: NewTestLogger(),
2027 Accounts: map[string]*Account{
2032 Access: func() *[]byte {
2033 var bits accessBitmap
2042 NewField(fieldData, []byte{
2050 wantRes: []Transaction{
2054 Type: []byte{0, 0x00},
2055 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2056 ErrorCode: []byte{0, 0, 0, 1},
2058 NewField(fieldError, []byte("You are not allowed to delete accounts.")),
2062 wantErr: assert.NoError,
2065 for _, tt := range tests {
2066 t.Run(tt.name, func(t *testing.T) {
2067 gotRes, err := HandleUpdateUser(tt.args.cc, tt.args.t)
2068 if !tt.wantErr(t, err, fmt.Sprintf("HandleUpdateUser(%v, %v)", tt.args.cc, tt.args.t)) {
2072 tranAssertEqual(t, tt.wantRes, gotRes)
2077 func TestHandleDelNewsArt(t *testing.T) {
2085 wantRes []Transaction
2086 wantErr assert.ErrorAssertionFunc
2089 name: "without required permission",
2093 Access: func() *[]byte {
2094 var bits accessBitmap
2105 wantRes: []Transaction{
2109 Type: []byte{0, 0x00},
2110 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2111 ErrorCode: []byte{0, 0, 0, 1},
2113 NewField(fieldError, []byte("You are not allowed to delete news articles.")),
2117 wantErr: assert.NoError,
2120 for _, tt := range tests {
2121 t.Run(tt.name, func(t *testing.T) {
2122 gotRes, err := HandleDelNewsArt(tt.args.cc, tt.args.t)
2123 if !tt.wantErr(t, err, fmt.Sprintf("HandleDelNewsArt(%v, %v)", tt.args.cc, tt.args.t)) {
2126 tranAssertEqual(t, tt.wantRes, gotRes)
2131 func TestHandleDisconnectUser(t *testing.T) {
2139 wantRes []Transaction
2140 wantErr assert.ErrorAssertionFunc
2143 name: "without required permission",
2147 Access: func() *[]byte {
2148 var bits accessBitmap
2159 wantRes: []Transaction{
2163 Type: []byte{0, 0x00},
2164 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2165 ErrorCode: []byte{0, 0, 0, 1},
2167 NewField(fieldError, []byte("You are not allowed to disconnect users.")),
2171 wantErr: assert.NoError,
2174 name: "when target user has 'cannot be disconnected' priv",
2178 Clients: map[uint16]*ClientConn{
2182 Access: func() *[]byte {
2183 var bits accessBitmap
2184 bits.Set(accessCannotBeDiscon)
2193 Access: func() *[]byte {
2194 var bits accessBitmap
2195 bits.Set(accessDisconUser)
2204 NewField(fieldUserID, []byte{0, 1}),
2207 wantRes: []Transaction{
2211 Type: []byte{0, 0x00},
2212 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2213 ErrorCode: []byte{0, 0, 0, 1},
2215 NewField(fieldError, []byte("unnamed is not allowed to be disconnected.")),
2219 wantErr: assert.NoError,
2222 for _, tt := range tests {
2223 t.Run(tt.name, func(t *testing.T) {
2224 gotRes, err := HandleDisconnectUser(tt.args.cc, tt.args.t)
2225 if !tt.wantErr(t, err, fmt.Sprintf("HandleDisconnectUser(%v, %v)", tt.args.cc, tt.args.t)) {
2228 tranAssertEqual(t, tt.wantRes, gotRes)
2233 func TestHandleSendInstantMsg(t *testing.T) {
2241 wantRes []Transaction
2242 wantErr assert.ErrorAssertionFunc
2245 name: "when client 1 sends a message to client 2",
2249 UserName: []byte("User1"),
2251 Clients: map[uint16]*ClientConn{
2253 AutoReply: []byte(nil),
2261 NewField(fieldData, []byte("hai")),
2262 NewField(fieldUserID, []byte{0, 2}),
2265 wantRes: []Transaction{
2269 NewField(fieldData, []byte("hai")),
2270 NewField(fieldUserName, []byte("User1")),
2271 NewField(fieldUserID, []byte{0, 1}),
2272 NewField(fieldOptions, []byte{0, 1}),
2275 clientID: &[]byte{0, 1},
2278 Type: []byte{0x0, 0x6c},
2279 ID: []byte{0, 0, 0, 0},
2280 ErrorCode: []byte{0, 0, 0, 0},
2281 Fields: []Field(nil),
2284 wantErr: assert.NoError,
2287 name: "when client 2 has autoreply enabled",
2291 UserName: []byte("User1"),
2293 Clients: map[uint16]*ClientConn{
2296 UserName: []byte("User2"),
2297 AutoReply: []byte("autohai"),
2305 NewField(fieldData, []byte("hai")),
2306 NewField(fieldUserID, []byte{0, 2}),
2309 wantRes: []Transaction{
2313 NewField(fieldData, []byte("hai")),
2314 NewField(fieldUserName, []byte("User1")),
2315 NewField(fieldUserID, []byte{0, 1}),
2316 NewField(fieldOptions, []byte{0, 1}),
2321 NewField(fieldData, []byte("autohai")),
2322 NewField(fieldUserName, []byte("User2")),
2323 NewField(fieldUserID, []byte{0, 2}),
2324 NewField(fieldOptions, []byte{0, 1}),
2327 clientID: &[]byte{0, 1},
2330 Type: []byte{0x0, 0x6c},
2331 ID: []byte{0, 0, 0, 0},
2332 ErrorCode: []byte{0, 0, 0, 0},
2333 Fields: []Field(nil),
2336 wantErr: assert.NoError,
2339 for _, tt := range tests {
2340 t.Run(tt.name, func(t *testing.T) {
2341 gotRes, err := HandleSendInstantMsg(tt.args.cc, tt.args.t)
2342 if !tt.wantErr(t, err, fmt.Sprintf("HandleSendInstantMsg(%v, %v)", tt.args.cc, tt.args.t)) {
2346 tranAssertEqual(t, tt.wantRes, gotRes)
2351 func TestHandleDeleteFile(t *testing.T) {
2359 wantRes []Transaction
2360 wantErr assert.ErrorAssertionFunc
2363 name: "when user does not have required permission to delete a folder",
2367 Access: func() *[]byte {
2368 var bits accessBitmap
2375 FileRoot: func() string {
2376 return "/fakeRoot/Files"
2379 FS: func() *MockFileStore {
2380 mfi := &MockFileInfo{}
2381 mfi.On("Mode").Return(fs.FileMode(0))
2382 mfi.On("Size").Return(int64(100))
2383 mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout))
2384 mfi.On("IsDir").Return(false)
2385 mfi.On("Name").Return("testfile")
2387 mfs := &MockFileStore{}
2388 mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil)
2389 mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err"))
2390 mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err"))
2394 Accounts: map[string]*Account{},
2398 tranDeleteFile, &[]byte{0, 1},
2399 NewField(fieldFileName, []byte("testfile")),
2400 NewField(fieldFilePath, []byte{
2408 wantRes: []Transaction{
2412 Type: []byte{0, 0x00},
2413 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2414 ErrorCode: []byte{0, 0, 0, 1},
2416 NewField(fieldError, []byte("You are not allowed to delete files.")),
2420 wantErr: assert.NoError,
2423 name: "deletes all associated metadata files",
2427 Access: func() *[]byte {
2428 var bits accessBitmap
2429 bits.Set(accessDeleteFile)
2436 FileRoot: func() string {
2437 return "/fakeRoot/Files"
2440 FS: func() *MockFileStore {
2441 mfi := &MockFileInfo{}
2442 mfi.On("Mode").Return(fs.FileMode(0))
2443 mfi.On("Size").Return(int64(100))
2444 mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout))
2445 mfi.On("IsDir").Return(false)
2446 mfi.On("Name").Return("testfile")
2448 mfs := &MockFileStore{}
2449 mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil)
2450 mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err"))
2451 mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err"))
2453 mfs.On("RemoveAll", "/fakeRoot/Files/aaa/testfile").Return(nil)
2454 mfs.On("Remove", "/fakeRoot/Files/aaa/testfile.incomplete").Return(nil)
2455 mfs.On("Remove", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil)
2456 mfs.On("Remove", "/fakeRoot/Files/aaa/.info_testfile").Return(nil)
2460 Accounts: map[string]*Account{},
2464 tranDeleteFile, &[]byte{0, 1},
2465 NewField(fieldFileName, []byte("testfile")),
2466 NewField(fieldFilePath, []byte{
2474 wantRes: []Transaction{
2478 Type: []byte{0x0, 0xcc},
2479 ID: []byte{0x0, 0x0, 0x0, 0x0},
2480 ErrorCode: []byte{0, 0, 0, 0},
2481 Fields: []Field(nil),
2484 wantErr: assert.NoError,
2487 for _, tt := range tests {
2488 t.Run(tt.name, func(t *testing.T) {
2489 gotRes, err := HandleDeleteFile(tt.args.cc, tt.args.t)
2490 if !tt.wantErr(t, err, fmt.Sprintf("HandleDeleteFile(%v, %v)", tt.args.cc, tt.args.t)) {
2494 tranAssertEqual(t, tt.wantRes, gotRes)
2496 tt.args.cc.Server.FS.(*MockFileStore).AssertExpectations(t)
2501 func TestHandleGetFileNameList(t *testing.T) {
2509 wantRes []Transaction
2510 wantErr assert.ErrorAssertionFunc
2513 name: "when fieldFilePath is a drop box, but user does not have accessViewDropBoxes ",
2517 Access: func() *[]byte {
2518 var bits accessBitmap
2526 FileRoot: func() string {
2527 path, _ := os.Getwd()
2528 return filepath.Join(path, "/test/config/Files/getFileNameListTestDir")
2534 tranGetFileNameList, &[]byte{0, 1},
2535 NewField(fieldFilePath, []byte{
2539 0x64, 0x72, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x78, // "drop box"
2543 wantRes: []Transaction{
2547 Type: []byte{0, 0x00},
2548 ID: []byte{0, 0, 0, 0},
2549 ErrorCode: []byte{0, 0, 0, 1},
2551 NewField(fieldError, []byte("You are not allowed to view drop boxes.")),
2555 wantErr: assert.NoError,
2558 name: "with file root",
2563 FileRoot: func() string {
2564 path, _ := os.Getwd()
2565 return filepath.Join(path, "/test/config/Files/getFileNameListTestDir")
2571 tranGetFileNameList, &[]byte{0, 1},
2572 NewField(fieldFilePath, []byte{
2578 wantRes: []Transaction{
2582 Type: []byte{0, 0xc8},
2583 ID: []byte{0, 0, 0, 0},
2584 ErrorCode: []byte{0, 0, 0, 0},
2587 fieldFileNameWithInfo,
2589 fnwi := FileNameWithInfo{
2590 fileNameWithInfoHeader: fileNameWithInfoHeader{
2591 Type: [4]byte{0x54, 0x45, 0x58, 0x54},
2592 Creator: [4]byte{0x54, 0x54, 0x58, 0x54},
2593 FileSize: [4]byte{0, 0, 0x04, 0},
2595 NameScript: [2]byte{},
2596 NameSize: [2]byte{0, 0x0b},
2598 name: []byte("testfile-1k"),
2600 b, _ := fnwi.MarshalBinary()
2607 wantErr: assert.NoError,
2610 for _, tt := range tests {
2611 t.Run(tt.name, func(t *testing.T) {
2612 gotRes, err := HandleGetFileNameList(tt.args.cc, tt.args.t)
2613 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetFileNameList(%v, %v)", tt.args.cc, tt.args.t)) {
2617 tranAssertEqual(t, tt.wantRes, gotRes)
2622 func TestHandleGetClientInfoText(t *testing.T) {
2630 wantRes []Transaction
2631 wantErr assert.ErrorAssertionFunc
2634 name: "when user does not have required permission",
2638 Access: func() *[]byte {
2639 var bits accessBitmap
2645 Accounts: map[string]*Account{},
2649 tranGetClientInfoText, &[]byte{0, 1},
2650 NewField(fieldUserID, []byte{0, 1}),
2653 wantRes: []Transaction{
2657 Type: []byte{0, 0x00},
2658 ID: []byte{0, 0, 0, 0},
2659 ErrorCode: []byte{0, 0, 0, 1},
2661 NewField(fieldError, []byte("You are not allowed to get client info.")),
2665 wantErr: assert.NoError,
2668 name: "with a valid user",
2671 UserName: []byte("Testy McTest"),
2672 RemoteAddr: "1.2.3.4:12345",
2674 Access: func() *[]byte {
2675 var bits accessBitmap
2676 bits.Set(accessGetClientInfo)
2684 Accounts: map[string]*Account{},
2685 Clients: map[uint16]*ClientConn{
2687 UserName: []byte("Testy McTest"),
2688 RemoteAddr: "1.2.3.4:12345",
2690 Access: func() *[]byte {
2691 var bits accessBitmap
2692 bits.Set(accessGetClientInfo)
2702 transfers: map[int]map[[4]byte]*FileTransfer{
2710 tranGetClientInfoText, &[]byte{0, 1},
2711 NewField(fieldUserID, []byte{0, 1}),
2714 wantRes: []Transaction{
2718 Type: []byte{0x1, 0x2f},
2719 ID: []byte{0, 0, 0, 0},
2720 ErrorCode: []byte{0, 0, 0, 0},
2722 NewField(fieldData, []byte(
2723 strings.Replace(`Nickname: Testy McTest
2726 Address: 1.2.3.4:12345
2728 -------- File Downloads ---------
2732 ------- Folder Downloads --------
2736 --------- File Uploads ----------
2740 -------- Folder Uploads ---------
2744 ------- Waiting Downloads -------
2748 `, "\n", "\r", -1)),
2750 NewField(fieldUserName, []byte("Testy McTest")),
2754 wantErr: assert.NoError,
2757 for _, tt := range tests {
2758 t.Run(tt.name, func(t *testing.T) {
2759 gotRes, err := HandleGetClientInfoText(tt.args.cc, tt.args.t)
2760 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetClientInfoText(%v, %v)", tt.args.cc, tt.args.t)) {
2763 tranAssertEqual(t, tt.wantRes, gotRes)