22
33#include " orbis/UserService.h"
44
5+ #include < CppUTest/TestHarness.h>
56#include < chrono>
67#include < cstring>
78#include < filesystem>
89#include < sstream>
910#include < string>
1011#include < vector>
1112
12- namespace FS_Test {
13-
1413std::vector<u32 > read_sizes {// 8
1514 7 , 8 , 9 ,
1615 // 16
@@ -37,7 +36,6 @@ std::vector<u32> read_sizes {// 8
3736 2137 , 21 , 37 , 69 , 420 , 42 , 123 , 222 , 666 , 911 , 112 , 997 ,
3837 // something for zoomers
3938 67 };
40- std::vector<u32 > read_sizes_pfs {65535 , 65536 , 65537 };
4139std::vector<u16 > read_offsets {0 , 1 , 5 , 10 , 21 , 37 , 127 , 128 , 129 , 400 , 500 , 512 , 768 , 1024 , 111 , 666 , 420 , 1234 , 96 , 42 };
4240
4341namespace fs = std::filesystem;
@@ -47,9 +45,170 @@ bool DumpByRead(int dir_fd, int dump_fd, char* buffer, size_t size);
4745bool DumpByDirent (int dir_fd, int dump_fd, char * buffer, size_t size, s64* idx);
4846void DumpDirectory (int fd, int buffer_size, s64 offset, bool is_pfs = false );
4947
48+ TEST_GROUP (DirentTests) {
49+ void setup () {}
50+ void teardown () {}
51+ };
52+
53+ TEST (DirentTests, LseekRegularTests) {
54+ int fd = sceKernelOpen (" /data/enderman" , O_DIRECTORY | O_RDONLY, 0777 );
55+ CHECK_COMPARE_TEXT (fd, >, 0 , " Unable to open /data/enderman" );
56+
57+ int status;
58+
59+ errno = 0 ;
60+ status = sceKernelLseek (fd, 0 , 0 );
61+ UNSIGNED_LONGLONGS_EQUAL_TEXT (0 , status, " START+0" );
62+ UNSIGNED_INT_EQUALS (0 , errno);
63+
64+ errno = 0 ;
65+ status = sceKernelLseek (fd, -123 , 0 );
66+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " START-123" );
67+ UNSIGNED_INT_EQUALS (EINVAL, errno);
68+
69+ errno = 0 ;
70+ status = sceKernelLseek (fd, 123456 , 0 );
71+ UNSIGNED_LONGLONGS_EQUAL_TEXT (123456 , status, " START+123456" );
72+ UNSIGNED_INT_EQUALS (0 , errno);
73+
74+ errno = 0 ;
75+ status = sceKernelLseek (fd, 60 , 0 );
76+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " START+60" );
77+ UNSIGNED_INT_EQUALS (0 , errno);
78+
79+ errno = 0 ;
80+ status = sceKernelLseek (fd, 0 , 1 );
81+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " CUR+0" );
82+ UNSIGNED_INT_EQUALS (0 , errno);
83+
84+ errno = 0 ;
85+ status = sceKernelLseek (fd, 24 , 1 );
86+ UNSIGNED_LONGLONGS_EQUAL_TEXT (84 , status, " CUR+24" );
87+ UNSIGNED_INT_EQUALS (0 , errno);
88+
89+ errno = 0 ;
90+ status = sceKernelLseek (fd, -24 , 1 );
91+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " CUR-24" );
92+ UNSIGNED_INT_EQUALS (EINVAL, errno);
93+
94+ errno = 0 ;
95+ status = sceKernelLseek (fd, -6666 , 1 );
96+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " CUR-6666" );
97+ UNSIGNED_INT_EQUALS (EINVAL, errno);
98+
99+ errno = 0 ;
100+ status = sceKernelLseek (fd, 123456 , 1 );
101+ UNSIGNED_LONGLONGS_EQUAL_TEXT (123516 , status, " CUR+123456" );
102+ UNSIGNED_INT_EQUALS (0 , errno);
103+
104+ errno = 0 ;
105+ status = sceKernelLseek (fd, 0 , 2 );
106+ UNSIGNED_LONGLONGS_EQUAL_TEXT (2048 , status, " END+0" );
107+ UNSIGNED_INT_EQUALS (0 , errno);
108+
109+ errno = 0 ;
110+ status = sceKernelLseek (fd, 123456 , 2 );
111+ UNSIGNED_LONGLONGS_EQUAL_TEXT (125504 , status, " END+123456" );
112+ UNSIGNED_INT_EQUALS (0 , errno);
113+
114+ errno = 0 ;
115+ status = sceKernelLseek (fd, 100 , 2 );
116+ UNSIGNED_LONGLONGS_EQUAL_TEXT (2148 , status, " END+100" );
117+ UNSIGNED_INT_EQUALS (0 , errno);
118+
119+ errno = 0 ;
120+ status = sceKernelLseek (fd, -100 , 2 );
121+ UNSIGNED_LONGLONGS_EQUAL_TEXT (1948 , status, " END-100" );
122+ UNSIGNED_INT_EQUALS (EINVAL, errno);
123+
124+ errno = 0 ;
125+ status = sceKernelLseek (fd, -100000 , 2 );
126+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " END-100000" );
127+ UNSIGNED_INT_EQUALS (EINVAL, errno);
128+
129+ sceKernelClose (fd);
130+ }
131+
132+ TEST (DirentTests, LseekPFSTests) {
133+ int fd = sceKernelOpen (" /app0/assets/misc" , O_DIRECTORY | O_RDONLY, 0777 );
134+ CHECK_COMPARE_TEXT (fd, >, 0 , " Unable to open /app0/assets/misc" );
135+
136+ s64 status;
137+
138+ errno = 0 ;
139+ status = sceKernelLseek (fd, 0 , 0 );
140+ UNSIGNED_LONGLONGS_EQUAL_TEXT (0 , status, " START+0" );
141+ UNSIGNED_INT_EQUALS (0 , errno);
142+
143+ errno = 0 ;
144+ status = sceKernelLseek (fd, -123 , 0 );
145+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " START-123" );
146+ UNSIGNED_INT_EQUALS (EINVAL, errno);
147+
148+ errno = 0 ;
149+ status = sceKernelLseek (fd, 123456 , 0 );
150+ UNSIGNED_LONGLONGS_EQUAL_TEXT (123456 , status, " START+123456" );
151+ UNSIGNED_INT_EQUALS (0 , errno);
152+
153+ errno = 0 ;
154+ status = sceKernelLseek (fd, 60 , 0 );
155+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " START+60" );
156+ UNSIGNED_INT_EQUALS (0 , errno);
157+
158+ errno = 0 ;
159+ status = sceKernelLseek (fd, 0 , 1 );
160+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " CUR+0" );
161+ UNSIGNED_INT_EQUALS (0 , errno);
162+
163+ errno = 0 ;
164+ status = sceKernelLseek (fd, 24 , 1 );
165+ UNSIGNED_LONGLONGS_EQUAL_TEXT (84 , status, " CUR+24" );
166+ UNSIGNED_INT_EQUALS (0 , errno);
167+
168+ errno = 0 ;
169+ status = sceKernelLseek (fd, -24 , 1 );
170+ UNSIGNED_LONGLONGS_EQUAL_TEXT (60 , status, " CUR-24" );
171+ UNSIGNED_INT_EQUALS (EINVAL, errno);
172+
173+ errno = 0 ;
174+ status = sceKernelLseek (fd, -6666 , 1 );
175+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " CUR-6666" );
176+ UNSIGNED_INT_EQUALS (EINVAL, errno);
177+
178+ errno = 0 ;
179+ status = sceKernelLseek (fd, 123456 , 1 );
180+ UNSIGNED_LONGLONGS_EQUAL_TEXT (123516 , status, " CUR+123456" );
181+ UNSIGNED_INT_EQUALS (0 , errno);
182+
183+ errno = 0 ;
184+ status = sceKernelLseek (fd, 0 , 2 );
185+ UNSIGNED_LONGLONGS_EQUAL_TEXT (2048 , status, " END+0" );
186+ UNSIGNED_INT_EQUALS (0 , errno);
187+
188+ errno = 0 ;
189+ status = sceKernelLseek (fd, 123456 , 2 );
190+ UNSIGNED_LONGLONGS_EQUAL_TEXT (125504 , status, " END+123456" );
191+ UNSIGNED_INT_EQUALS (0 , errno);
192+
193+ errno = 0 ;
194+ status = sceKernelLseek (fd, 100 , 2 );
195+ UNSIGNED_LONGLONGS_EQUAL_TEXT (2148 , status, " END+100" );
196+ UNSIGNED_INT_EQUALS (0 , errno);
197+
198+ errno = 0 ;
199+ status = sceKernelLseek (fd, -100 , 2 );
200+ UNSIGNED_LONGLONGS_EQUAL_TEXT (1948 , status, " END-100" );
201+ UNSIGNED_INT_EQUALS (EINVAL, errno);
202+
203+ errno = 0 ;
204+ status = sceKernelLseek (fd, -100000 , 2 );
205+ UNSIGNED_LONGLONGS_EQUAL_TEXT (ORBIS_KERNEL_ERROR_EINVAL, status, " END-100000" );
206+ UNSIGNED_INT_EQUALS (EINVAL, errno);
207+
208+ sceKernelClose (fd);
209+ }
210+
50211void RunTests () {
51- RegenerateDir (" /data/enderman" );
52- sceKernelMkdir (" /data/enderman/dumps" , 0777 );
53212 std::string nf_path = " /data/enderman/filewithaverylongname" ;
54213 char nf_num[4 ] {0 };
55214 for (u8 idx = 1 ; idx <= 50 ; idx++) {
@@ -62,59 +221,22 @@ void RunTests() {
62221 Log (" ---------------------" );
63222
64223 int fd = sceKernelOpen (" /data/enderman" , O_DIRECTORY | O_RDONLY, 0777 );
65- Log (" Directory opened with fd=" , fd);
66-
67- Log (" LSeek START+0=" , sceKernelLseek (fd, 0 , 0 ));
68- Log (" LSeek START-123=" , sceKernelLseek (fd, -123 , 0 ));
69- Log (" LSeek START+123456=" , sceKernelLseek (fd, 123456 , 0 ));
70- Log (" LSeek START+60=" , sceKernelLseek (fd, 60 , 0 ));
71- Log (" LSeek CUR+0=" , sceKernelLseek (fd, 0 , 1 ));
72- Log (" LSeek CUR+24=" , sceKernelLseek (fd, 24 , 1 ));
73- Log (" LSeek CUR-24=" , sceKernelLseek (fd, -24 , 1 ));
74- Log (" LSeek CUR-6666=" , sceKernelLseek (fd, -6666 , 1 ));
75- Log (" LSeek CUR+123456=" , sceKernelLseek (fd, 123456 , 1 ));
76- Log (" LSeek END+0=" , sceKernelLseek (fd, 0 , 2 ));
77- Log (" LSeek END+123456=" , sceKernelLseek (fd, 123456 , 2 ));
78- Log (" LSeek END+100=" , sceKernelLseek (fd, 100 , 2 ));
79- Log (" LSeek END-100=" , sceKernelLseek (fd, -100 , 2 ));
80- Log (" LSeek END-100000=" , sceKernelLseek (fd, -100000 , 2 ));
81-
82224 for (auto read_size: read_sizes) {
83225 for (auto read_offset: read_offsets) {
84226 DumpDirectory (fd, read_size, read_offset);
85227 }
86228 }
87-
88229 sceKernelClose (fd);
89230
90231 Log (" ------------------" );
91232 Log (" Dump PFS directory" );
92233 Log (" ------------------" );
93234 fd = sceKernelOpen (" /app0/assets/misc" , O_DIRECTORY | O_RDONLY, 0777 );
94-
95- Log (" Directory opened with fd=" , fd);
96-
97- Log (" LSeek START+0=" , sceKernelLseek (fd, 0 , 0 ));
98- Log (" LSeek START-123=" , sceKernelLseek (fd, -123 , 0 ));
99- Log (" LSeek START+123456=" , sceKernelLseek (fd, 123456 , 0 ));
100- Log (" LSeek START+60=" , sceKernelLseek (fd, 60 , 0 ));
101- Log (" LSeek CUR+0=" , sceKernelLseek (fd, 0 , 1 ));
102- Log (" LSeek CUR+24=" , sceKernelLseek (fd, 24 , 1 ));
103- Log (" LSeek CUR-24=" , sceKernelLseek (fd, -24 , 1 ));
104- Log (" LSeek CUR-6666=" , sceKernelLseek (fd, -6666 , 1 ));
105- Log (" LSeek CUR+123456=" , sceKernelLseek (fd, 123456 , 1 ));
106- Log (" LSeek END+0=" , sceKernelLseek (fd, 0 , 2 ));
107- Log (" LSeek END+123456=" , sceKernelLseek (fd, 123456 , 2 ));
108- Log (" LSeek END+100=" , sceKernelLseek (fd, 100 , 2 ));
109- Log (" LSeek END-100=" , sceKernelLseek (fd, -100 , 2 ));
110- Log (" LSeek END-100000=" , sceKernelLseek (fd, -100000 , 2 ));
111-
112235 for (auto read_size: read_sizes) {
113236 for (auto read_offset: read_offsets) {
114237 DumpDirectory (fd, read_size, read_offset, true );
115238 }
116239 }
117-
118240 sceKernelClose (fd);
119241}
120242
@@ -129,11 +251,10 @@ bool DumpByRead(int dir_fd, int dump_fd, char* buffer, size_t size) {
129251 return false ;
130252 }
131253 if (tbr == 0 ) {
132- LogSuccess (" Read finished" );
133254 return false ;
134255 }
135256
136- if (s64 tbw = sceKernelWrite (dump_fd, buffer, size ); tbw != size ) LogError (" Written" , tbw, " bytes out of" , size , " bytes" );
257+ if (s64 tbw = sceKernelWrite (dump_fd, buffer, tbr ); tbw != tbr ) LogError (" Written" , tbw, " bytes out of" , tbr , " bytes" );
137258 return true ;
138259}
139260
@@ -149,11 +270,10 @@ bool DumpByDirent(int dir_fd, int dump_fd, char* buffer, size_t size, s64* idx)
149270 return false ;
150271 }
151272 if (tbr == 0 ) {
152- LogSuccess (" Dirent finished" );
153273 return false ;
154274 }
155275
156- if (s64 tbw = sceKernelWrite (dump_fd, buffer, size ); tbw != size ) LogError (" Written" , tbw, " bytes out of" , size , " bytes" );
276+ if (s64 tbw = sceKernelWrite (dump_fd, buffer, tbr ); tbw != tbr ) LogError (" Written" , tbw, " bytes out of" , tbr , " bytes" );
157277 return true ;
158278}
159279
@@ -186,5 +306,3 @@ void DumpDirectory(int fd, int buffer_size, s64 offset, bool is_pfs) {
186306 sceKernelClose (dirent_fd);
187307 delete[] buffer;
188308}
189-
190- } // namespace FS_Test
0 commit comments