2626import fr .pilato .elasticsearch .crawler .fs .settings .FsSettings ;
2727import fr .pilato .elasticsearch .crawler .fs .settings .Server ;
2828import fr .pilato .elasticsearch .crawler .fs .test .framework .AbstractFSCrawlerTestCase ;
29+ import java .io .IOException ;
2930import java .io .InputStream ;
3031import java .nio .charset .StandardCharsets ;
3132import java .util .Collection ;
3233
34+ import java .util .List ;
35+ import java .util .stream .Collectors ;
3336import org .apache .commons .io .IOUtils ;
3437import org .junit .After ;
3538import org .junit .Before ;
4043import org .mockftpserver .fake .filesystem .DirectoryEntry ;
4144import org .mockftpserver .fake .filesystem .FileEntry ;
4245import org .mockftpserver .fake .filesystem .FileSystem ;
46+ import org .mockftpserver .fake .filesystem .Permissions ;
4347import org .mockftpserver .fake .filesystem .UnixFakeFileSystem ;
4448
4549public class FileAbstractorFTPTest extends AbstractFSCrawlerTestCase {
4650 private FakeFtpServer fakeFtpServer ;
47- private final String home = "/home" ;
51+ private final String nestedDir = "/nested" ;
52+ private final String permissionDir = "/permission" ;
4853 private final String user = "user" ;
49- private final String pass = "password " ;
54+ private final String pass = "pass " ;
5055
5156 @ Before
5257 public void setup () {
53- // it doesn't support utf-8
5458 fakeFtpServer = new FakeFtpServer ();
5559 fakeFtpServer .setServerControlPort (5968 );
56- fakeFtpServer .addUserAccount (new UserAccount (user , pass , home ));
60+ fakeFtpServer .addUserAccount (new UserAccount (user , pass , "/" ));
5761 FileSystem fileSystem = new UnixFakeFileSystem ();
5862
59- fileSystem .add (new DirectoryEntry (home ));
60- fileSystem .add (new FileEntry (home + "/foo.txt" , "文件名不支持中文" ));
61- fileSystem .add (new FileEntry (home + "/bar.txt" , "bar " ));
63+ fileSystem .add (new DirectoryEntry (nestedDir ));
64+ fileSystem .add (new FileEntry (nestedDir + "/foo.txt" , "文件名不支持中文" ));
65+ fileSystem .add (new FileEntry (nestedDir + "/bar.txt" , "filename doesn't support utf-8 " ));
6266
63- fileSystem .add (new DirectoryEntry (home + "/buzz" ));
64- fileSystem .add (new FileEntry (home + "/buzz/hello.txt" , "hello" ));
65- fileSystem .add (new FileEntry (home + "/buzz/world.txt" , "world" ));
67+ fileSystem .add (new DirectoryEntry (nestedDir + "/buzz" ));
68+ fileSystem .add (new FileEntry (nestedDir + "/buzz/hello.txt" , "hello" ));
69+ fileSystem .add (new FileEntry (nestedDir + "/buzz/world.txt" , "world" ));
70+
71+ fileSystem .add (new DirectoryEntry (permissionDir ));
72+ FileEntry fileAllPermissions = new FileEntry (permissionDir + "/all.txt" , "123" );
73+ fileAllPermissions .setPermissions (Permissions .ALL );
74+ fileSystem .add (fileAllPermissions );
75+ FileEntry fileNonePermissions = new FileEntry (permissionDir + "/none.txt" , "456" );
76+ fileNonePermissions .setPermissions (Permissions .NONE );
77+ fileSystem .add (fileNonePermissions );
6678
6779 fakeFtpServer .setFileSystem (fileSystem );
6880 fakeFtpServer .start ();
6981 }
7082
7183 @ After
72- public void teardown () {
84+ public void shutDown () {
7385 fakeFtpServer .stop ();
7486 }
7587
@@ -89,9 +101,9 @@ public void testConnectToFakeFTPServer() throws Exception {
89101
90102 FileAbstractorFTP ftp = new FileAbstractorFTP (fsSettings );
91103 ftp .open ();
92- boolean exists = ftp .exists (home );
104+ boolean exists = ftp .exists (nestedDir );
93105 assertThat (exists , is (true ));
94- Collection <FileAbstractModel > files = ftp .getFiles (home );
106+ Collection <FileAbstractModel > files = ftp .getFiles (nestedDir );
95107 assertThat (files .size (), is (3 ));
96108
97109 for (FileAbstractModel file : files ) {
@@ -117,6 +129,11 @@ public void testConnectToFakeFTPServer() throws Exception {
117129 ftp .close ();
118130 }
119131
132+ /**
133+ * FakeFtpServer doesn't support utf-8
134+ * You have to adapt this test to your own system
135+ * So this test is disabled by default
136+ */
120137 @ Test @ Ignore
121138 public void testConnectToFTPServer () throws Exception {
122139 String path = "/中文目录" ;
@@ -160,4 +177,49 @@ public void testConnectToFTPServer() throws Exception {
160177
161178 ftp .close ();
162179 }
180+
181+ @ Test
182+ public void testFTPFilePermissions () throws IOException {
183+ int port = fakeFtpServer .getServerControlPort ();
184+ FsSettings fsSettings = FsSettings .builder ("fake" )
185+ .setServer (
186+ Server .builder ()
187+ .setHostname ("localhost" )
188+ .setUsername (user )
189+ .setPassword (pass )
190+ .setPort (port )
191+ .build ()
192+ )
193+ .build ();
194+
195+ FileAbstractorFTP ftp = new FileAbstractorFTP (fsSettings );
196+ ftp .open ();
197+
198+ Collection <FileAbstractModel > files = ftp .getFiles (permissionDir );
199+ assertThat (files .size (), is (2 ));
200+ List <String > filenames = files .stream ().map (FileAbstractModel ::getName ).collect (Collectors .toList ());
201+ assertThat (filenames .contains ("all.txt" ), is (true ));
202+ assertThat (filenames .contains ("none.txt" ), is (true ));
203+ for (FileAbstractModel file : files ) {
204+ if (file .getName ().equals ("all.txt" )) {
205+ assertThat (file .getPermissions (), is (777 ));
206+ try (InputStream inputStream = ftp .getInputStream (file )) {
207+ String content = IOUtils .toString (inputStream , StandardCharsets .UTF_8 );
208+ logger .debug (" - {}: {}" , file .getName (), content );
209+ }
210+ } else if (file .getName ().equals ("none.txt" )) {
211+ assertThat (file .getPermissions (), is (0 ));
212+ boolean errorOccurred = false ;
213+ try (InputStream ignored = ftp .getInputStream (file )) {
214+ logger .error (ignored );
215+ } catch (IOException e ) {
216+ errorOccurred = true ;
217+ logger .error (e .getMessage ());
218+ }
219+ assertThat (errorOccurred , is (true ));
220+ }
221+ }
222+
223+ ftp .close ();
224+ }
163225}
0 commit comments