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.file.Files;
54 import java.nio.file.attribute.PosixFileAttributeView;
55 import java.nio.file.attribute.PosixFilePermission;
56 import java.util.Set;
57
58 import org.eclipse.jgit.junit.RepositoryTestCase;
59 import org.junit.After;
60 import org.junit.Before;
61 import org.junit.Test;
62
63 public class FSJava7Test {
64 private File trash;
65
66 @Before
67 public void setUp() throws Exception {
68 trash = File.createTempFile("tmp_", "");
69 trash.delete();
70 assertTrue("mkdir " + trash, trash.mkdir());
71 }
72
73 @After
74 public void tearDown() throws Exception {
75 FileUtils.delete(trash, FileUtils.RECURSIVE | FileUtils.RETRY);
76 }
77
78
79
80
81
82
83
84
85
86
87
88 @Test
89 public void testSymlinkAttributes() throws IOException, InterruptedException {
90 FS fs = FS.DETECTED;
91 File link = new File(trash, "ä");
92 File target = new File(trash, "å");
93 fs.createSymLink(link, "å");
94 assertTrue(fs.exists(link));
95 String targetName = fs.readSymLink(link);
96 assertEquals("å", targetName);
97 assertTrue(fs.lastModified(link) > 0);
98 assertTrue(fs.exists(link));
99 assertFalse(fs.canExecute(link));
100 assertEquals(2, fs.length(link));
101 assertFalse(fs.exists(target));
102 assertFalse(fs.isFile(target));
103 assertFalse(fs.isDirectory(target));
104 assertFalse(fs.canExecute(target));
105
106 RepositoryTestCase.fsTick(link);
107
108 FileUtils.createNewFile(target);
109 assertTrue(fs.exists(link));
110 assertTrue(fs.lastModified(link) > 0);
111 assertTrue(fs.lastModified(target) > fs.lastModified(link));
112 assertFalse(fs.canExecute(link));
113 fs.setExecute(target, true);
114 assertFalse(fs.canExecute(link));
115 assumeTrue(fs.supportsExecute());
116 assertTrue(fs.canExecute(target));
117 }
118
119 @Test
120 public void testExecutableAttributes() throws Exception {
121 FS fs = FS.DETECTED.newInstance();
122
123 assumeTrue(fs instanceof FS_POSIX);
124 ((FS_POSIX) fs).setUmask(0022);
125
126 File f = new File(trash, "bla");
127 assertTrue(f.createNewFile());
128 assertFalse(fs.canExecute(f));
129
130 Set<PosixFilePermission> permissions = readPermissions(f);
131 assertTrue(!permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
132 assertTrue(!permissions.contains(PosixFilePermission.GROUP_EXECUTE));
133 assertTrue(!permissions.contains(PosixFilePermission.OWNER_EXECUTE));
134
135 fs.setExecute(f, true);
136
137 permissions = readPermissions(f);
138 assertTrue("'owner' execute permission not set",
139 permissions.contains(PosixFilePermission.OWNER_EXECUTE));
140 assertTrue("'group' execute permission not set",
141 permissions.contains(PosixFilePermission.GROUP_EXECUTE));
142 assertTrue("'others' execute permission not set",
143 permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
144
145 ((FS_POSIX) fs).setUmask(0033);
146 fs.setExecute(f, false);
147 assertFalse(fs.canExecute(f));
148 fs.setExecute(f, true);
149
150 permissions = readPermissions(f);
151 assertTrue("'owner' execute permission not set",
152 permissions.contains(PosixFilePermission.OWNER_EXECUTE));
153 assertFalse("'group' execute permission set",
154 permissions.contains(PosixFilePermission.GROUP_EXECUTE));
155 assertFalse("'others' execute permission set",
156 permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
157 }
158
159 private Set<PosixFilePermission> readPermissions(File f) throws IOException {
160 return Files
161 .getFileAttributeView(f.toPath(), PosixFileAttributeView.class)
162 .readAttributes().permissions();
163 }
164
165 }