1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.util;
45
46 import static org.junit.Assert.assertEquals;
47 import static org.junit.Assert.assertFalse;
48 import static org.junit.Assert.assertTrue;
49 import static org.junit.Assume.assumeTrue;
50
51 import java.io.File;
52 import java.io.IOException;
53 import java.nio.charset.Charset;
54 import java.nio.file.Files;
55 import java.nio.file.attribute.PosixFileAttributeView;
56 import java.nio.file.attribute.PosixFilePermission;
57 import java.util.Set;
58
59 import org.eclipse.jgit.errors.CommandFailedException;
60 import org.eclipse.jgit.junit.RepositoryTestCase;
61 import org.junit.After;
62 import org.junit.Assume;
63 import org.junit.Before;
64 import org.junit.Test;
65
66 public class FSTest {
67 private File trash;
68
69 @Before
70 public void setUp() throws Exception {
71 trash = File.createTempFile("tmp_", "");
72 trash.delete();
73 assertTrue("mkdir " + trash, trash.mkdir());
74 }
75
76 @After
77 public void tearDown() throws Exception {
78 FileUtils.delete(trash, FileUtils.RECURSIVE | FileUtils.RETRY);
79 }
80
81
82
83
84
85
86
87
88
89
90
91 @Test
92 public void testSymlinkAttributes() throws IOException, InterruptedException {
93 Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
94 FS fs = FS.DETECTED;
95 File link = new File(trash, "ä");
96 File target = new File(trash, "å");
97 fs.createSymLink(link, "å");
98 assertTrue(fs.exists(link));
99 String targetName = fs.readSymLink(link);
100 assertEquals("å", targetName);
101 assertTrue(fs.lastModified(link) > 0);
102 assertTrue(fs.exists(link));
103 assertFalse(fs.canExecute(link));
104 assertEquals(2, fs.length(link));
105 assertFalse(fs.exists(target));
106 assertFalse(fs.isFile(target));
107 assertFalse(fs.isDirectory(target));
108 assertFalse(fs.canExecute(target));
109
110 RepositoryTestCase.fsTick(link);
111
112 FileUtils.createNewFile(target);
113 assertTrue(fs.exists(link));
114 assertTrue(fs.lastModified(link) > 0);
115 assertTrue(fs.lastModified(target) > fs.lastModified(link));
116 assertFalse(fs.canExecute(link));
117 fs.setExecute(target, true);
118 assertFalse(fs.canExecute(link));
119 assumeTrue(fs.supportsExecute());
120 assertTrue(fs.canExecute(target));
121 }
122
123 @Test
124 public void testExecutableAttributes() throws Exception {
125 FS fs = FS.DETECTED.newInstance();
126
127 assumeTrue(fs instanceof FS_POSIX);
128 ((FS_POSIX) fs).setUmask(0022);
129
130 File f = new File(trash, "bla");
131 assertTrue(f.createNewFile());
132 assertFalse(fs.canExecute(f));
133
134 Set<PosixFilePermission> permissions = readPermissions(f);
135 assertTrue(!permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
136 assertTrue(!permissions.contains(PosixFilePermission.GROUP_EXECUTE));
137 assertTrue(!permissions.contains(PosixFilePermission.OWNER_EXECUTE));
138
139 fs.setExecute(f, true);
140
141 permissions = readPermissions(f);
142 assertTrue("'owner' execute permission not set",
143 permissions.contains(PosixFilePermission.OWNER_EXECUTE));
144 assertTrue("'group' execute permission not set",
145 permissions.contains(PosixFilePermission.GROUP_EXECUTE));
146 assertTrue("'others' execute permission not set",
147 permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
148
149 ((FS_POSIX) fs).setUmask(0033);
150 fs.setExecute(f, false);
151 assertFalse(fs.canExecute(f));
152 fs.setExecute(f, true);
153
154 permissions = readPermissions(f);
155 assertTrue("'owner' execute permission not set",
156 permissions.contains(PosixFilePermission.OWNER_EXECUTE));
157 assertFalse("'group' execute permission set",
158 permissions.contains(PosixFilePermission.GROUP_EXECUTE));
159 assertFalse("'others' execute permission set",
160 permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
161 }
162
163 private Set<PosixFilePermission> readPermissions(File f) throws IOException {
164 return Files
165 .getFileAttributeView(f.toPath(), PosixFileAttributeView.class)
166 .readAttributes().permissions();
167 }
168
169 @Test(expected = CommandFailedException.class)
170 public void testReadPipePosixCommandFailure()
171 throws CommandFailedException {
172 FS fs = FS.DETECTED.newInstance();
173 assumeTrue(fs instanceof FS_POSIX);
174
175 String r = FS.readPipe(fs.userHome(),
176 new String[] { "bash", "--login", "-c", "foobar" },
177 Charset.defaultCharset().name());
178 System.out.println(r);
179 }
180 }