f349f8f8a313cf2f5085c3443875141358cbb0bf
[idea/community.git] / platform / platform-tests / testSrc / com / intellij / openapi / vfs / local / PersistentFsTest.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.openapi.vfs.local;
17
18 import com.intellij.openapi.util.SystemInfo;
19 import com.intellij.openapi.util.io.FileUtil;
20 import com.intellij.openapi.util.io.IoTestUtil;
21 import com.intellij.openapi.util.text.StringUtil;
22 import com.intellij.openapi.vfs.*;
23 import com.intellij.openapi.vfs.ex.temp.TempFileSystem;
24 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
25 import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS;
26 import com.intellij.testFramework.LoggedErrorProcessor;
27 import com.intellij.testFramework.PlatformTestCase;
28 import org.apache.log4j.Logger;
29 import org.jetbrains.annotations.NotNull;
30
31 import java.io.File;
32 import java.util.jar.JarFile;
33
34 public class PersistentFsTest extends PlatformTestCase {
35   private PersistentFS myFs;
36   private LocalFileSystem myLocalFs;
37
38   @Override
39   public void setUp() throws Exception {
40     super.setUp();
41     myFs = PersistentFS.getInstance();
42     myLocalFs = LocalFileSystem.getInstance();
43   }
44
45   @Override
46   protected void tearDown() throws Exception {
47     myLocalFs = null;
48     myFs = null;
49     super.tearDown();
50   }
51
52   public void testAccessingFileByID() throws Exception {
53     File dir = createTempDirectory();
54     File file = new File(dir, "test.txt");
55     assertTrue(file.createNewFile());
56
57     VirtualFile vFile = myLocalFs.refreshAndFindFileByIoFile(file);
58     assertNotNull(vFile);
59
60     int id = ((VirtualFileWithId)vFile).getId();
61     assertEquals(vFile, myFs.findFileById(id));
62
63     delete(vFile);
64     assertNull(myFs.findFileById(id));
65   }
66
67   public void testFindRootShouldNotBeFooledByRelativePath() throws Exception {
68     File tmp = createTempDirectory();
69     File x = new File(tmp, "x.jar");
70     assertTrue(x.createNewFile());
71
72     VirtualFile vx = myLocalFs.refreshAndFindFileByIoFile(x);
73     assertNotNull(vx);
74
75     JarFileSystem jfs = JarFileSystem.getInstance();
76     VirtualFile root = jfs.getJarRootForLocalFile(vx);
77     String path = vx.getPath() + "/../" + vx.getName() + JarFileSystem.JAR_SEPARATOR;
78     assertSame(myFs.findRoot(path, jfs), root);
79   }
80
81   public void testFindRootMustCreateFileWithCanonicalPath() throws Exception {
82     File tmp = createTempDirectory();
83     File x = new File(tmp, "x.jar");
84     assertTrue(x.createNewFile());
85
86     JarFileSystem jfs = JarFileSystem.getInstance();
87     String path = x.getPath() + "/../" + x.getName() + JarFileSystem.JAR_SEPARATOR;
88     NewVirtualFile root = myFs.findRoot(path, jfs);
89     assertFalse(root.getPath().contains(".."));
90   }
91
92   public void testDeleteSubstRoots() throws Exception {
93     if (!SystemInfo.isWindows) return;
94
95     File tempDirectory = FileUtil.createTempDirectory(getTestName(false), null);
96     File substRoot = IoTestUtil.createSubst(tempDirectory.getPath());
97     VirtualFile subst = myLocalFs.refreshAndFindFileByIoFile(substRoot);
98     assertNotNull(subst);
99
100     try {
101       final File[] children = substRoot.listFiles();
102       assertNotNull(children);
103     }
104     finally {
105       IoTestUtil.deleteSubst(substRoot.getPath());
106     }
107     subst.refresh(false, true);
108
109     VirtualFile[] roots = myFs.getRoots(myLocalFs);
110     for (VirtualFile root : roots) {
111       String rootPath = root.getPath();
112       String prefix = StringUtil.commonPrefix(rootPath, substRoot.getPath());
113       assertEmpty(prefix);
114     }
115   }
116
117   public void testLocalRoots() {
118     VirtualFile tempRoot = VirtualFileManager.getInstance().findFileByUrl("temp:///");
119     assertNotNull(tempRoot);
120
121     VirtualFile[] roots = myFs.getLocalRoots();
122     for (VirtualFile root : roots) {
123       assertTrue("root=" + root, root.isInLocalFileSystem());
124       VirtualFileSystem fs = root.getFileSystem();
125       assertTrue("fs=" + fs, fs instanceof LocalFileSystem);
126       assertFalse("fs=" + fs, fs instanceof TempFileSystem);
127     }
128   }
129
130   public void testInvalidJarRootsIgnored() throws Exception {
131     File file = IoTestUtil.createTestFile("file.txt");
132     String url = "jar://" + FileUtil.toSystemIndependentName(file.getPath()) + "!/";
133     assertNull(VirtualFileManager.getInstance().findFileByUrl(url));
134   }
135
136   public void testBrokenJarRoots() throws Exception {
137     final File jarFile = IoTestUtil.createTestFile("empty.jar");
138
139     final int[] logCount = {0};
140     LoggedErrorProcessor.setNewInstance(new LoggedErrorProcessor() {
141       @Override
142       public void processWarn(String message, Throwable t, @NotNull Logger logger) {
143         super.processWarn(message, t, logger);
144         if (message.contains(jarFile.getName())) logCount[0]++;
145       }
146     });
147
148     try {
149       String rootUrl = "jar://" + FileUtil.toSystemIndependentName(jarFile.getPath()) + "!/";
150       String entryUrl = rootUrl + JarFile.MANIFEST_NAME;
151       assertNotNull(getVirtualFile(jarFile));
152       VirtualFile jarRoot = VirtualFileManager.getInstance().findFileByUrl(rootUrl);
153       assertNotNull(jarRoot);
154       assertTrue(jarRoot.isValid());
155       assertEquals(0, jarRoot.getChildren().length);
156       assertNull(VirtualFileManager.getInstance().findFileByUrl(entryUrl));
157
158       VirtualFile local = JarFileSystem.getInstance().getVirtualFileForJar(jarRoot);
159       assertNotNull(local);
160       IoTestUtil.createTestJar(jarFile);
161       local.refresh(false, false);
162       assertTrue(jarRoot.isValid());
163       assertEquals(1, jarRoot.getChildren().length);
164       assertNotNull(VirtualFileManager.getInstance().findFileByUrl(entryUrl));
165     }
166     finally {
167       LoggedErrorProcessor.restoreDefaultProcessor();
168     }
169
170     assertEquals(1, logCount[0]);
171   }
172 }