2 * Copyright 2000-2015 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.openapi.vfs;
18 import com.intellij.openapi.application.ApplicationManager;
19 import com.intellij.openapi.application.Result;
20 import com.intellij.openapi.application.WriteAction;
21 import com.intellij.openapi.application.ex.PathManagerEx;
22 import com.intellij.openapi.util.SystemInfo;
23 import com.intellij.openapi.util.io.FileUtil;
24 import com.intellij.openapi.util.io.IoTestUtil;
25 import com.intellij.openapi.vfs.newvfs.ManagingFS;
26 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
27 import com.intellij.testFramework.PlatformTestCase;
28 import com.intellij.testFramework.UsefulTestCase;
29 import com.intellij.testFramework.vcs.DirectoryData;
30 import com.intellij.util.ThrowableRunnable;
31 import com.intellij.util.TimeoutUtil;
32 import com.intellij.util.concurrency.Semaphore;
33 import org.jetbrains.annotations.NotNull;
36 import java.io.IOException;
39 import java.nio.charset.Charset;
40 import java.util.Collections;
41 import java.util.List;
43 public class VfsUtilTest extends PlatformTestCase {
45 protected boolean isRunInEdt() {
50 protected boolean isRunInWriteAction() {
55 protected void setUp() throws Exception {
56 invokeAndWaitIfNeeded(new ThrowableRunnable<Exception>() {
58 public void run() throws Exception {
59 VfsUtilTest.super.setUp();
65 protected void tearDown() throws Exception {
66 invokeAndWaitIfNeeded(new ThrowableRunnable<Exception>() {
68 public void run() throws Exception {
69 VfsUtilTest.super.tearDown();
74 public void testFixIdeaUrl() {
75 assertEquals("file:/C:/Temp/README.txt", VfsUtilCore.fixIDEAUrl("file://C:/Temp/README.txt"));
76 assertEquals("file:/C:/Temp/README.txt", VfsUtilCore.fixIDEAUrl("file:///C:/Temp/README.txt"));
77 assertEquals("file:/tmp/foo.bar", VfsUtilCore.fixIDEAUrl("file:///tmp/foo.bar"));
80 public void testFindFileByUrl() throws Exception {
81 File file1 = new File(PathManagerEx.getTestDataPath());
82 file1 = new File(file1, "vfs");
83 file1 = new File(file1, "findFileByUrl");
84 VirtualFile file0 = VfsUtil.findFileByURL(file1.toURI().toURL());
86 assertTrue(file0.isDirectory());
87 List<VirtualFile> list = VfsUtil.getChildren(file0, new VirtualFileFilter() {
89 public boolean accept(VirtualFile file) {
90 return !file.getName().endsWith(".new");
93 assertEquals(2, list.size()); // "CVS" dir ignored
95 File file2 = new File(file1, "test.zip");
96 URL url2 = file2.toURI().toURL();
98 url2 = new URL("jar", "", url2.toExternalForm() + "!/");
99 file0 = VfsUtil.findFileByURL(url2);
100 assertNotNull(file0);
101 assertTrue(file0.isDirectory());
103 url2 = new URL(url2, "com/intellij/installer");
104 file0 = VfsUtil.findFileByURL(url2);
105 assertNotNull(file0);
106 assertTrue(file0.isDirectory());
108 File file3 = new File(file1, "1.txt");
109 file0 = VfsUtil.findFileByURL(file3.toURI().toURL());
110 String content = VfsUtilCore.loadText(file0);
111 assertNotNull(file0);
112 assertFalse(file0.isDirectory());
113 assertEquals("test text", content);
116 public void testRelativePath() throws Exception {
117 final File root = new File(PathManagerEx.getTestDataPath());
118 final File testRoot = new File(new File(root, "vfs"), "relativePath");
119 VirtualFile vTestRoot = LocalFileSystem.getInstance().findFileByIoFile(testRoot);
120 assertNotNull(vTestRoot);
121 assertTrue(vTestRoot.isDirectory());
123 final File subDir = new File(testRoot, "subDir");
124 final VirtualFile vSubDir = LocalFileSystem.getInstance().findFileByIoFile(subDir);
125 assertNotNull(vSubDir);
127 final File subSubDir = new File(subDir, "subSubDir");
128 final VirtualFile vSubSubDir = LocalFileSystem.getInstance().findFileByIoFile(subSubDir);
129 assertNotNull(vSubSubDir);
131 assertEquals("subDir", VfsUtilCore.getRelativePath(vSubDir, vTestRoot, '/'));
132 assertEquals("subDir/subSubDir", VfsUtilCore.getRelativePath(vSubSubDir, vTestRoot, '/'));
133 assertEquals("", VfsUtilCore.getRelativePath(vTestRoot, vTestRoot, '/'));
136 public void testVisitRecursively() throws Exception {
137 final DirectoryData data = new DirectoryData(myProject.getBaseDir());
142 final File subDir = new File(data.getBase().getPath(), "DL0N1");
143 final VirtualFile vSubDir = LocalFileSystem.getInstance().findFileByIoFile(subDir);
144 assertNotNull(vSubDir);
146 VfsUtilCore.visitChildrenRecursively(data.getBase(), new VirtualFileVisitor() {
148 public boolean visitFile(@NotNull VirtualFile file) {
149 assertTrue(!VfsUtilCore.isAncestor(vSubDir, file, true));
150 return !vSubDir.equals(file);
159 public void testFindChildWithTrailingSpace() throws IOException {
160 File tempDir = createTempDirectory();
161 VirtualFile vDir = LocalFileSystem.getInstance().findFileByIoFile(tempDir);
163 assertTrue(vDir.isDirectory());
165 VirtualFile child = vDir.findChild(" ");
168 UsefulTestCase.assertEmpty(vDir.getChildren());
171 public void testDirAttributeRefreshes() throws IOException {
172 File tempDir = createTempDirectory();
173 VirtualFile vDir = refreshAndFindFile(tempDir);
175 assertTrue(vDir.isDirectory());
177 File file = FileUtil.createTempFile(tempDir, "xxx", "yyy", true);
179 VirtualFile vFile = refreshAndFindFile(file);
180 assertNotNull(vFile);
181 assertFalse(vFile.isDirectory());
183 boolean deleted = file.delete();
185 boolean created = file.mkdir();
187 assertTrue(file.exists());
189 VirtualFile vFile2 = refreshAndFindFile(file);
190 assertNotNull(vFile2);
191 assertTrue(vFile2.isDirectory());
194 public void testPresentableUrlSurvivesDeletion() throws IOException {
195 final VirtualFile file = createTempFile("txt", null, "content", Charset.defaultCharset());
196 String url = file.getPresentableUrl();
200 protected void run(@NotNull Result result) throws Throwable {
204 assertEquals(url, file.getPresentableUrl());
207 public void testToUri() {
208 if (!SystemInfo.isWindows) {
209 assertEquals("file:///asd", VfsUtil.toUri(new File("/asd")).toASCIIString());
210 assertEquals("file:///asd%20/sd", VfsUtil.toUri(new File("/asd /sd")).toASCIIString());
213 URI uri = VfsUtil.toUri("file:///asd");
215 assertEquals("file", uri.getScheme());
216 assertEquals("/asd", uri.getPath());
218 uri = VfsUtil.toUri("file:///asd/ ads/ad#test");
220 assertEquals("file", uri.getScheme());
221 assertEquals("/asd/ ads/ad", uri.getPath());
222 assertEquals("test", uri.getFragment());
224 uri = VfsUtil.toUri("file:///asd/ ads/ad#");
226 assertEquals("file:///asd/%20ads/ad#", uri.toString());
228 uri = VfsUtil.toUri("mailto:someone@example.com");
230 assertEquals("someone@example.com", uri.getSchemeSpecificPart());
232 if (SystemInfo.isWindows) {
233 uri = VfsUtil.toUri("file://C:/p");
235 assertEquals("file", uri.getScheme());
236 assertEquals("/C:/p", uri.getPath());
239 uri = VfsUtil.toUri("file:///Users/S pace");
241 assertEquals("file", uri.getScheme());
242 assertEquals("/Users/S pace", uri.getPath());
243 assertEquals("/Users/S%20pace", uri.getRawPath());
244 assertEquals("file:///Users/S%20pace", uri.toString());
246 uri = VfsUtil.toUri("http://developer.android.com/guide/developing/tools/avd.html");
248 assertEquals("http", uri.getScheme());
249 assertEquals("/guide/developing/tools/avd.html", uri.getRawPath());
250 assertEquals("http://developer.android.com/guide/developing/tools/avd.html", uri.toString());
252 uri = VfsUtil.toUri("http://developer.android.com/guide/developing/tools/avd.html?f=23r2ewd");
254 assertEquals("http", uri.getScheme());
255 assertEquals("/guide/developing/tools/avd.html", uri.getRawPath());
256 assertEquals("http://developer.android.com/guide/developing/tools/avd.html?f=23r2ewd", uri.toString());
257 assertEquals("f=23r2ewd", uri.getQuery());
260 public void testIsAncestor() {
261 assertTrue(VfsUtilCore.isEqualOrAncestor("file:///my/dir", "file:///my/dir"));
262 assertTrue(VfsUtilCore.isEqualOrAncestor("file:///my/dir", "file:///my/dir/file.txt"));
263 assertTrue(VfsUtilCore.isEqualOrAncestor("file:///my/dir/", "file:///my/dir/file.txt"));
264 assertFalse(VfsUtilCore.isEqualOrAncestor("file:///my/dir2", "file:///my/dir/file.txt"));
265 assertFalse(VfsUtilCore.isEqualOrAncestor("file:///my/dir", "file:///my/dir2"));
266 assertFalse(VfsUtilCore.isEqualOrAncestor("file:///my/dir/", "file:///my/dir2"));
269 public void testFindRootWithDenormalizedPath() throws IOException {
270 File tempJar = IoTestUtil.createTestJar();
271 VirtualFile jar = refreshAndFindFile(tempJar);
274 JarFileSystem fs = JarFileSystem.getInstance();
275 NewVirtualFile root1 = ManagingFS.getInstance().findRoot(jar.getPath() + "!/", fs);
276 NewVirtualFile root2 = ManagingFS.getInstance().findRoot(jar.getParent().getPath() + "//" + jar.getName() + "!/", fs);
277 assertNotNull(root1);
278 assertSame(root1, root2);
281 public void testNotCanonicallyNamedChild() throws IOException {
282 File tempDir = createTempDirectory();
283 assertTrue(new File(tempDir, "libFiles").createNewFile());
284 assertTrue(new File(tempDir, "CssInvalidElement").createNewFile());
285 assertTrue(new File(tempDir, "extFiles").createNewFile());
287 VirtualFile vDir = refreshAndFindFile(tempDir);
289 assertTrue(vDir.isDirectory());
291 assertNotNull(vDir.findChild("libFiles"));
292 assertNotNull(vDir.findChild("CssInvalidElement"));
294 assertNotNull(vDir.findChild("extFiles"));
295 assertNotNull(vDir.findChild("/extFiles/"));
296 assertNotNull(vDir.findChild("extFiles/"));
297 assertNotNull(vDir.findChild("/extFiles"));
298 assertNotNull(vDir.findChild("//extFiles"));
299 assertNotNull(vDir.findChild("extFiles///"));
301 assertNull(vDir.findChild("/xxx/extFiles/"));
302 assertNull(vDir.findChild("xxx/extFiles/"));
303 assertNull(vDir.findChild("/xxx/extFiles"));
304 assertNull(vDir.findChild("xxx/extFiles"));
305 assertNull(vDir.findChild("xxx//extFiles"));
308 public void testRenameDuringFullRefresh() throws IOException { doRenameAndRefreshTest(true); }
309 public void testRenameDuringPartialRefresh() throws IOException { doRenameAndRefreshTest(false); }
311 private void doRenameAndRefreshTest(boolean full) throws IOException {
312 assertFalse(ApplicationManager.getApplication().isDispatchThread());
314 File tempDir = createTempDirectory();
315 assertTrue(new File(tempDir, "child").createNewFile());
317 VirtualFile parent = refreshAndFindFile(tempDir);
318 assertNotNull(parent);
320 assertEquals(1, parent.getChildren().length);
322 final VirtualFile child = parent.findChild("child");
323 assertNotNull(child);
325 List<VirtualFile> files = Collections.singletonList(parent);
327 final Semaphore semaphore = new Semaphore();
328 for (int i = 0; i < 1000; i++) {
330 VfsUtil.markDirty(true, false, parent);
331 LocalFileSystem.getInstance().refreshFiles(files, true, true, new Runnable() {
338 assertTrue(child.isValid());
339 final String newName = "name" + i;
342 protected void run(@NotNull Result result) throws Throwable {
343 child.rename(this, newName);
346 assertTrue(child.isValid());
348 TimeoutUtil.sleep(1); // needed to prevent frequent event detector from triggering
351 assertTrue(semaphore.waitFor(60000));