summaryrefslogtreecommitdiff
path: root/android/test
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2014-11-05 16:50:16 -0330
committerMatthew Newhook <matthew@zeroc.com>2014-11-05 16:50:16 -0330
commitc173e3a2c70e2624372095aff7b14cfe9e003ed7 (patch)
tree0df2bf5aca5615bdd31ff3fb200536e1538fa8c4 /android/test
parentFixed copyright header on a bunch of files (diff)
downloadice-c173e3a2c70e2624372095aff7b14cfe9e003ed7.tar.bz2
ice-c173e3a2c70e2624372095aff7b14cfe9e003ed7.tar.xz
ice-c173e3a2c70e2624372095aff7b14cfe9e003ed7.zip
Fixes for Android to correctly support Android studio and gradle builds.
Fix to the SSL plugin for Android. Removed some unused code in the SSL transceiver.
Diffstat (limited to 'android/test')
-rw-r--r--android/test/android/build.gradle38
-rw-r--r--android/test/android/proguard.cfg4
-rw-r--r--android/test/android/src/main/AndroidManifest.xml1
-rw-r--r--android/test/android/src/main/assets/.gitignore1
-rw-r--r--android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java634
-rw-r--r--android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java25
-rw-r--r--android/test/android/testApp.iml8
-rw-r--r--android/test/build.gradle75
-rw-r--r--android/test/plugins/build.gradle46
-rw-r--r--android/test/plugins/testPlugins.iml39
-rw-r--r--android/test/src/test_Ice_acm/test_Ice_acm.iml40
-rw-r--r--android/test/test.iml8
12 files changed, 674 insertions, 245 deletions
diff --git a/android/test/android/build.gradle b/android/test/android/build.gradle
index e9b8193afde..c013be1c3df 100644
--- a/android/test/android/build.gradle
+++ b/android/test/android/build.gradle
@@ -9,6 +9,7 @@
apply plugin: 'com.android.application'
apply from: "$rootProject.projectDir/../java/gradle/ice.gradle"
+apply from: "$rootProject.projectDir/gradle/tests.gradle"
android {
compileSdkVersion ice_compileSdkVersion
@@ -26,7 +27,7 @@ android {
buildTypes {
debug {
- runProguard true
+ runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
}
@@ -37,11 +38,46 @@ android {
}
}
+// Copy the IceTestPlugins.dex file into the android test assets
+// directory.
+//
+// I don't like this approach very much. It would be preferable for
+// the test app to extract the dex file from the jar file but I can't
+// figure out how to do that.
+task copyTask(type: Copy) {
+ from "${rootProject.projectDir}/test/plugins/build/classes/main/IceTestPlugins.dex"
+ into "src/main/assets"
+}
+preBuild.dependsOn(copyTask)
+copyTask.dependsOn(':testPlugins:dexClasses')
+
+clean {
+ delete("src/main/assets/IceTestPlugins.dex")
+}
+
idea.module {
excludeDirs -= file(buildDir)
buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it }
}
+tests.each {
+ def name = it
+ def taskName = "copyTask-${name}"
+ def testName = ":test_Ice_${name}"
+ def dexName = "IceTest_${name}.dex"
+ task "${taskName}"(type: Copy, dependsOn: "${testName}:dexClasses") {
+ from "${rootProject.projectDir}/test/src/test_Ice_${name}/build/classes/main/${dexName}"
+ into "src/main/assets"
+ }
+ preBuild.dependsOn(tasks[taskName])
+
+ clean {
+ delete("src/main/assets/${dexName}")
+ }
+}
+
dependencies {
+ compile project(':Ice')
compile project(':test')
+ compile project(':testPlugins')
}
diff --git a/android/test/android/proguard.cfg b/android/test/android/proguard.cfg
index b1feb1a51bd..4f1735013b0 100644
--- a/android/test/android/proguard.cfg
+++ b/android/test/android/proguard.cfg
@@ -67,6 +67,10 @@
*;
}
-keep interface test.Ice.**
+-keep interface Ice.**
+-keep interface IceInternal.**
+-keep class Ice.**
+-keep class IceInternal.**
# For debugging.
-keepattributes LocalVariableTable, LocalVariableTypeTable
diff --git a/android/test/android/src/main/AndroidManifest.xml b/android/test/android/src/main/AndroidManifest.xml
index 154b6e9a941..0809dd4a3f4 100644
--- a/android/test/android/src/main/AndroidManifest.xml
+++ b/android/test/android/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
android:versionCode="1"
android:versionName="1.0.0">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
+
<!--
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
-->
diff --git a/android/test/android/src/main/assets/.gitignore b/android/test/android/src/main/assets/.gitignore
new file mode 100644
index 00000000000..2cbf86bc394
--- /dev/null
+++ b/android/test/android/src/main/assets/.gitignore
@@ -0,0 +1 @@
+*.dex
diff --git a/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java b/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java
index 811d8060f44..fa96d70976d 100644
--- a/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java
+++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java
@@ -9,42 +9,99 @@
package com.zeroc.testsuite;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
+import java.io.*;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
+
+import Ice.Logger;
+import Ice.Communicator;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
-import test.Util.Application.CommunicatorListener;
-import Ice.Communicator;
+import dalvik.system.DexClassLoader;
+import android.content.Context;
+import android.util.Log;
import android.app.Application;
import android.os.Handler;
import android.os.Build.VERSION;
+import test.Util.Application.CommunicatorListener;
+
public class TestApp extends Application
{
- static private class TestSuiteEntry
+ private final String TAG = "TestApp";
+
+ private ClassLoader getDEXClassLoader(String classDir, ClassLoader parent) throws IOException {
+ if(parent == null)
+ {
+ parent = getClassLoader();
+ }
+
+ File dexInternalStoragePath = new java.io.File(getDir("dex", Context.MODE_PRIVATE), classDir);
+
+ BufferedInputStream bis = new BufferedInputStream(getAssets().open(classDir));
+ OutputStream dexWriter = new BufferedOutputStream(new FileOutputStream(dexInternalStoragePath));
+ final int sz = 8 * 1024;
+ byte[] buf = new byte[sz];
+ int len;
+ while((len = bis.read(buf, 0, sz)) > 0)
+ {
+ dexWriter.write(buf, 0, len);
+ }
+ dexWriter.close();
+ bis.close();
+
+ // Internal storage where the DexClassLoader writes the optimized dex file to
+ final File optimizedDexOutputPath = getDir("outdex", Context.MODE_PRIVATE);
+
+ return new DexClassLoader(
+ dexInternalStoragePath.getAbsolutePath(),
+ optimizedDexOutputPath.getAbsolutePath(),
+ null,
+ parent);
+ }
+
+ static private class TestSuiteBundle
{
- TestSuiteEntry(String name, Class<? extends test.Util.Application> client,
- Class<? extends test.Util.Application> server,
- Class<? extends test.Util.Application> collocated)
+ TestSuiteBundle(String name, ClassLoader loader)
{
_name = name;
- _client = client;
- _server = server;
- _collocated = collocated;
+ _loader = loader;
+
+ String className = "test.Ice." + _name.replace('_', '.');
+ try
+ {
+ _client = (Class<? extends test.Util.Application>)_loader.loadClass(className + ".Client");
+ }
+ catch(ClassNotFoundException e)
+ {
+ }
+ try
+ {
+ _server = (Class<? extends test.Util.Application>)_loader.loadClass(className + ".Server");
+ }
+ catch(ClassNotFoundException e)
+ {
+ }
+ try
+ {
+ _collocated = (Class<? extends test.Util.Application>)_loader.loadClass(className + ".Collocated");
+ }
+ catch(ClassNotFoundException e)
+ {
+ }
+ }
+
+ ClassLoader getClassLoader()
+ {
+ return _loader;
}
String getName()
@@ -53,7 +110,7 @@ public class TestApp extends Application
}
test.Util.Application getClient()
- throws IllegalAccessException, InstantiationException
+ throws IllegalAccessException, InstantiationException
{
if(_client == null)
{
@@ -63,7 +120,7 @@ public class TestApp extends Application
}
test.Util.Application getServer()
- throws IllegalAccessException, InstantiationException
+ throws IllegalAccessException, InstantiationException
{
if(_server == null)
{
@@ -74,7 +131,7 @@ public class TestApp extends Application
}
test.Util.Application getCollocated()
- throws IllegalAccessException, InstantiationException
+ throws IllegalAccessException, InstantiationException
{
if(_collocated == null)
{
@@ -85,121 +142,272 @@ public class TestApp extends Application
}
private String _name;
+ private ClassLoader _loader;
private Class<? extends test.Util.Application> _client;
private Class<? extends test.Util.Application> _server;
private Class<? extends test.Util.Application> _collocated;
}
- static final private TestSuiteEntry[] _tests =
+ private Map<String, TestSuiteBundle> _bundles = new HashMap<String, TestSuiteBundle>();
+
+ static final private String _allTests[] =
{
- new TestSuiteEntry("adapterDeactivation", test.Ice.adapterDeactivation.Client.class,
- test.Ice.adapterDeactivation.Server.class, test.Ice.adapterDeactivation.Collocated.class),
- new TestSuiteEntry("admin", test.Ice.admin.Client.class, test.Ice.admin.Server.class, null),
- new TestSuiteEntry("ami", test.Ice.ami.Client.class, test.Ice.ami.Server.class, null),
- new TestSuiteEntry("binding", test.Ice.binding.Client.class, test.Ice.binding.Server.class, null),
- new TestSuiteEntry("checksum", test.Ice.checksum.Client.class, test.Ice.checksum.Server.class, null),
- new TestSuiteEntry("classLoader", test.Ice.classLoader.Client.class, test.Ice.classLoader.Server.class, null),
- new TestSuiteEntry("custom", test.Ice.custom.Client.class, test.Ice.custom.Server.class,
- test.Ice.custom.Collocated.class),
- new TestSuiteEntry("defaultServant", test.Ice.defaultServant.Client.class, null, null),
- new TestSuiteEntry("defaultValue", test.Ice.defaultValue.Client.class, null, null),
- new TestSuiteEntry("dispatcher", test.Ice.dispatcher.Client.class, test.Ice.dispatcher.Server.class, null),
- new TestSuiteEntry("enums", test.Ice.enums.Client.class, test.Ice.enums.Server.class, null),
- new TestSuiteEntry("exceptions", test.Ice.exceptions.Client.class, test.Ice.exceptions.Server.class,
- test.Ice.exceptions.Collocated.class),
- new TestSuiteEntry("facets", test.Ice.facets.Client.class, test.Ice.facets.Server.class,
- test.Ice.facets.Collocated.class),
- // Require SSL
- //new TestSuiteEntry("hash", test.Ice.hash.Client.class, null, null),
- new TestSuiteEntry("hold", test.Ice.hold.Client.class, test.Ice.hold.Server.class, null),
+ "acm",
+ "adapterDeactivation",
+ "admin",
+ "ami",
+ "background",
+ "binding",
+ "checksum",
+ "classLoader",
+ "custom",
+ "defaultServant",
+ "defaultValue",
+ "dispatcher",
+ // Echo test is only for client side only mappings.
+ "enums",
+ "exceptions",
+ "facets",
+ // Fault tolerance test requires a special setup, so we don't support it.
+ // hash requires too much memory.
+ //"hash",
+ "hold",
// The info test is not currently enabled - it relies on sockets to accurately return
- // address and port information, which really only works in Android 2.3+.
- //new TestSuiteEntry("info", test.Ice.info.Client.class, test.Ice.info.Server.class, null),
- new TestSuiteEntry("inheritance", test.Ice.inheritance.Client.class, test.Ice.inheritance.Server.class,
- test.Ice.inheritance.Collocated.class),
- new TestSuiteEntry("interceptor", test.Ice.interceptor.Client.class, null, null),
- new TestSuiteEntry("invoke", test.Ice.invoke.Client.class, test.Ice.invoke.Server.class, null),
- new TestSuiteEntry("location", test.Ice.location.Client.class, test.Ice.location.Server.class, null),
+ // address and port information, which really only works jjin Android 2.3+.
+ //"info"
+ "inheritance",
+ "interceptor",
+ "interrupt",
+ "invoke",
+ "location",
// The metrics test uses too much memory.
- //new TestSuiteEntry("metrics", test.Ice.metrics.Client.class, test.Ice.metrics.Server.class, null),
- new TestSuiteEntry("objects", test.Ice.objects.Client.class, test.Ice.objects.Server.class,
- test.Ice.objects.Collocated.class),
- new TestSuiteEntry("operations", test.Ice.operations.Client.class, test.Ice.operations.Server.class,
- test.Ice.operations.Collocated.class),
- new TestSuiteEntry("optional", test.Ice.optional.Client.class, test.Ice.optional.Server.class, null),
- new TestSuiteEntry("packagemd", test.Ice.packagemd.Client.class, test.Ice.packagemd.Server.class, null),
- new TestSuiteEntry("proxy", test.Ice.proxy.Client.class, test.Ice.proxy.Server.class,
- test.Ice.proxy.Collocated.class),
- new TestSuiteEntry("retry", test.Ice.retry.Client.class, test.Ice.retry.Server.class, null),
- new TestSuiteEntry("seqMapping", test.Ice.seqMapping.Client.class, test.Ice.seqMapping.Server.class,
- test.Ice.seqMapping.Collocated.class),
- new TestSuiteEntry("serialize", test.Ice.serialize.Client.class, test.Ice.serialize.Server.class, null),
- new TestSuiteEntry("servantLocator", test.Ice.servantLocator.Client.class,
- test.Ice.servantLocator.Server.class, test.Ice.servantLocator.Collocated.class),
- new TestSuiteEntry("slicing/exceptions", test.Ice.slicing.exceptions.Client.class,
- test.Ice.slicing.exceptions.Server.class, null),
- new TestSuiteEntry("slicing/objects", test.Ice.slicing.objects.Client.class,
- test.Ice.slicing.objects.Server.class, null),
- new TestSuiteEntry("stream", test.Ice.stream.Client.class, null, null),
+ //"metrics",
+ // networkProxy support isn't supported due to lack of SOCKS support.
+ // "networkProxy",
+ "objects",
+ "operations",
+ "optional",
+ "packagemd",
+ "plugin",
+ // Properties test isn't supported since it loads files.
+ "proxy",
+ "retry",
+ "seqMapping",
+ "serialize",
+ "servantLocator",
+ "slicing_exceptions",
+ "slicing_objects",
+ "stream",
+ "threadPoolPriority",
// The throughput test uses too much memory.
- //new TestSuiteEntry("throughput", test.Ice.throughput.Client.class, test.Ice.throughput.Server.class, null),
- new TestSuiteEntry("timeout", test.Ice.timeout.Client.class, test.Ice.timeout.Server.class, null),
+ //"throughput", test.Ice.throughput.Client.class, test.Ice.throughput.Server.class, null),
+ "timeout",
+ "udp"
};
- static final private TestSuiteEntry[] _ssltests =
+ static final private String _tcpUnsupportedTestsValues[] =
{
- new TestSuiteEntry("adapterDeactivation", test.Ice.adapterDeactivation.Client.class,
- test.Ice.adapterDeactivation.Server.class, test.Ice.adapterDeactivation.Collocated.class),
- new TestSuiteEntry("ami", test.Ice.ami.Client.class, test.Ice.ami.Server.class, null),
- new TestSuiteEntry("binding", test.Ice.binding.Client.class, test.Ice.binding.Server.class, null),
- new TestSuiteEntry("checksum", test.Ice.checksum.Client.class, test.Ice.checksum.Server.class, null),
- new TestSuiteEntry("classLoader", test.Ice.classLoader.Client.class, test.Ice.classLoader.Server.class, null),
- new TestSuiteEntry("custom", test.Ice.custom.Client.class, test.Ice.custom.Server.class,
- test.Ice.custom.Collocated.class),
- new TestSuiteEntry("defaultServant", test.Ice.defaultServant.Client.class, null, null),
- new TestSuiteEntry("defaultValue", test.Ice.defaultValue.Client.class, null, null),
- new TestSuiteEntry("dispatcher", test.Ice.dispatcher.Client.class, test.Ice.dispatcher.Server.class, null),
- new TestSuiteEntry("enums", test.Ice.enums.Client.class, test.Ice.enums.Server.class, null),
- new TestSuiteEntry("exceptions", test.Ice.exceptions.Client.class, test.Ice.exceptions.Server.class,
- test.Ice.exceptions.Collocated.class),
- new TestSuiteEntry("facets", test.Ice.facets.Client.class, test.Ice.facets.Server.class,
- test.Ice.facets.Collocated.class),
- // The hash test uses too much memory.
- //new TestSuiteEntry("hash", test.Ice.hash.Client.class, null, null),
- new TestSuiteEntry("hold", test.Ice.hold.Client.class, test.Ice.hold.Server.class, null),
- // The info test is not currently enabled - it relies on sockets to accurately return
- // address and port information, which really only works in Android 2.3+.
- //new TestSuiteEntry("info", test.Ice.info.Client.class, test.Ice.info.Server.class, null),
- new TestSuiteEntry("inheritance", test.Ice.inheritance.Client.class, test.Ice.inheritance.Server.class,
- test.Ice.inheritance.Collocated.class),
- new TestSuiteEntry("interceptor", test.Ice.interceptor.Client.class, null, null),
- new TestSuiteEntry("invoke", test.Ice.invoke.Client.class, test.Ice.invoke.Server.class, null),
- new TestSuiteEntry("location", test.Ice.location.Client.class, test.Ice.location.Server.class, null),
- // The metrics test uses too much memory.
- //new TestSuiteEntry("metrics", test.Ice.metrics.Client.class, test.Ice.metrics.Server.class, null),
- new TestSuiteEntry("objects", test.Ice.objects.Client.class, test.Ice.objects.Server.class,
- test.Ice.objects.Collocated.class),
- new TestSuiteEntry("operations", test.Ice.operations.Client.class, test.Ice.operations.Server.class,
- test.Ice.operations.Collocated.class),
- new TestSuiteEntry("optional", test.Ice.optional.Client.class, test.Ice.optional.Server.class, null),
- new TestSuiteEntry("packagemd", test.Ice.packagemd.Client.class, test.Ice.packagemd.Server.class, null),
- new TestSuiteEntry("proxy", test.Ice.proxy.Client.class, test.Ice.proxy.Server.class,
- test.Ice.proxy.Collocated.class),
- new TestSuiteEntry("retry", test.Ice.retry.Client.class, test.Ice.retry.Server.class, null),
- new TestSuiteEntry("serialize", test.Ice.serialize.Client.class, test.Ice.serialize.Server.class, null),
- new TestSuiteEntry("seqMapping", test.Ice.seqMapping.Client.class, test.Ice.seqMapping.Server.class,
- test.Ice.seqMapping.Collocated.class),
- new TestSuiteEntry("servantLocator", test.Ice.servantLocator.Client.class,
- test.Ice.servantLocator.Server.class, test.Ice.servantLocator.Collocated.class),
- new TestSuiteEntry("slicing/exceptions", test.Ice.slicing.exceptions.Client.class,
- test.Ice.slicing.exceptions.Server.class, null),
- new TestSuiteEntry("slicing/objects", test.Ice.slicing.objects.Client.class,
- test.Ice.slicing.objects.Server.class, null),
- new TestSuiteEntry("stream", test.Ice.stream.Client.class, null, null),
- new TestSuiteEntry("timeout", test.Ice.timeout.Client.class, test.Ice.timeout.Server.class, null),
};
- private TestSuiteEntry[] _curtests = _tests;
-
+ static final private Set<String> _tcpUnsupportedTests = new HashSet<String>(Arrays.asList(_tcpUnsupportedTestsValues));
+
+ static final private String _sslUnsupportedTestsValues[] =
+ {
+ "background",
+ "binding",
+ "plugin",
+ "timeout",
+ "udp"
+ };
+ static final private Set<String> _sslUnsupportedTests = new HashSet<String>(Arrays.asList(_sslUnsupportedTestsValues));
+
+ private List<String> _tests = new ArrayList<String>();
+
+ class LogOutput
+ {
+ private BufferedWriter _writer;
+
+ LogOutput()
+ {
+ reopen();
+ }
+
+ void reopen()
+ {
+ try
+ {
+
+ if(_writer != null)
+ {
+ _writer.close();
+ _writer = null;
+ }
+ File logFile = new File(getFilesDir(), "log.txt");
+ if(!logFile.exists())
+ {
+ logFile.createNewFile();
+ }
+ _writer = new BufferedWriter(new FileWriter(logFile, false));
+ }
+ catch (IOException e)
+ {
+ Log.i(TAG, "cannot open log file", e);
+ }
+ }
+
+ void
+ write(StringBuilder message, boolean indent)
+ {
+ if(_writer == null)
+ {
+ return;
+ }
+
+ if(indent)
+ {
+ int idx = 0;
+ while((idx = message.indexOf("\n", idx)) != -1)
+ {
+ message.insert(idx + 1, " ");
+ ++idx;
+ }
+ }
+ synchronized(this)
+ {
+ try
+ {
+ _writer.newLine();
+ _writer.append(message.toString());
+ _writer.flush();
+ }
+ catch(java.io.IOException ex)
+ {
+ }
+ }
+ }
+ }
+ private LogOutput _logOutput;
+
+ class AndroidLogger implements Ice.Logger
+ {
+ private final String _prefix;
+ private String _formattedPrefix = "";
+ private final java.text.DateFormat _date = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
+ private final java.text.SimpleDateFormat _time = new java.text.SimpleDateFormat(" HH:mm:ss:SSS");
+
+ AndroidLogger(String prefix)
+ {
+ _prefix = prefix;
+ if(prefix.length() > 0)
+ {
+ _formattedPrefix = prefix + ": ";
+ }
+ }
+ @Override
+ public void print(String message)
+ {
+ if(_logOutput != null)
+ {
+ StringBuilder s = new StringBuilder(256);
+ s.append("-- ");
+ synchronized(this)
+ {
+ s.append(_date.format(new java.util.Date()));
+ s.append(_time.format(new java.util.Date()));
+ }
+ s.append(' ');
+ s.append(_formattedPrefix);
+ s.append(message);
+ _logOutput.write(s, false);
+ }
+
+ Log.d(TAG, message);
+ }
+
+ @Override
+ public void trace(String category, String message)
+ {
+ if(_logOutput != null)
+ {
+ StringBuilder s = new StringBuilder(256);
+ s.append("-- ");
+ synchronized(this)
+ {
+ s.append(_date.format(new java.util.Date()));
+ s.append(_time.format(new java.util.Date()));
+ }
+ s.append(' ');
+ s.append(_formattedPrefix);
+ s.append(category);
+ s.append(": ");
+ s.append(message);
+ _logOutput.write(s, true);
+ }
+
+ Log.v(category, message);
+ }
+
+ @Override
+ public void warning(String message)
+ {
+ if(_logOutput != null)
+ {
+
+ StringBuilder s = new StringBuilder(256);
+ s.append("-! ");
+ synchronized(this)
+ {
+ s.append(_date.format(new java.util.Date()));
+ s.append(_time.format(new java.util.Date()));
+ }
+ s.append(' ');
+ s.append(_formattedPrefix);
+ s.append("warning: ");
+ s.append(Thread.currentThread().getName());
+ s.append(": ");
+ s.append(message);
+ _logOutput.write(s, true);
+ }
+
+ Log.w(TAG, message);
+ }
+
+ @Override
+ public void error(String message)
+ {
+ if(_logOutput != null)
+ {
+ StringBuilder s = new StringBuilder(256);
+ s.append("!! ");
+ synchronized(this)
+ {
+ s.append(_date.format(new java.util.Date()));
+ s.append(_time.format(new java.util.Date()));
+ }
+ s.append(' ');
+ s.append(_formattedPrefix);
+ s.append("error: ");
+ s.append(Thread.currentThread().getName());
+ s.append(": ");
+ s.append(message);
+ _logOutput.write(s, true);
+ }
+
+ Log.e(TAG, message);
+ }
+
+ @Override
+ public String getPrefix()
+ {
+ return _prefix;
+ }
+
+ @Override
+ public Logger cloneWithPrefix(String s)
+ {
+ return new AndroidLogger(s);
+ }
+ }
+
class MyWriter extends Writer
{
@Override
@@ -251,20 +459,22 @@ public class TestApp extends Application
private boolean _ssl = false;
private boolean _sslInitialized = false;
- private boolean _sslSupported = false;
private boolean _ipv6 = false;
private SSLContext _clientContext = null;
private SSLContext _serverContext = null;
- private SSLInitializationListener _ssllistener;
+ private SSLInitializationListener _sslListener;
static abstract class TestThread extends Thread
{
+ String _testName;
test.Util.Application _app;
protected int _status;
- TestThread(test.Util.Application app)
+ TestThread(String testName, ClassLoader classLoader, test.Util.Application app)
{
+ _testName = testName;
_app = app;
+ _app.setClassLoader(classLoader);
}
public int getStatus()
@@ -281,7 +491,7 @@ public class TestApp extends Application
"--Ice.Default.Host=0:0:0:0:0:0:0:1",
"--Ice.IPv4=1",
"--Ice.IPv6=1",
- "--Ice.PreferIPv6Address=1",
+ "--Ice.PreferIPv6Address=1"
};
String[] nargs = new String[args.length + ipv6Args.length];
@@ -309,18 +519,18 @@ public class TestApp extends Application
{
String[] sslargs =
{
- "--Ice.Plugin.IceSSL=IceSSL.PluginFactory", "--Ice.Default.Protocol=ssl", "--Ice.InitPlugins=0"
+ "--Ice.Plugin.IceSSL=IceSSL.PluginFactory",
+ "--Ice.Default.Protocol=ssl",
+ "--Ice.InitPlugins=0",
+ "--Ice.Trace.Network=3", "--Ice.Trace.Protocol=3"
};
- //
- // Froyo apparently still suffers from Harmony bug 6047, requiring that we
- // disable server-side verification of client certificates.
- //
- if(VERSION.SDK_INT == 8) // android.os.Build.VERSION_CODES.FROYO (8)
+ // SDK versions < 21 only support TLSv1 with SSLEngine.
+ if(VERSION.SDK_INT < 21)
{
String[] arr = new String[sslargs.length + 1];
System.arraycopy(sslargs, 0, arr, 0, sslargs.length);
- arr[arr.length - 1] = "--IceSSL.VerifyPeer=0";
+ arr[arr.length - 1] = "--IceSSL.Protocols=tls1_0";
sslargs = arr;
}
@@ -328,6 +538,7 @@ public class TestApp extends Application
System.arraycopy(args, 0, nargs, 0, args.length);
System.arraycopy(sslargs, 0, nargs, args.length, sslargs.length);
args = nargs;
+
_app.setCommunicatorListener(new CommunicatorListener()
{
public void communicatorInitialized(Communicator c)
@@ -345,9 +556,9 @@ public class TestApp extends Application
{
private test.Util.Application _server;
- ClientThread(test.Util.Application c, test.Util.Application s)
+ ClientThread(String testName, ClassLoader classLoader, test.Util.Application c, test.Util.Application s)
{
- super(c);
+ super(testName, classLoader, c);
_server = s;
setName("ClientThread");
}
@@ -356,11 +567,25 @@ public class TestApp extends Application
{
String[] args =
{
- "--Ice.NullHandleAbort=1", "--Ice.Warn.Connections=1"
+ "--Ice.NullHandleAbort=1",
+ "--Ice.Warn.Connections=1"
};
args = setupAddress(args, _ipv6);
-
+
+ if(_testName == "plugin")
+ {
+ try
+ {
+ _app.setClassLoader(getDEXClassLoader("IceTestPlugins.dex", _app.getClassLoader()));
+ }
+ catch(IOException e)
+ {
+ // The plugin test will fail.
+ Log.e(TAG, "IOException loading IceTestPlugins.dex", e);
+ }
+ }
+
if(_ssl)
{
args = setupssl(args, _clientContext);
@@ -379,9 +604,9 @@ public class TestApp extends Application
private test.Util.Application _client;
private ClientThread _clientThread;
- ServerThread(test.Util.Application c, test.Util.Application s)
+ ServerThread(String testName, ClassLoader classLoader, test.Util.Application c, test.Util.Application s)
{
- super(s);
+ super(testName, classLoader, s);
setName("ServerThread");
_client = c;
}
@@ -409,7 +634,7 @@ public class TestApp extends Application
{
if(_client != null)
{
- _clientThread = new ClientThread(_client, _app);
+ _clientThread = new ClientThread(_testName, _app.getClassLoader(), _client, _app);
_clientThread.start();
}
}
@@ -438,9 +663,9 @@ public class TestApp extends Application
class CollocatedThread extends TestThread
{
- CollocatedThread(test.Util.Application c)
+ CollocatedThread(String testName, ClassLoader classLoader, test.Util.Application c)
{
- super(c);
+ super(testName, classLoader, c);
setName("CollocatedThread");
}
@@ -545,9 +770,9 @@ public class TestApp extends Application
_serverContext = serverContext;
_sslInitialized = true;
- if(_ssllistener != null)
+ if(_sslListener != null)
{
- final SSLInitializationListener listener = _ssllistener;
+ final SSLInitializationListener listener = _sslListener;
if(_clientContext == null | _serverContext == null)
{
_handler.post(new Runnable()
@@ -574,23 +799,11 @@ public class TestApp extends Application
@Override
public void onCreate()
{
+ // By default we don't log to a file.
+ //_logOutput = new LogOutput();
+ Ice.Util.setProcessLogger(new AndroidLogger(""));
_handler = new Handler();
-
- if(VERSION.SDK_INT == 8) // android.os.Build.VERSION_CODES.FROYO (8)
- {
- //
- // Workaround for a bug in Android 2.2 (Froyo).
- //
- // See http://code.google.com/p/android/issues/detail?id=9431
- //
- java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
- java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
- }
-
- //
- // The SSLEngine class only works properly in Froyo (or later).
- //
- _sslSupported = VERSION.SDK_INT >= 8;
+ configureTests();
}
@Override
@@ -598,14 +811,10 @@ public class TestApp extends Application
{
}
+
public List<String> getTestNames()
{
- List<String> s = new ArrayList<String>();
- for(TestSuiteEntry t : _curtests)
- {
- s.add(t.getName());
- }
- return s;
+ return _tests;
}
synchronized public void setTestListener(TestListener listener)
@@ -613,7 +822,7 @@ public class TestApp extends Application
_listener = listener;
if(_listener != null && _currentTest != -1)
{
- _listener.onStartTest(_curtests[_currentTest].getName());
+ _listener.onStartTest(_tests.get(_currentTest));
for(String s : _strings)
{
_listener.onOutput(s);
@@ -628,7 +837,7 @@ public class TestApp extends Application
public void startNextTest()
{
assert _complete;
- startTest((_currentTest + 1) % _curtests.length);
+ startTest((_currentTest + 1) % _tests.size());
}
synchronized public void startTest(int position)
@@ -641,63 +850,83 @@ public class TestApp extends Application
_complete = false;
_strings.clear();
- TestSuiteEntry entry = _curtests[position];
+ String testName = _tests.get(position);
+
test.Util.Application client;
test.Util.Application server;
test.Util.Application collocated;
-
+ ClassLoader classLoader;
if(_listener != null)
{
- _listener.onStartTest(entry.getName());
+ _listener.onStartTest(testName);
}
try
{
- client = entry.getClient();
- server = entry.getServer();
- collocated = entry.getCollocated();
+ TestSuiteBundle bundle = _bundles.get(testName);
+ if(bundle == null)
+ {
+ bundle = new TestSuiteBundle(testName, getDEXClassLoader("IceTest_" + testName + ".dex", null));
+ _bundles.put(testName, bundle);
+ }
+ classLoader = bundle.getClassLoader();
+ client = bundle.getClient();
+ server = bundle.getServer();
+ collocated = bundle.getCollocated();
}
catch(IllegalAccessException e)
{
- e.printStackTrace(pw);
+ Log.w(TAG, "IllegalAccessException: test " + testName, e);
postOnComplete(-1);
return;
}
catch(InstantiationException e)
{
- e.printStackTrace(pw);
+ Log.w(TAG, "InstantiationException: test " + testName, e);
postOnComplete(-1);
return;
}
+ catch(IOException e)
+ {
+ Log.w(TAG, "IOException: test " + testName, e);
+ postOnComplete(-1);
+ return;
+ }
+
+ // Uncomment this if you want to reopen the logfile for each test.
+ //if(_logOutput != null)
+ //{
+ // _logOutput.reopen();
+ //}
List<TestThread> l = new ArrayList<TestThread>();
if(server != null)
{
+ server.setLogger(new AndroidLogger(testName + "_server"));
server.setWriter(new MyWriter());
// All servers must have a client.
assert client != null;
- client.setWriter(new MyWriter());
- l.add(new ServerThread(client, server));
+ client.setWriter(new MyWriter());
+ client.setLogger(new AndroidLogger(testName + "_client"));
+ l.add(new ServerThread(testName, classLoader, client, server));
if(collocated != null)
{
+ collocated.setLogger(new AndroidLogger(testName + "_collocated"));
collocated.setWriter(new MyWriter());
- l.add(new CollocatedThread(collocated));
+ l.add(new CollocatedThread(testName, classLoader, collocated));
}
}
else
{
client.setWriter(new MyWriter());
- l.add(new ClientThread(client, null));
+ client.setLogger(new AndroidLogger(testName + "_client"));
+ l.add(new ClientThread(testName, classLoader, client, null));
}
TestRunner r = new TestRunner(l);
r.setDaemon(true);
r.start();
}
- public boolean isSSLSupported()
- {
- return _sslSupported;
- }
public void setIPv6(boolean ipv6)
{
@@ -706,26 +935,18 @@ public class TestApp extends Application
public void setSSL(boolean ssl)
{
- assert(!ssl || (ssl && _sslSupported));
_ssl = ssl;
- if(_ssl)
+ configureTests();
+ if(_currentTest > _tests.size()-1)
{
- _curtests = _ssltests;
- }
- else
- {
- _curtests = _tests;
- }
- if(_currentTest > _curtests.length-1)
- {
- _currentTest = _curtests.length-1;
+ _currentTest = _tests.size()-1;
}
if(_ssl && !_sslInitialized)
{
- if(_ssllistener != null)
+ if(_sslListener != null)
{
- _ssllistener.onWait();
+ _sslListener.onWait();
}
Runnable r = new Runnable()
{
@@ -760,7 +981,7 @@ public class TestApp extends Application
}
catch(Exception ex)
{
- ex.printStackTrace();
+ Log.w(TAG, "Exception", ex);
}
sslContextInitialized(clientContext, serverContext);
}
@@ -773,9 +994,26 @@ public class TestApp extends Application
}
}
+ private void configureTests()
+ {
+ _tests.clear();
+ for(String s : _allTests)
+ {
+ if(_ssl && _sslUnsupportedTests.contains(s))
+ {
+ continue;
+ }
+ if(!_ssl && _tcpUnsupportedTests.contains(s))
+ {
+ continue;
+ }
+ _tests.add(s);
+ }
+ }
+
synchronized public void setSSLInitializationListener(SSLInitializationListener listener)
{
- _ssllistener = listener;
+ _sslListener = listener;
if(_ssl)
{
if(!_sslInitialized)
diff --git a/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java b/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java
index 0b0a1178d6f..a2577a5aa87 100644
--- a/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java
+++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java
@@ -72,24 +72,17 @@ public class TestSuite extends ListActivity
}
});
CheckBox secure = (CheckBox)findViewById(R.id.secure);
- if(app.isSSLSupported())
+ secure.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
- secure.setOnCheckedChangeListener(new OnCheckedChangeListener()
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
- {
- app.setSSL(isChecked);
- _tests.clear();
- _tests.addAll(app.getTestNames());
- adapter.notifyDataSetChanged();
- }
- });
- }
- else
- {
- secure.setEnabled(false);
- }
-
+ app.setSSL(isChecked);
+ _tests.clear();
+ _tests.addAll(app.getTestNames());
+ adapter.notifyDataSetChanged();
+ }
+ });
+
CheckBox ipv6 = (CheckBox)findViewById(R.id.ipv6);
ipv6.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
diff --git a/android/test/android/testApp.iml b/android/test/android/testApp.iml
index 829e330b6bc..bbcb89208ba 100644
--- a/android/test/android/testApp.iml
+++ b/android/test/android/testApp.iml
@@ -10,7 +10,7 @@
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
- <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
+ <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
@@ -78,11 +78,13 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
- <orderEntry type="jdk" jdkName="Android API 17 Platform" jdkType="Android SDK" />
+ <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" exported="" name="IceTest" level="project" />
<orderEntry type="library" exported="" name="Ice" level="project" />
+ <orderEntry type="module" module-name="test" exported="" />
+ <orderEntry type="module" module-name="testPlugins" exported="" />
</component>
</module>
diff --git a/android/test/build.gradle b/android/test/build.gradle
index b5bde9e83fa..8444ad17fff 100644
--- a/android/test/build.gradle
+++ b/android/test/build.gradle
@@ -12,32 +12,15 @@ apply from: "$rootProject.projectDir/../java/gradle/ice.gradle"
ext.testDir = "$rootProject.projectDir/../java/test/src/main/java/test"
apply from: "$rootProject.projectDir/../java/test/slice.gradle"
-
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
+apply from: "$rootProject.projectDir/gradle/tests.gradle"
+apply from: "$rootProject.projectDir/gradle/dex.gradle"
sourceSets {
main {
java {
srcDir "$rootProject.projectDir/../java/test/src/main/java"
- exclude 'Ice/translator'
- exclude 'Slice/generation'
- exclude '**/lambda'
- exclude 'ejb'
- exclude '**/Freeze'
- exclude '**/Glacier2'
- exclude '**/IceBox'
- exclude '**/IceDiscovery'
- exclude '**/IceGrid'
- exclude '**/Slice'
- exclude '**/IceSSL'
- exclude '**/Ice/faultTolerance'
- exclude '**/Ice/hash'
- exclude '**/Ice/metrics'
- exclude '**/Ice/plugin'
- exclude '**/Ice/properties'
- exclude '**/Ice/threadPoolPriority'
- exclude '**/Ice/throughput'
+ include 'test/Util/**'
+ exclude 'test/Ice/**/lambda'
}
}
}
@@ -51,11 +34,49 @@ dependencies {
compile project(':Ice')
}
-jar {
- archiveName = "IceTest.jar"
- destinationDir = new File("$rootProject.projectDir/lib/")
-}
+tests.each {
+
+ def name = it
+ def dirName = name.replace('_', '/')
+ project(":test_Ice_${name}") {
+ apply plugin: 'java'
+ apply from: "$rootProject.projectDir/../java/gradle/ice.gradle"
+
+ sourceSets {
+ main {
+ java {
+ srcDir "$rootProject.projectDir/../java/test/src/main/java"
+ include "test/Ice/${dirName}/**"
+ exclude 'test/Ice/**/lambda'
+ srcDir "$rootProject.projectDir/test/build/generated-src/"
+ include "test/Ice/${dirName}/**"
+ }
+ }
+ }
+
+ def dexName = "IceTest_${name}.dex"
+ task dexClasses {
+ inputs.dir "${buildDir}/classes/main"
+ outputs.file "${buildDir}/classes/main/${dexName}"
+ doLast {
+ exec {
+ commandLine "${dxCmd}", '--dex',
+ "--output=${buildDir}/classes/main/${dexName}",
+ "${buildDir}/classes/main"
+ }
+ }
+ }
+
+ dexClasses.dependsOn('classes')
+
+ configure(jar) {
+ include "${dexName}"
+ }
+ jar.dependsOn(dexClasses)
-clean {
- delete("$rootProject.projectDir/lib/IceTest.jar")
+ dependencies {
+ compile project(':test')
+ compile project(':Ice')
+ }
+ }
}
diff --git a/android/test/plugins/build.gradle b/android/test/plugins/build.gradle
new file mode 100644
index 00000000000..a36daf037fb
--- /dev/null
+++ b/android/test/plugins/build.gradle
@@ -0,0 +1,46 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+apply plugin: 'java'
+apply from: "$rootProject.projectDir/../java/gradle/ice.gradle"
+apply from: "$rootProject.projectDir/gradle/dex.gradle"
+
+sourceSets {
+ main {
+ java {
+ srcDir "$rootProject.projectDir/../java/test/plugins/src/main/java"
+ include 'test/Ice/plugin/plugins/**'
+ }
+ }
+}
+
+task dexClasses << {
+ exec {
+ commandLine "${dxCmd}", '--dex',
+ "--output=${buildDir}/classes/main/IceTestPlugins.dex",
+ "${buildDir}/classes/main"
+ }
+}
+
+dexClasses.dependsOn('classes')
+
+// The jar file should only include IceTestPlugins.dex
+configure(jar) {
+ include 'IceTestPlugins.dex'
+}
+jar.dependsOn(dexClasses)
+
+idea.module {
+ excludeDirs -= file(buildDir)
+ buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it }
+}
+
+dependencies {
+ compile project(':Ice')
+}
diff --git a/android/test/plugins/testPlugins.iml b/android/test/plugins/testPlugins.iml
new file mode 100644
index 00000000000..74e8501b7a5
--- /dev/null
+++ b/android/test/plugins/testPlugins.iml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="android" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="android-gradle" name="Android-Gradle">
+ <configuration>
+ <option name="GRADLE_PROJECT_PATH" value=":testPlugins" />
+ </configuration>
+ </facet>
+ <facet type="java-gradle" name="Java-Gradle">
+ <configuration>
+ <option name="BUILD_FOLDER_PATH" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/build/classes/main" />
+ <output-test url="file://$MODULE_DIR$/build/classes/test" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+ <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+ <excludeFolder url="file://$MODULE_DIR$/build/classes" />
+ <excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/libs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+ </content>
+ <content url="file://$MODULE_DIR$/../../../java/test/plugins/src/main/java">
+ <sourceFolder url="file://$MODULE_DIR$/../../../java/test/plugins/src/main/java" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="Ice" exported="" />
+ </component>
+</module>
+
diff --git a/android/test/src/test_Ice_acm/test_Ice_acm.iml b/android/test/src/test_Ice_acm/test_Ice_acm.iml
new file mode 100644
index 00000000000..c655abc99cf
--- /dev/null
+++ b/android/test/src/test_Ice_acm/test_Ice_acm.iml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="android" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="android-gradle" name="Android-Gradle">
+ <configuration>
+ <option name="GRADLE_PROJECT_PATH" value=":test_Ice_acm" />
+ </configuration>
+ </facet>
+ <facet type="java-gradle" name="Java-Gradle">
+ <configuration>
+ <option name="BUILD_FOLDER_PATH" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/build/classes/main" />
+ <output-test url="file://$MODULE_DIR$/build/classes/test" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$/../../build/generated-src">
+ <sourceFolder url="file://$MODULE_DIR$/../../build/generated-src" isTestSource="false" />
+ </content>
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+ <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+ <excludeFolder url="file://$MODULE_DIR$/build" />
+ </content>
+ <content url="file://$MODULE_DIR$/../../../../java/test/src/main/java">
+ <sourceFolder url="file://$MODULE_DIR$/../../../../java/test/src/main/java" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="test" exported="" />
+ <orderEntry type="module" module-name="Ice" exported="" />
+ </component>
+</module>
+
diff --git a/android/test/test.iml b/android/test/test.iml
index ee8c862c3ce..a109c969e9c 100644
--- a/android/test/test.iml
+++ b/android/test/test.iml
@@ -25,6 +25,14 @@
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/build/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/libs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set1.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set2.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set3.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set4.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set5.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/set6.d.xml" />
+ <excludeFolder url="file://$MODULE_DIR$/build/slice2freezej.df.xml" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<content url="file://$MODULE_DIR$/../../java/test/src/main/java">