Cleanup (tests extracted; formatting)
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Wed, 18 May 2016 10:16:21 +0000 (12:16 +0200)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Wed, 18 May 2016 10:16:41 +0000 (12:16 +0200)
platform/platform-tests/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java [deleted file]
platform/util/src/com/intellij/util/lang/IntObjectHashMap.java
platform/util/testSrc/com/intellij/util/lang/IntObjectHashMapTest.java [new file with mode: 0644]
platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java [new file with mode: 0644]

diff --git a/platform/platform-tests/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java b/platform/platform-tests/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java
deleted file mode 100644 (file)
index e564b4b..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2000-2015 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.util.lang;
-
-import com.intellij.openapi.application.PathManager;
-import com.intellij.util.ConcurrencyUtil;
-import com.intellij.util.containers.ContainerUtil;
-import gnu.trove.TIntObjectHashMap;
-import gnu.trove.TIntObjectProcedure;
-import junit.framework.TestCase;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.*;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * @author Dmitry Avdeev
- */
-public class UrlClassLoaderTest extends TestCase {
-
-  public void testBootstrapResources() {
-    String name = "com/sun/xml/internal/messaging/saaj/soap/LocalStrings.properties";
-    assertNotNull(UrlClassLoaderTest.class.getClassLoader().getResourceAsStream(name));
-    assertNull(UrlClassLoader.build().get().getResourceAsStream(name));
-    assertNotNull(UrlClassLoader.build().allowBootstrapResources().get().getResourceAsStream(name));
-  }
-
-  public void testIntObjectHashMap() {
-    final IntObjectHashMap map = new IntObjectHashMap();
-    final TIntObjectHashMap<Object> checkMap = new TIntObjectHashMap<Object>();
-    final TIntObjectHashMap<Object> dupesMap = new TIntObjectHashMap<Object>();
-    Random random = new Random();
-    for(int i = 0; i < 1000000; ++i) {
-      int key = random.nextInt();
-      String value = String.valueOf(random.nextInt());
-
-      if (!checkMap.contains(key)) {
-        map.put(key, value);
-        checkMap.put(key, value);
-        assertEquals(map.size(), checkMap.size());
-        assertEquals(value, map.get(key));
-      } else {
-        dupesMap.put(key, value);
-      }
-    }
-
-    dupesMap.put(0, "random string");
-
-    dupesMap.forEachEntry(new TIntObjectProcedure<Object>() {
-      @Override
-      public boolean execute(int key, Object value) {
-        checkMap.put(key, value);
-        map.put(key, value);
-        assertEquals(map.size(), checkMap.size());
-        assertEquals(value, map.get(key));
-        return true;
-      }
-    });
-
-    String value = "random string2";
-    checkMap.put(0, value);
-    map.put(0, value);
-
-    checkMap.forEachEntry(new TIntObjectProcedure<Object>() {
-      @Override
-      public boolean execute(int key, Object value) {
-        assertEquals(value, map.get(key));
-        return true;
-      }
-    });
-    assertEquals(map.size(), checkMap.size());
-  }
-
-  public void testConcurrentResourceLoading() throws Exception {
-    final List<String> resourceNames = ContainerUtil.newArrayList();
-    List<URL> urls = ContainerUtil.newArrayList();
-
-    for (File file : new File(PathManager.getHomePathFor(UrlClassLoader.class) + "/lib").listFiles()) {
-      if (file.getName().endsWith(".jar")) {
-        urls.add(file.toURI().toURL());
-
-        ZipFile zipFile = new ZipFile(file);
-        try {
-          Enumeration<? extends ZipEntry> entries = zipFile.entries();
-          while (entries.hasMoreElements()) {
-            resourceNames.add(entries.nextElement().getName());
-          }
-        }
-        finally {
-          zipFile.close();
-        }
-
-      }
-    }
-
-    int attemptCount = 1000; // 10000
-    int threadCount = 3;
-    final int resourceCount = 20;
-
-    ExecutorService executor = Executors.newFixedThreadPool(threadCount, ConcurrencyUtil.newNamedThreadFactory("conc loading"));
-    try {
-      final Random random = new Random();
-      UrlClassLoader.CachePool pool = UrlClassLoader.createCachePool();
-      for (int attempt = 0; attempt < attemptCount; attempt++) {
-        final UrlClassLoader loader = UrlClassLoader.build().urls(urls).parent(null).
-          useCache(pool, new UrlClassLoader.CachingCondition() {
-            @Override
-            public boolean shouldCacheData(@NotNull URL url) {
-              return true; // fails also without cache pool (but with cache enabled), but takes much longer
-            }
-          }).get();
-        //if (attempt % 10 == 0) System.out.println("Attempt " + attempt);
-
-        final List<String> namesToLoad = ContainerUtil.newArrayList();
-        for (int j = 0; j < resourceCount; j++) {
-          namesToLoad.add(resourceNames.get(random.nextInt(resourceNames.size())));
-        }
-
-        List<Future> futures = ContainerUtil.newArrayList();
-        for (int i = 0; i < threadCount; i++) {
-          futures.add(executor.submit(new Runnable() {
-            @Override
-            public void run() {
-              for (String name : namesToLoad) {
-                try {
-                  assertNotNull(findResource(name));
-                }
-                catch (Throwable e) {
-                  System.out.println("Failed loading " + name);
-                  throw new RuntimeException(e);
-                }
-              }
-            }
-
-            private final Random findResourceOrFindResourcesChooser = new Random();
-            private URL findResource(String name) {
-              if (findResourceOrFindResourcesChooser.nextBoolean()) {
-                try {
-                  Enumeration<URL> resources = loader.getResources(name);
-                  assertTrue(resources.hasMoreElements());
-                  return resources.nextElement();
-                }
-                catch (IOException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-              return loader.findResource(name);
-            }
-          }));
-        }
-
-        for (Future future : futures) {
-          future.get();
-        }
-      }
-    }
-    finally {
-      executor.shutdownNow();
-      executor.awaitTermination(1000, TimeUnit.SECONDS);
-    }
-  }
-}
index 66f9453e40d6bbd7569760d0468196e979cb672a..0177c58b2dca32c1081a3379d1404228cdd385f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,9 @@
  */
 package com.intellij.util.lang;
 
-// Nongeneral purpose memory saving map implementation for UrlClassLoader to avoid extra dependencies
+/**
+ * Specialized memory saving map implementation for UrlClassLoader to avoid extra dependencies.
+ */
 final class IntObjectHashMap {
   private int size;
   private int[] keys;
@@ -55,8 +57,8 @@ final class IntObjectHashMap {
   private static int hashIndex(int[] keys, int key) {
     int hash = (int)((key * 0x9E3779B9L) & 0x7fffffff);
     int index = hash & (keys.length - 1);
-    int candidate;
 
+    int candidate;
     while ((candidate = keys[index]) != 0) {
       if (candidate == key) return index;
       if (index == 0) index = keys.length;
@@ -70,9 +72,11 @@ final class IntObjectHashMap {
     int[] newKeys = new int[keys.length << 1];
     Object[] newValues = new Object[newKeys.length];
 
-    for (int i = keys.length; --i >= 0; ) {
+    for (int i = keys.length - 1; i >= 0; i--) {
       int key = keys[i];
-      if (key != 0) doPut(newKeys, newValues, key, values[i]);
+      if (key != 0) {
+        doPut(newKeys, newValues, key, values[i]);
+      }
     }
 
     keys = newKeys;
@@ -80,9 +84,6 @@ final class IntObjectHashMap {
   }
 
   public Object get(int key) {
-    if (key == 0) {
-      return specialZeroValue;
-    }
-    return values[hashIndex(keys, key)];
+    return key == 0 ? specialZeroValue : values[hashIndex(keys, key)];
   }
-}
+}
\ No newline at end of file
diff --git a/platform/util/testSrc/com/intellij/util/lang/IntObjectHashMapTest.java b/platform/util/testSrc/com/intellij/util/lang/IntObjectHashMapTest.java
new file mode 100644 (file)
index 0000000..39933fe
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.util.lang;
+
+import gnu.trove.TIntObjectHashMap;
+import org.junit.Test;
+
+import java.util.Random;
+
+import static org.junit.Assert.assertEquals;
+
+public class IntObjectHashMapTest {
+  @Test
+  public void test() {
+    IntObjectHashMap map = new IntObjectHashMap();
+    TIntObjectHashMap<Object> checkMap = new TIntObjectHashMap<Object>();
+    TIntObjectHashMap<Object> dupesMap = new TIntObjectHashMap<Object>();
+    Random random = new Random();
+    for(int i = 0; i < 1000000; ++i) {
+      int key = random.nextInt();
+      String value = String.valueOf(random.nextInt());
+
+      if (!checkMap.contains(key)) {
+        map.put(key, value);
+        checkMap.put(key, value);
+        assertEquals(map.size(), checkMap.size());
+        assertEquals(value, map.get(key));
+      }
+      else {
+        dupesMap.put(key, value);
+      }
+    }
+
+    dupesMap.put(0, "random string");
+
+    dupesMap.forEachEntry((int k, Object v) -> {
+      checkMap.put(k, v);
+      map.put(k, v);
+      assertEquals(map.size(), checkMap.size());
+      assertEquals(v, map.get(k));
+      return true;
+    });
+
+    String value = "random string2";
+    checkMap.put(0, value);
+    map.put(0, value);
+
+    checkMap.forEachEntry((k, v) -> {
+      assertEquals(v, map.get(k));
+      return true;
+    });
+    assertEquals(map.size(), checkMap.size());
+  }
+}
\ No newline at end of file
diff --git a/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java b/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java
new file mode 100644 (file)
index 0000000..6450d7d
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.util.lang;
+
+import com.intellij.openapi.application.PathManager;
+import com.intellij.util.ConcurrencyUtil;
+import com.intellij.util.ObjectUtils;
+import com.intellij.util.containers.ContainerUtil;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author Dmitry Avdeev
+ */
+public class UrlClassLoaderTest {
+  @Test
+  public void testBootstrapResources() {
+    String name = "com/sun/xml/internal/messaging/saaj/soap/LocalStrings.properties";
+    assertNotNull(UrlClassLoaderTest.class.getClassLoader().getResourceAsStream(name));
+    assertNull(UrlClassLoader.build().get().getResourceAsStream(name));
+    assertNotNull(UrlClassLoader.build().allowBootstrapResources().get().getResourceAsStream(name));
+  }
+
+  @Test
+  public void testConcurrentResourceLoading() throws Exception {
+    List<String> resourceNames = ContainerUtil.newArrayList();
+    List<URL> urls = ContainerUtil.newArrayList();
+
+    File[] libs = ObjectUtils.assertNotNull(new File(PathManager.getHomePathFor(UrlClassLoader.class) + "/lib").listFiles());
+    for (File file : libs) {
+      if (file.getName().endsWith(".jar")) {
+        urls.add(file.toURI().toURL());
+
+        try (ZipFile zipFile = new ZipFile(file)) {
+          Enumeration<? extends ZipEntry> entries = zipFile.entries();
+          while (entries.hasMoreElements()) {
+            resourceNames.add(entries.nextElement().getName());
+          }
+        }
+      }
+    }
+
+    int attemptCount = 1000;
+    int threadCount = 3;
+    int resourceCount = 20;
+
+    ExecutorService executor = Executors.newFixedThreadPool(threadCount, ConcurrencyUtil.newNamedThreadFactory("concurrent loading"));
+    try {
+      Random random = new Random();
+      UrlClassLoader.CachePool pool = UrlClassLoader.createCachePool();
+      for (int attempt = 0; attempt < attemptCount; attempt++) {
+        // fails also without cache pool (but with cache enabled), but takes much longer
+        UrlClassLoader loader = UrlClassLoader.build().urls(urls).parent(null).useCache(pool, (url) -> true).get();
+        List<String> namesToLoad = ContainerUtil.newArrayList();
+        for (int j = 0; j < resourceCount; j++) {
+          namesToLoad.add(resourceNames.get(random.nextInt(resourceNames.size())));
+        }
+
+        List<Future> futures = ContainerUtil.newArrayList();
+        for (int i = 0; i < threadCount; i++) {
+          futures.add(executor.submit(() -> {
+            for (String name : namesToLoad) {
+              try {
+                assertNotNull(findResource(loader, name, random.nextBoolean()));
+              }
+              catch (Throwable e) {
+                System.out.println("Failed loading " + name);
+                throw new RuntimeException(e);
+              }
+            }
+          }));
+        }
+
+        for (Future future : futures) {
+          future.get();
+        }
+      }
+    }
+    finally {
+      executor.shutdownNow();
+      executor.awaitTermination(1000, TimeUnit.SECONDS);
+    }
+  }
+
+  private static URL findResource(UrlClassLoader loader, String name, boolean findAll) {
+    if (findAll) {
+      try {
+        Enumeration<URL> resources = loader.getResources(name);
+        assertTrue(resources.hasMoreElements());
+        return resources.nextElement();
+      }
+      catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+    }
+    else {
+      return loader.findResource(name);
+    }
+  }
+}
\ No newline at end of file