diff options
Diffstat (limited to 'android/test')
17 files changed, 1483 insertions, 0 deletions
diff --git a/android/test/android/.gitignore b/android/test/android/.gitignore new file mode 100644 index 00000000000..36f971e324f --- /dev/null +++ b/android/test/android/.gitignore @@ -0,0 +1 @@ +bin/* diff --git a/android/test/android/build.gradle b/android/test/android/build.gradle new file mode 100644 index 00000000000..e9b8193afde --- /dev/null +++ b/android/test/android/build.gradle @@ -0,0 +1,47 @@ +// ********************************************************************** +// +// 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: 'com.android.application' +apply from: "$rootProject.projectDir/../java/gradle/ice.gradle" + +android { + compileSdkVersion ice_compileSdkVersion + buildToolsVersion ice_buildToolsVersion + + defaultConfig { + applicationId "com.zeroc.test" + minSdkVersion ice_minSdkVersion + targetSdkVersion ice_targetSdkVersion + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_6 + targetCompatibility JavaVersion.VERSION_1_6 + } + } + + buildTypes { + debug { + runProguard true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' + } + + release { + runProguard true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' + } + } +} + +idea.module { + excludeDirs -= file(buildDir) + buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it } +} + +dependencies { + compile project(':test') +} diff --git a/android/test/android/proguard.cfg b/android/test/android/proguard.cfg new file mode 100644 index 00000000000..b1feb1a51bd --- /dev/null +++ b/android/test/android/proguard.cfg @@ -0,0 +1,74 @@ +# This is a configuration file for ProGuard. +# http://proguard.sourceforge.net/index.html#manual/usage.html + +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-verbose + +# Optimization is turned off by default. Dex does not like code run +# through the ProGuard optimize and preverify steps (and performs some +# of these optimizations on its own). +-dontoptimize +-dontpreverify +# Note that if you want to enable optimization, you cannot just +# include optimization flags in your own project configuration file; +# instead you will need to point to the +# "proguard-android-optimize.txt" file instead of this one from your +# project.properties file. + +-keepattributes *Annotation* +-keep public class com.google.vending.licensing.ILicensingService +-keep public class com.android.vending.licensing.ILicensingService + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native +-keepclasseswithmembernames class * { + native <methods>; +} + +# keep setters in Views so that animations can still work. +# see http://proguard.sourceforge.net/manual/examples.html#beans +-keepclassmembers public class * extends android.view.View { + void set*(***); + *** get*(); +} + +# We want to keep methods in Activity that could be used in the XML attribute onClick +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-keepclassmembers class **.R$* { + public static <fields>; +} + +# The support library contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontwarn android.support.** + +-dontwarn IceInternal.Instance$Timer* +-dontwarn java.nio.channels.* +-dontwarn java.net.StandardSocketOptions +-dontwarn java.nio.charset.StandardCharsets + +-keepnames class ** { *; } + +-keep class test.Ice.** { + *; +} +-keep interface test.Ice.** + +# For debugging. +-keepattributes LocalVariableTable, LocalVariableTypeTable +-dontoptimize +-dontobfuscate
\ No newline at end of file diff --git a/android/test/android/project.properties b/android/test/android/project.properties new file mode 100644 index 00000000000..c8d545017a3 --- /dev/null +++ b/android/test/android/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt +proguard.config=proguard.cfg + +# Project target. +target=android-17 diff --git a/android/test/android/src/main/AndroidManifest.xml b/android/test/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..154b6e9a941 --- /dev/null +++ b/android/test/android/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.zeroc.testsuite" + 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 + --> + <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17"/> + <application android:icon="@raw/icon" android:label="@string/app_name" android:name="TestApp" + android:allowBackup="false"> + <activity android:name=".TestSuite" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity android:name="TestContainer"></activity> +</application> +</manifest>
\ No newline at end of file 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 new file mode 100644 index 00000000000..811d8060f44 --- /dev/null +++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java @@ -0,0 +1,795 @@ +// ********************************************************************** +// +// 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. +// +// ********************************************************************** + +package com.zeroc.testsuite; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; +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 javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; + +import test.Util.Application.CommunicatorListener; +import Ice.Communicator; +import android.app.Application; +import android.os.Handler; +import android.os.Build.VERSION; + +public class TestApp extends Application +{ + static private class TestSuiteEntry + { + TestSuiteEntry(String name, Class<? extends test.Util.Application> client, + Class<? extends test.Util.Application> server, + Class<? extends test.Util.Application> collocated) + { + _name = name; + _client = client; + _server = server; + _collocated = collocated; + } + + String getName() + { + return _name; + } + + test.Util.Application getClient() + throws IllegalAccessException, InstantiationException + { + if(_client == null) + { + return null; + } + return _client.newInstance(); + } + + test.Util.Application getServer() + throws IllegalAccessException, InstantiationException + { + if(_server == null) + { + return null; + } + + return _server.newInstance(); + } + + test.Util.Application getCollocated() + throws IllegalAccessException, InstantiationException + { + if(_collocated == null) + { + return null; + } + + return _collocated.newInstance(); + } + + private String _name; + 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 = + { + 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), + // 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("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), + // 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), + }; + + static final private TestSuiteEntry[] _ssltests = + { + 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; + + class MyWriter extends Writer + { + @Override + public void close() + throws IOException + { + flush(); + } + + @Override + public void flush() + throws IOException + { + final String s = _data.toString(); + if(s.length() > 0) + { + postOnOutput(s); + } + _data = new StringBuffer(); + } + + @Override + public void write(char[] buf, int offset, int count) + throws IOException + { + _data.append(buf, offset, count); + } + + private StringBuffer _data = new StringBuffer(); + } + + private Handler _handler; + private LinkedList<String> _strings = new LinkedList<String>(); + + public interface TestListener + { + public void onStartTest(String test); + + public void onOutput(String s); + + public void onComplete(int status); + } + + private TestListener _listener = null; + + private boolean _complete = false; + private int _status = 0; + private int _currentTest = -1; + + 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; + + static abstract class TestThread extends Thread + { + test.Util.Application _app; + protected int _status; + + TestThread(test.Util.Application app) + { + _app = app; + } + + public int getStatus() + { + return _status; + } + + protected String[] setupAddress(String[] args, boolean ipv6) + { + if(ipv6) + { + String[] ipv6Args = + { + "--Ice.Default.Host=0:0:0:0:0:0:0:1", + "--Ice.IPv4=1", + "--Ice.IPv6=1", + "--Ice.PreferIPv6Address=1", + }; + + String[] nargs = new String[args.length + ipv6Args.length]; + System.arraycopy(args, 0, nargs, 0, args.length); + System.arraycopy(ipv6Args, 0, nargs, args.length, ipv6Args.length); + return nargs; + } + else + { + String[] ipv4Args = + { + "--Ice.Default.Host=127.0.0.1", + "--Ice.IPv4=1", + "--Ice.IPv6=0" + }; + + String[] nargs = new String[args.length + ipv4Args.length]; + System.arraycopy(args, 0, nargs, 0, args.length); + System.arraycopy(ipv4Args, 0, nargs, args.length, ipv4Args.length); + return nargs; + } + } + + protected String[] setupssl(String[] args, final SSLContext context) + { + String[] sslargs = + { + "--Ice.Plugin.IceSSL=IceSSL.PluginFactory", "--Ice.Default.Protocol=ssl", "--Ice.InitPlugins=0" + }; + + // + // 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) + { + String[] arr = new String[sslargs.length + 1]; + System.arraycopy(sslargs, 0, arr, 0, sslargs.length); + arr[arr.length - 1] = "--IceSSL.VerifyPeer=0"; + sslargs = arr; + } + + String[] nargs = new String[args.length + sslargs.length]; + 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) + { + IceSSL.Plugin plugin = (IceSSL.Plugin)c.getPluginManager().getPlugin("IceSSL"); + plugin.setContext(context); + c.getPluginManager().initializePlugins(); + } + }); + return args; + } + } + + class ClientThread extends TestThread + { + private test.Util.Application _server; + + ClientThread(test.Util.Application c, test.Util.Application s) + { + super(c); + _server = s; + setName("ClientThread"); + } + + public void run() + { + String[] args = + { + "--Ice.NullHandleAbort=1", "--Ice.Warn.Connections=1" + }; + + args = setupAddress(args, _ipv6); + + if(_ssl) + { + args = setupssl(args, _clientContext); + } + _status = _app.main("Client", args); + // If the client failed, then stop the server -- the test is over. + if(_status != 0 && _server != null) + { + _server.stop(); + } + } + } + + class ServerThread extends TestThread + { + private test.Util.Application _client; + private ClientThread _clientThread; + + ServerThread(test.Util.Application c, test.Util.Application s) + { + super(s); + setName("ServerThread"); + _client = c; + } + + public void run() + { + String[] args = + { + "--Ice.NullHandleAbort=1", + "--Ice.Warn.Connections=1", + "--Ice.ThreadPool.Server.Size=1", + "--Ice.ThreadPool.Server.SizeMax=3", + "--Ice.ThreadPool.Server.SizeWarn=0" + }; + + args = setupAddress(args, _ipv6); + + if(_ssl) + { + args = setupssl(args, _serverContext); + } + _app.setServerReadyListener(new test.Util.Application.ServerReadyListener() + { + public void serverReady() + { + if(_client != null) + { + _clientThread = new ClientThread(_client, _app); + _clientThread.start(); + } + } + }); + + _status = _app.main("Server", args); + if(_clientThread != null) + { + while(_clientThread.isAlive()) + { + try + { + _clientThread.join(); + } + catch(InterruptedException e1) + { + } + } + if(_clientThread.getStatus() != 0) + { + _status = _clientThread.getStatus(); + } + } + } + } + + class CollocatedThread extends TestThread + { + CollocatedThread(test.Util.Application c) + { + super(c); + setName("CollocatedThread"); + } + + public void run() + { + String[] args = + { + "--Ice.NullHandleAbort=1" + }; + + args = setupAddress(args, _ipv6); + + if(_ssl) + { + args = setupssl(args, _clientContext); + } + _status = _app.main("Collocated", args); + } + } + + class TestRunner extends Thread + { + private List<TestThread> _threads; + + TestRunner(List<TestThread> l) + { + _threads = l; + } + + public void run() + { + for(TestThread t : _threads) + { + t.start(); + while(t.isAlive()) + { + try + { + t.join(); + } + catch(InterruptedException e) + { + } + } + int status = t.getStatus(); + if(status != 0) + { + postOnComplete(status); + return; + } + } + postOnComplete(0); + } + } + + synchronized private void postOnOutput(final String s) + { + _strings.add(s); + if(_listener != null) + { + final TestListener l = _listener; + _handler.post(new Runnable() + { + public void run() + { + l.onOutput(s); + } + }); + } + } + + synchronized private void postOnComplete(final int status) + { + _status = status; + _complete = true; + if(_listener != null) + { + final TestListener l = _listener; + _handler.post(new Runnable() + { + public void run() + { + l.onComplete(status); + } + }); + } + } + + public interface SSLInitializationListener + { + public void onComplete(); + + public void onError(); + + public void onWait(); + } + + // This is called from the SSL initialization thread. + synchronized private void sslContextInitialized(SSLContext clientContext, SSLContext serverContext) + { + _clientContext = clientContext; + _serverContext = serverContext; + _sslInitialized = true; + + if(_ssllistener != null) + { + final SSLInitializationListener listener = _ssllistener; + if(_clientContext == null | _serverContext == null) + { + _handler.post(new Runnable() + { + public void run() + { + listener.onError(); + } + }); + } + else + { + _handler.post(new Runnable() + { + public void run() + { + listener.onComplete(); + } + }); + } + } + } + + @Override + public void onCreate() + { + _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; + } + + @Override + public void onTerminate() + { + } + + public List<String> getTestNames() + { + List<String> s = new ArrayList<String>(); + for(TestSuiteEntry t : _curtests) + { + s.add(t.getName()); + } + return s; + } + + synchronized public void setTestListener(TestListener listener) + { + _listener = listener; + if(_listener != null && _currentTest != -1) + { + _listener.onStartTest(_curtests[_currentTest].getName()); + for(String s : _strings) + { + _listener.onOutput(s); + } + if(_complete) + { + _listener.onComplete(_status); + } + } + } + + public void startNextTest() + { + assert _complete; + startTest((_currentTest + 1) % _curtests.length); + } + + synchronized public void startTest(int position) + { + assert !_ssl || (_ssl && _sslInitialized); + + PrintWriter pw = new PrintWriter(new MyWriter()); + + _currentTest = position; + _complete = false; + _strings.clear(); + + TestSuiteEntry entry = _curtests[position]; + test.Util.Application client; + test.Util.Application server; + test.Util.Application collocated; + + if(_listener != null) + { + _listener.onStartTest(entry.getName()); + } + + try + { + client = entry.getClient(); + server = entry.getServer(); + collocated = entry.getCollocated(); + } + catch(IllegalAccessException e) + { + e.printStackTrace(pw); + postOnComplete(-1); + return; + } + catch(InstantiationException e) + { + e.printStackTrace(pw); + postOnComplete(-1); + return; + } + + List<TestThread> l = new ArrayList<TestThread>(); + if(server != null) + { + server.setWriter(new MyWriter()); + // All servers must have a client. + assert client != null; + client.setWriter(new MyWriter()); + l.add(new ServerThread(client, server)); + if(collocated != null) + { + collocated.setWriter(new MyWriter()); + l.add(new CollocatedThread(collocated)); + } + } + else + { + client.setWriter(new MyWriter()); + l.add(new ClientThread(client, null)); + } + TestRunner r = new TestRunner(l); + r.setDaemon(true); + r.start(); + } + + public boolean isSSLSupported() + { + return _sslSupported; + } + + public void setIPv6(boolean ipv6) + { + _ipv6 = ipv6; + } + + public void setSSL(boolean ssl) + { + assert(!ssl || (ssl && _sslSupported)); + _ssl = ssl; + if(_ssl) + { + _curtests = _ssltests; + } + else + { + _curtests = _tests; + } + if(_currentTest > _curtests.length-1) + { + _currentTest = _curtests.length-1; + } + + if(_ssl && !_sslInitialized) + { + if(_ssllistener != null) + { + _ssllistener.onWait(); + } + Runnable r = new Runnable() + { + private SSLContext initializeContext(java.io.InputStream cert) + throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, + FileNotFoundException, UnrecoverableKeyException, KeyManagementException + { + SSLContext context = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + + KeyStore ks = KeyStore.getInstance("BKS"); + char[] passphrase = "password".toCharArray(); + ks.load(cert, passphrase); + kmf.init(ks, passphrase); + + TrustManagerFactory tmf = + TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + tmf.init(ks); + + context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + return context; + } + + public void run() + { + SSLContext clientContext = null; + SSLContext serverContext = null; + try + { + clientContext = initializeContext(getResources().openRawResource(R.raw.client)); + serverContext = initializeContext(getResources().openRawResource(R.raw.server)); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + sslContextInitialized(clientContext, serverContext); + } + }; + + Thread t = new Thread(r); + t.setName("Initialize SSL Thread"); + t.setDaemon(true); + t.start(); + } + } + + synchronized public void setSSLInitializationListener(SSLInitializationListener listener) + { + _ssllistener = listener; + if(_ssl) + { + if(!_sslInitialized) + { + listener.onWait(); + } + else if(_clientContext == null || _serverContext == null) + { + listener.onError(); + } + else + { + listener.onComplete(); + } + } + } +} diff --git a/android/test/android/src/main/java/com/zeroc/testsuite/TestContainer.java b/android/test/android/src/main/java/com/zeroc/testsuite/TestContainer.java new file mode 100644 index 00000000000..0c9dacbaf69 --- /dev/null +++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestContainer.java @@ -0,0 +1,113 @@ +// ********************************************************************** +// +// 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. +// +// ********************************************************************** + +package com.zeroc.testsuite; + +import java.util.LinkedList; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; +import android.widget.Button; + +public class TestContainer extends ListActivity implements TestApp.TestListener +{ + private LinkedList<String> _strings = new LinkedList<String>(); + private ArrayAdapter<String> _adapter; + private boolean _partial = false; + private Button _next; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.container); + _adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, _strings); + setListAdapter(_adapter); + + _next = (Button)findViewById(R.id.next); + _next.setOnClickListener(new android.view.View.OnClickListener() + { + public void onClick(android.view.View v) + { + TestApp app = (TestApp)getApplication(); + app.startNextTest(); + } + }); + _next.setEnabled(false); + } + + @Override + public void onResume() + { + super.onResume(); + TestApp app = (TestApp)getApplication(); + app.setTestListener(this); + } + + @Override + public void onStop() + { + super.onStop(); + TestApp app = (TestApp)getApplication(); + app.setTestListener(null); + } + + public void onStartTest(String test) + { + setTitle(test); + _partial = false; + _strings.clear(); + _adapter.notifyDataSetChanged(); + _next.setEnabled(false); + } + + public void onComplete(int status) + { + _next.setEnabled(true); + } + + public void onOutput(String s) + { + int start = 0; + int end = s.length(); + int pos; + do + { + pos = s.indexOf('\n', start); + if(pos != -1) + { + addData(s.substring(start, pos), false); + start = pos+1; + } + } + while(start < end && pos != -1); + if(start < end) + { + addData(s.substring(start, end), true); + } + } + + private void addData(String s, boolean partialLine) + { + if(_partial) + { + String last = _strings.removeLast(); + last = last + s; + _strings.add(last); + _adapter.notifyDataSetChanged(); + } + else + { + _adapter.add(s); + } + _partial = partialLine; + } +} 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 new file mode 100644 index 00000000000..0b0a1178d6f --- /dev/null +++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java @@ -0,0 +1,143 @@ +// ********************************************************************** +// +// 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. +// +// ********************************************************************** + +package com.zeroc.testsuite; + +import java.util.ArrayList; +import java.util.List; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ListActivity; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ListView; +import android.widget.CompoundButton.OnCheckedChangeListener; + +public class TestSuite extends ListActivity +{ + private static final int DIALOG_INITIALIZING = 1; + private static final int DIALOG_SSL_FAILED = 2; + private List<String> _tests = new ArrayList<String>(); + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + final TestApp app = (TestApp)getApplication(); + _tests.addAll(app.getTestNames()); + final ArrayAdapter<String> adapter = + new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, _tests); + setListAdapter(adapter); + app.setSSLInitializationListener(new TestApp.SSLInitializationListener() + { + private boolean dismiss = false; + + public void onComplete() + { + if(dismiss) + { + dismissDialog(DIALOG_INITIALIZING); + } + } + + public void onError() + { + if(dismiss) + { + dismissDialog(DIALOG_INITIALIZING); + } + showDialog(DIALOG_SSL_FAILED); + } + + public void onWait() + { + // Show the initializing dialog. + dismiss = true; + showDialog(DIALOG_INITIALIZING); + } + }); + CheckBox secure = (CheckBox)findViewById(R.id.secure); + if(app.isSSLSupported()) + { + secure.setOnCheckedChangeListener(new OnCheckedChangeListener() + { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + app.setSSL(isChecked); + _tests.clear(); + _tests.addAll(app.getTestNames()); + adapter.notifyDataSetChanged(); + } + }); + } + else + { + secure.setEnabled(false); + } + + CheckBox ipv6 = (CheckBox)findViewById(R.id.ipv6); + ipv6.setOnCheckedChangeListener(new OnCheckedChangeListener() + { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + app.setIPv6(isChecked); + } + }); + } + + protected void onListItemClick(ListView l, View v, int position, long id) + { + TestApp app = (TestApp)getApplication(); + app.startTest(position); + startActivity(new Intent(this, TestContainer.class)); + } + + @Override + protected Dialog onCreateDialog(int id) + { + switch (id) + { + case DIALOG_INITIALIZING: + { + ProgressDialog dialog = new ProgressDialog(this); + dialog.setTitle("Initializing"); + dialog.setMessage("Please wait while initializing SSL..."); + dialog.setIndeterminate(true); + dialog.setCancelable(false); + return dialog; + } + + case DIALOG_SSL_FAILED: + { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Error"); + builder.setMessage("SSL Initialization failed"); + builder.setCancelable(false); + builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + finish(); + } + }); + return builder.create(); + } + } + return null; + } +} diff --git a/android/test/android/src/main/res/layout/container.xml b/android/test/android/src/main/res/layout/container.xml new file mode 100644 index 00000000000..91afb966be7 --- /dev/null +++ b/android/test/android/src/main/res/layout/container.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + > + + <ListView + android:id="@android:id/list" + android:layout_width="fill_parent" + android:layout_height="0dip" + android:layout_weight="1" + android:stackFromBottom="true" + android:transcriptMode="alwaysScroll"/> + + <Button + android:id="@+id/next" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:text="@string/next" + /> + + </LinearLayout> + diff --git a/android/test/android/src/main/res/layout/main.xml b/android/test/android/src/main/res/layout/main.xml new file mode 100644 index 00000000000..3a8a534ecb3 --- /dev/null +++ b/android/test/android/src/main/res/layout/main.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:padding="5dip" + > + + <ListView + android:id="@android:id/list" + android:layout_width="fill_parent" + android:layout_height="0dip" + android:layout_weight="1" + android:stackFromBottom="true" + + /> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingBottom="5dip" + > + + <TextView + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="30" + android:text="@string/ssl" + /> + + <CheckBox + android:id="@+id/secure" + android:layout_width="0dip" + android:layout_weight="70" + android:layout_height="wrap_content" + /> + + <TextView + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="30" + android:text="@string/ipv6" + /> + + <CheckBox + android:id="@+id/ipv6" + android:layout_width="0dip" + android:layout_weight="70" + android:layout_height="wrap_content" + /> + + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/android/test/android/src/main/res/raw/client.bks b/android/test/android/src/main/res/raw/client.bks Binary files differnew file mode 100644 index 00000000000..538d360fac0 --- /dev/null +++ b/android/test/android/src/main/res/raw/client.bks diff --git a/android/test/android/src/main/res/raw/icon.png b/android/test/android/src/main/res/raw/icon.png Binary files differnew file mode 100644 index 00000000000..75024841d32 --- /dev/null +++ b/android/test/android/src/main/res/raw/icon.png diff --git a/android/test/android/src/main/res/raw/server.bks b/android/test/android/src/main/res/raw/server.bks Binary files differnew file mode 100644 index 00000000000..1216ff6f26d --- /dev/null +++ b/android/test/android/src/main/res/raw/server.bks diff --git a/android/test/android/src/main/res/values/strings.xml b/android/test/android/src/main/res/values/strings.xml new file mode 100644 index 00000000000..797e31f6429 --- /dev/null +++ b/android/test/android/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Test Suite</string> + <string name="next">Next</string> + <string name="ssl">SSL</string> + <string name="ipv6">IPv6</string> +</resources> diff --git a/android/test/android/testApp.iml b/android/test/android/testApp.iml new file mode 100644 index 00000000000..829e330b6bc --- /dev/null +++ b/android/test/android/testApp.iml @@ -0,0 +1,88 @@ +<?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=":testApp" /> + </configuration> + </facet> + <facet type="android" name="Android"> + <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="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" /> + <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" /> + <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" /> + <option name="ALLOW_USER_CONFIGURATION" value="false" /> + <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" /> + <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" /> + <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" /> + <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" /> + </configuration> + </facet> + </component> + <component name="NewModuleRootManager" inherit-compiler-output="false"> + <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" /> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> + <excludeFolder url="file://$MODULE_DIR$/build/generated-src" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> + <excludeFolder url="file://$MODULE_DIR$/build/outputs" /> + </content> + <orderEntry type="jdk" jdkName="Android API 17 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" /> + </component> +</module> + diff --git a/android/test/build.gradle b/android/test/build.gradle new file mode 100644 index 00000000000..b5bde9e83fa --- /dev/null +++ b/android/test/build.gradle @@ -0,0 +1,61 @@ +// ********************************************************************** +// +// 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" + +ext.testDir = "$rootProject.projectDir/../java/test/src/main/java/test" +apply from: "$rootProject.projectDir/../java/test/slice.gradle" + +sourceCompatibility = 1.7 +targetCompatibility = 1.7 + +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' + } + } +} + +idea.module { + excludeDirs -= file(buildDir) + buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it } +} + +dependencies { + compile project(':Ice') +} + +jar { + archiveName = "IceTest.jar" + destinationDir = new File("$rootProject.projectDir/lib/") +} + +clean { + delete("$rootProject.projectDir/lib/IceTest.jar") +} diff --git a/android/test/test.iml b/android/test/test.iml new file mode 100644 index 00000000000..ee8c862c3ce --- /dev/null +++ b/android/test/test.iml @@ -0,0 +1,38 @@ +<?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" /> + </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/tmp" /> + </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="Ice" exported="" /> + </component> +</module> + |