Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(483)

Unified Diff: editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/analysis/AnalysisServerTest.java

Issue 10537122: Fix analysis server caching edge case http://code.google.com/p/dart/issues/detail?id=3423 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/analysis/AnalysisServerTest.java
===================================================================
--- editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/analysis/AnalysisServerTest.java (revision 8521)
+++ editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/analysis/AnalysisServerTest.java (working copy)
@@ -13,6 +13,8 @@
*/
package com.google.dart.tools.core.analysis;
+import com.google.common.base.Joiner;
+import com.google.dart.compiler.ast.DartDirective;
import com.google.dart.compiler.ast.DartUnit;
import com.google.dart.compiler.ast.LibraryUnit;
import com.google.dart.tools.core.DartCoreDebug;
@@ -26,16 +28,23 @@
import java.io.File;
import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
public class AnalysisServerTest extends TestCase {
+ private static final String EMPTY_CACHE_CONTENT = "v2\n</end-libraries>\n</end-cache>";
+
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
private static final String TEST_CLASS_SIMPLE_NAME = AnalysisServerTest.class.getSimpleName();
@@ -366,6 +375,11 @@
});
}
+ public void test_AnalysisServer_read() throws Exception {
+ setupServer(new StringReader(EMPTY_CACHE_CONTENT));
+ assertEquals(0, getTrackedLibraryFiles().length);
+ }
+
public void test_AnalysisServer_resolve() throws Exception {
TestUtilities.runWithTempDirectory(new FileOperation() {
@Override
@@ -582,11 +596,10 @@
assertTrackedLibraryFiles();
assertFalse(isLibraryFileCached(libFile));
- File cacheFile = new File(libFile.getParentFile(), "analysis.cache");
-
+ StringWriter writer = new StringWriter(5000);
server.stop();
- writeCache(cacheFile);
- setupServer(cacheFile);
+ writeCache(writer);
+ setupServer(new StringReader(writer.toString()));
assertTrackedLibraryFiles();
assertFalse(isLibraryFileCached(libFile));
@@ -603,60 +616,85 @@
assertTrackedLibraryFiles(libFile);
assertTrue(isLibraryFileCached(libFile));
- File cacheFile = new File(libFile.getParentFile(), "analysis.cache");
-
+ StringWriter writer = new StringWriter(5000);
server.stop();
- writeCache(cacheFile);
- setupServer(cacheFile);
+ writeCache(writer);
+ setupServer(new StringReader(writer.toString()));
assertTrackedLibraryFiles(libFile);
assertTrue(isLibraryFileCached(libFile));
+
+ String contents = FileUtilities.getContents(libFile);
+ String libraryDirective = "#library(\"Money\");";
+ int start = contents.indexOf(libraryDirective);
+ assertTrue(start >= 0);
+ contents = Joiner.on("\n").join(
+ contents.substring(0, start),
+ "#library('Bad\\",
+ "Na\"me');",
+ "#import('Bad\\",
+ "Import.dart');",
+ "#import('BadPrefix.dart', prefix:'Bad\\",
+ "prefix');",
+ "#source('Bad\\",
+ "Source.dart');",
+ contents.substring(start + libraryDirective.length()));
+ FileUtilities.setContents(libFile, contents);
+ server.changed(libFile);
+ waitForIdle();
+
+ writer = new StringWriter(5000);
+ server.stop();
+ writeCache(writer);
+ setupServer(new StringReader(writer.toString()));
+
+ LibraryUnit libUnit = server.getSavedContext().resolve(libFile, FIVE_MINUTES_MS);
+ List<DartDirective> directives = libUnit.getSelfDartUnit().getDirectives();
+ for (int index = 0; index < 3; index++) {
+ assertTrue(directives.get(index).toSource().contains("Bad"));
+ }
}
});
}
public void test_AnalysisServer_write_read_bad() throws Exception {
- TestUtilities.runWithTempDirectory(new FileOperation() {
- @Override
- public void run(File tempDir) throws Exception {
- File libFile = setupMoneyLibrary(tempDir);
- setupServer();
+ setupServer();
- // Cannot write cache while server is still running
+ // Cannot write cache while server is still running
- File cacheFile = new File(libFile.getParentFile(), "analysis.cache");
- try {
- writeCache(cacheFile);
- fail("should not be able to write cache while server is still running");
- } catch (IllegalStateException e) {
- //$FALL-THROUGH$
- }
+ StringWriter writer = new StringWriter(5000);
+ try {
+ writeCache(writer);
+ fail("should not be able to write cache while server is still running");
+ } catch (IllegalStateException e) {
+ //$FALL-THROUGH$
+ }
- // Cannot read cache while server is still running
+ // Cannot read cache while server is still running
- try {
- readCache(cacheFile);
- fail("should not be able to read cache while server is still running");
- } catch (IllegalStateException e) {
- //$FALL-THROUGH$
- }
+ try {
+ readCache(new StringReader(EMPTY_CACHE_CONTENT));
+ fail("should not be able to read cache while server is still running");
+ } catch (IllegalStateException e) {
+ //$FALL-THROUGH$
+ }
- server.stop();
+ server.stop();
- // Cannot read null or non-existant cache file... returns false
+ // Cannot read empty or incomptable version cache file
- assertFalse(readCache(null));
- assertFalse(cacheFile.exists());
- assertFalse(readCache(cacheFile));
-
- // Cannot read empty or incomptable version cache file... returns false
-
- FileUtilities.setContents(cacheFile, "");
- assertFalse(readCache(cacheFile));
- FileUtilities.setContents(cacheFile, "nothing");
- assertFalse(readCache(cacheFile));
- }
- });
+ try {
+ readCache(new StringReader(""));
+ fail("should not be able to read cache with missing version number");
+ } catch (IOException e) {
+ //$FALL-THROUGH$
+ }
+ try {
+ readCache(new StringReader("nothing"));
+ fail("should not be able to read cache with invalid version number");
+ } catch (IOException e) {
+ //$FALL-THROUGH$
+ }
}
@Override
@@ -730,17 +768,15 @@
return result instanceof Boolean && ((Boolean) result).booleanValue();
}
- private boolean readCache(File cacheFile) throws Exception {
+ private void readCache(Reader reeader) throws Exception {
// server.readCache(cacheFile)
- Method method = server.getClass().getDeclaredMethod("readCache", File.class);
+ Method method = server.getClass().getDeclaredMethod("readCache", Reader.class);
method.setAccessible(true);
- Object result;
try {
- result = method.invoke(server, cacheFile);
+ method.invoke(server, reeader);
} catch (InvocationTargetException e) {
throw (Exception) e.getCause();
}
- return (Boolean) result;
}
private void setupDefaultServer() throws Exception {
@@ -767,13 +803,11 @@
setupServer(null);
}
- private void setupServer(File cacheFile) throws Exception {
+ private void setupServer(Reader reader) throws Exception {
EditorLibraryManager libraryManager = SystemLibraryManagerProvider.getAnyLibraryManager();
server = new AnalysisServer(libraryManager);
- if (cacheFile != null) {
- if (!readCache(cacheFile)) {
- fail("Failed to read cached from " + cacheFile);
- }
+ if (reader != null) {
+ readCache(reader);
}
listener = new Listener(server);
server.start();
@@ -791,12 +825,12 @@
return System.currentTimeMillis() - start;
}
- private void writeCache(File cacheFile) throws Exception {
+ private void writeCache(Writer writer) throws Exception {
// server.writeCache(cacheFile);
- Method method = server.getClass().getDeclaredMethod("writeCache", File.class);
+ Method method = server.getClass().getDeclaredMethod("writeCache", Writer.class);
method.setAccessible(true);
try {
- method.invoke(server, cacheFile);
+ method.invoke(server, writer);
} catch (InvocationTargetException e) {
throw (Exception) e.getCause();
}

Powered by Google App Engine
This is Rietveld 408576698