diff options
Diffstat (limited to 'java-compat/test/android/controller/src')
-rw-r--r-- | java-compat/test/android/controller/src/main/AndroidManifest.xml | 25 | ||||
-rw-r--r-- | java-compat/test/android/controller/src/main/assets/.gitignore | 1 | ||||
-rw-r--r-- | java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerActivity.java | 144 | ||||
-rw-r--r-- | java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerApp.java | 547 | ||||
-rw-r--r-- | java-compat/test/android/controller/src/main/res/layout/main.xml | 55 | ||||
-rw-r--r-- | java-compat/test/android/controller/src/main/res/raw/client.bks | bin | 0 -> 3524 bytes | |||
-rw-r--r-- | java-compat/test/android/controller/src/main/res/raw/icon.png | bin | 0 -> 3180 bytes | |||
-rw-r--r-- | java-compat/test/android/controller/src/main/res/raw/server.bks | bin | 0 -> 3558 bytes | |||
-rw-r--r-- | java-compat/test/android/controller/src/main/res/values/strings.xml | 5 |
9 files changed, 777 insertions, 0 deletions
diff --git a/java-compat/test/android/controller/src/main/AndroidManifest.xml b/java-compat/test/android/controller/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..20a819e4cad --- /dev/null +++ b/java-compat/test/android/controller/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.zeroc.testcontroller" + android:versionCode="1" + android:versionName="1.0.0"> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> + <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> + <uses-permission android:name="android.permission.BLUETOOTH" /> + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> + + <!-- + http://developer.android.com/guide/topics/manifest/uses-sdk-element.html + --> + <application android:icon="@raw/icon" android:label="@string/app_name" android:name="ControllerApp" + android:allowBackup="false"> + <activity android:name="ControllerActivity" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> +</application> +</manifest> diff --git a/java-compat/test/android/controller/src/main/assets/.gitignore b/java-compat/test/android/controller/src/main/assets/.gitignore new file mode 100644 index 00000000000..2cbf86bc394 --- /dev/null +++ b/java-compat/test/android/controller/src/main/assets/.gitignore @@ -0,0 +1 @@ +*.dex diff --git a/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerActivity.java b/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerActivity.java new file mode 100644 index 00000000000..85b478e0621 --- /dev/null +++ b/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerActivity.java @@ -0,0 +1,144 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2018 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.testcontroller; + +import java.util.LinkedList; +import android.app.*; +import android.bluetooth.BluetoothAdapter; +import android.content.Context; +import android.content.Intent; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.widget.*; +import android.view.View; + +public class ControllerActivity extends ListActivity +{ + private WifiManager _wifiManager; + private WifiManager.MulticastLock _lock; + private LinkedList<String> _output = new LinkedList<String>(); + private ArrayAdapter<String> _outputAdapter; + private ArrayAdapter<String> _ipv4Adapter; + private ArrayAdapter<String> _ipv6Adapter; + + private static final int REQUEST_ENABLE_BT = 1; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + _wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE); + _lock = _wifiManager.createMulticastLock("com.zeroc.testcontroller"); + _lock.acquire(); + } + + @Override + public void onStart() + { + super.onStart(); + + // + // Enable Bluetooth if necessary. + // + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if(adapter == null) + { + Toast.makeText(this, R.string.no_bluetooth, Toast.LENGTH_SHORT).show(); + setup(false); + } + else if(!adapter.isEnabled()) + { + Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + startActivityForResult(enableIntent, REQUEST_ENABLE_BT); + } + else + { + setup(true); + } + } + + @Override + protected void onActivityResult(int req, int res, Intent data) + { + switch(req) + { + case REQUEST_ENABLE_BT: + { + if(_outputAdapter == null) + { + if(res == Activity.RESULT_OK) + { + setup(true); + } + else + { + Toast.makeText(this, R.string.no_bluetooth, Toast.LENGTH_SHORT).show(); + setup(false); + } + } + break; + } + } + } + + synchronized private void setup(boolean bluetooth) + { + _outputAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, _output); + setListAdapter(_outputAdapter); + + final ControllerApp app = (ControllerApp)getApplication(); + final java.util.List<String> ipv4Addresses = app.getAddresses(false); + _ipv4Adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, ipv4Addresses); + Spinner s = (Spinner)findViewById(R.id.ipv4); + s.setAdapter(_ipv4Adapter); + s.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() + { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) + { + app.setIpv4Address(ipv4Addresses.get((int)id)); + } + + @Override + public void onNothingSelected(AdapterView<?> arg0) + { + } + }); + s.setSelection(0); + + final java.util.List<String> ipv6Addresses = app.getAddresses(true); + _ipv6Adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, ipv6Addresses); + s = (Spinner)findViewById(R.id.ipv6); + s.setAdapter(_ipv6Adapter); + s.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() + { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) + { + app.setIpv6Address(ipv6Addresses.get((int)id)); + } + + @Override + public void onNothingSelected(AdapterView<?> arg0) + { + } + }); + s.setSelection(0); + app.startController(this, bluetooth); + } + + public synchronized void println(String data) + { + _output.add(data); + _outputAdapter.notifyDataSetChanged(); + } +} diff --git a/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerApp.java b/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerApp.java new file mode 100644 index 00000000000..78c207a517c --- /dev/null +++ b/java-compat/test/android/controller/src/main/java/com/zeroc/testcontroller/ControllerApp.java @@ -0,0 +1,547 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2018 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.testcontroller; + +import java.io.*; +import java.util.*; + +import Ice.Logger; +import Ice.Communicator; + +import android.content.Context; +import android.os.Build; +import android.util.Log; +import android.app.Application; + +import Test.Common.ProcessControllerRegistryPrxHelper; +import Test.Common.ProcessControllerRegistryPrx; +import Test.Common.ProcessControllerPrx; +import Test.Common.ProcessControllerPrxHelper; + +public class ControllerApp extends Application +{ + private final String TAG = "ControllerApp"; + private ControllerI _controllerI; + private ControllerActivity _activity; + private java.util.Map<String, ClassLoader> _classLoaders = new java.util.HashMap<String, ClassLoader>(); + private String _ipv4Address; + private String _ipv6Address; + + static private class TestSuiteBundle + { + @SuppressWarnings("unchecked") + TestSuiteBundle(String name, ClassLoader loader) throws ClassNotFoundException + { + _loader = loader; + _class = (Class<? extends test.TestHelper>)_loader.loadClass(name); + } + + test.TestHelper newInstance() + throws IllegalAccessException, InstantiationException + { + if(_class == null) + { + return null; + } + return _class.newInstance(); + } + + ClassLoader getClassLoader() + { + return _loader; + } + + private String _name; + private ClassLoader _loader; + private Class<? extends test.TestHelper> _class; + } + + class AndroidLogger implements Ice.Logger + { + private final String _prefix; + + AndroidLogger(String prefix) + { + _prefix = prefix; + } + + @Override + public void print(String message) + { + Log.d(TAG, message); + } + + @Override + public void trace(String category, String message) + { + Log.v(category, message); + } + + @Override + public void warning(String message) + { + Log.w(TAG, message); + } + + @Override + public void error(String message) + { + Log.e(TAG, message); + } + + @Override + public String getPrefix() + { + return _prefix; + } + + @Override + public Logger cloneWithPrefix(String s) + { + return new AndroidLogger(s); + } + } + + @Override + public void onCreate() + { + super.onCreate(); + Ice.Util.setProcessLogger(new AndroidLogger("")); + } + + synchronized public void setIpv4Address(String address) + { + _ipv4Address = address; + } + + synchronized public void setIpv6Address(String address) + { + int i = address.indexOf("%"); + _ipv6Address = i == -1 ? address : address.substring(i); + } + + public List<String> getAddresses(boolean ipv6) + { + List<String> addresses = new java.util.ArrayList<String>(); + try + { + java.util.Enumeration<java.net.NetworkInterface> ifaces = java.net.NetworkInterface.getNetworkInterfaces(); + while(ifaces.hasMoreElements()) + { + java.net.NetworkInterface iface = ifaces.nextElement(); + java.util.Enumeration<java.net.InetAddress> addrs = iface.getInetAddresses(); + while (addrs.hasMoreElements()) + { + java.net.InetAddress addr = addrs.nextElement(); + if((ipv6 && addr instanceof java.net.Inet6Address) || + (!ipv6 && !(addr instanceof java.net.Inet6Address))) + { + addresses.add(addr.getHostAddress()); + } + } + } + } + catch(java.net.SocketException ex) + { + } + return addresses; + } + + public synchronized void startController(ControllerActivity activity, boolean bluetooth) + { + _activity = activity; + if(_controllerI == null) + { + _controllerI = new ControllerI(bluetooth); + } + } + + public synchronized void println(final String data) + { + _activity.runOnUiThread(new Runnable() + { + @Override + public void run() + { + synchronized(ControllerApp.this) + { + _activity.println(data); + } + } + }); + } + + public static boolean isEmulator() + { + return Build.FINGERPRINT.startsWith("generic") || + Build.FINGERPRINT.startsWith("unknown") || + Build.MODEL.contains("google_sdk") || + Build.MODEL.contains("Emulator") || + Build.MODEL.contains("Android SDK built for x86") || + Build.MANUFACTURER.contains("Genymotion") || + (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || + Build.PRODUCT.equals("google_sdk"); + } + + class ControllerI + { + public ControllerI(boolean bluetooth) + { + Ice.InitializationData initData = new Ice.InitializationData(); + initData.properties = Ice.Util.createProperties(); + initData.properties.setProperty("Ice.ThreadPool.Server.SizeMax", "10"); + initData.properties.setProperty("ControllerAdapter.Endpoints", "tcp"); + //initData.properties.setProperty("Ice.Trace.Network", "3"); + //initData.properties.setProperty("Ice.Trace.Protocol", "1"); + initData.properties.setProperty("ControllerAdapter.AdapterId", java.util.UUID.randomUUID().toString()); + initData.properties.setProperty("Ice.Override.ConnectTimeout", "1000"); + if(!isEmulator()) + { + if(bluetooth) + { + initData.properties.setProperty("Ice.Plugin.IceBT", "IceBT.PluginFactory"); + } + initData.properties.setProperty("Ice.Plugin.IceDiscovery", "IceDiscovery.PluginFactory"); + initData.properties.setProperty("IceDiscovery.DomainId", "TestController"); + } + _communicator = Ice.Util.initialize(initData); + Ice.ObjectAdapter adapter = _communicator.createObjectAdapter("ControllerAdapter"); + ProcessControllerPrx processController = ProcessControllerPrxHelper.uncheckedCast( + adapter.add(new ProcessControllerI(), Ice.Util.stringToIdentity("AndroidCompat/ProcessController"))); + adapter.activate(); + if(isEmulator()) + { + ProcessControllerRegistryPrx registry = ProcessControllerRegistryPrxHelper.uncheckedCast( + _communicator.stringToProxy("Util/ProcessControllerRegistry:tcp -h 10.0.2.2 -p 15001")); + registerProcessController(adapter, registry, processController); + } + println("AndroidCompat/ProcessController"); + } + + public void + registerProcessController(final Ice.ObjectAdapter adapter, + final ProcessControllerRegistryPrx registry, + final ProcessControllerPrx processController) + { + registry.begin_ice_ping( + new Ice.Callback() + { + public void completed(Ice.AsyncResult r) + { + try + { + registry.end_ice_ping(r); + Ice.Connection connection = registry.ice_getCachedConnection(); + connection.setAdapter(adapter); + connection.setACM(new Ice.IntOptional(5), + new Ice.Optional<Ice.ACMClose>(Ice.ACMClose.CloseOff), + new Ice.Optional<Ice.ACMHeartbeat>(Ice.ACMHeartbeat.HeartbeatAlways)); + + connection.setCloseCallback(new Ice.CloseCallback() + { + @Override + public void closed(Ice.Connection con) + { + println("connection with process controller registry closed"); + while(true) + { + try + { + Thread.sleep(500); + break; + } + catch(InterruptedException e) + { + } + } + registerProcessController(adapter, registry, processController); + } + }); + + registry.begin_setProcessController(processController, + new Ice.Callback() + { + public void completed(Ice.AsyncResult r) + { + try + { + registry.end_setProcessController(r); + } + catch(Ice.Exception ex) + { + handleException(ex, adapter, registry, processController); + } + } + }); + } + catch(Ice.Exception ex) + { + handleException(ex, adapter, registry, processController); + } + } + }); + } + + public void handleException(Throwable ex, + final Ice.ObjectAdapter adapter, + final ProcessControllerRegistryPrx registry, + final ProcessControllerPrx processController) + { + if(ex instanceof Ice.ConnectFailedException || ex instanceof Ice.TimeoutException) + { + while(true) + { + try + { + Thread.sleep(500); + break; + } + catch(InterruptedException e) + { + } + } + registerProcessController(adapter, registry, processController); + } + else + { + println(ex.toString()); + } + } + + public void destroy() + { + _communicator.destroy(); + } + + private ProcessControllerRegistryPrx _registry; + private Ice.Communicator _communicator; + } + + class ControllerHelperI extends Thread implements test.TestHelper.ControllerHelper + { + public ControllerHelperI(TestSuiteBundle bundle, String[] args, String exe) + { + _bundle = bundle; + _args = args; + } + + public void communicatorInitialized(Communicator communicator) + { + if(communicator.getProperties().getProperty("Ice.Plugin.IceSSL").equals("IceSSL.PluginFactory")) + { + IceSSL.Plugin plugin = (IceSSL.Plugin)communicator.getPluginManager().getPlugin("IceSSL"); + String keystore = communicator.getProperties().getProperty("IceSSL.Keystore"); + communicator.getProperties().setProperty("IceSSL.Keystore", ""); + java.io.InputStream certs = getResources().openRawResource( + keystore.equals("client.bks") ? R.raw.client : R.raw.server); + plugin.setKeystoreStream(certs); + plugin.setTruststoreStream(certs); + communicator.getPluginManager().initializePlugins(); + } + } + + public void run() + { + try + { + _helper = _bundle.newInstance(); + _helper.setClassLoader(_bundle.getClassLoader()); + _helper.setControllerHelper(this); + _helper.setWriter(new Writer() + { + @Override + public void close() throws IOException + { + } + + @Override + public void flush() throws IOException + { + } + + @Override + public void write(char[] buf, int offset, int count) + throws IOException + { + _out.append(buf, offset, count); + } + }); + + _helper.run(_args); + completed(0); + } + catch(Exception ex) + { + ex.printStackTrace(_helper.getWriter()); + completed(-1); + } + } + + public void shutdown() + { + if(_helper != null) + { + _helper.shutdown(); + } + } + + public String getOutput() + { + return _out.toString(); + } + + synchronized public void serverReady() + { + _ready = true; + notifyAll(); + } + + synchronized private void completed(int status) + { + _completed = true; + _status = status; + notifyAll(); + } + + synchronized private void waitReady(int timeout) + throws Test.Common.ProcessFailedException + { + long now = IceInternal.Time.currentMonotonicTimeMillis(); + while(!_ready && !_completed) + { + try + { + wait(timeout * 1000); + if(IceInternal.Time.currentMonotonicTimeMillis() - now > timeout * 1000) + { + throw new Test.Common.ProcessFailedException("timed out waiting for the process to be ready"); + } + } + catch(java.lang.InterruptedException ex) + { + } + } + + if(_completed && _status != 0) + { + throw new Test.Common.ProcessFailedException(_out.toString()); + } + } + + synchronized private int waitSuccess(int timeout) + throws Test.Common.ProcessFailedException + { + long now = IceInternal.Time.currentMonotonicTimeMillis(); + while(!_completed) + { + try + { + wait(timeout * 1000); + if(IceInternal.Time.currentMonotonicTimeMillis() - now > timeout * 1000) + { + throw new Test.Common.ProcessFailedException("timed out waiting for the process to be ready"); + } + } + catch(java.lang.InterruptedException ex) + { + } + } + return _status; + } + + private TestSuiteBundle _bundle; + private String[] _args; + private String _exe; + private test.TestHelper _helper; + private boolean _ready = false; + private boolean _completed = false; + private int _status = 0; + private final StringBuffer _out = new StringBuffer(); + } + + class ProcessControllerI extends Test.Common._ProcessControllerDisp + { + public Test.Common.ProcessPrx start(final String testsuite, final String exe, String[] args, Ice.Current current) + throws Test.Common.ProcessFailedException + { + println("starting " + testsuite + " " + exe + "... "); + String className = "test." + testsuite.replace("/", ".") + "." + + exe.substring(0, 1).toUpperCase() + exe.substring(1); + try + { + TestSuiteBundle bundle = new TestSuiteBundle(className, getClassLoader()); + ControllerHelperI controllerHelper = new ControllerHelperI(bundle, args, exe); + controllerHelper.start(); + return Test.Common.ProcessPrxHelper.uncheckedCast( + current.adapter.addWithUUID(new ProcessI(controllerHelper))); + } + catch(ClassNotFoundException ex) + { + throw new Test.Common.ProcessFailedException( + "testsuite `" + testsuite + "' exe ` " + exe + "' start failed:\n" + ex.toString()); + } + } + + public String getHost(String protocol, boolean ipv6, Ice.Current current) + { + if(isEmulator()) + { + return "127.0.0.1"; + } + else + { + synchronized(ControllerApp.this) + { + return ipv6 ? _ipv6Address : _ipv4Address; + } + } + } + } + + class ProcessI extends Test.Common._ProcessDisp + { + public ProcessI(ControllerHelperI controllerHelper) + { + _controllerHelper = controllerHelper; + } + + public void waitReady(int timeout, Ice.Current current) + throws Test.Common.ProcessFailedException + { + _controllerHelper.waitReady(timeout); + } + + public int waitSuccess(int timeout, Ice.Current current) + throws Test.Common.ProcessFailedException + { + return _controllerHelper.waitSuccess(timeout); + } + + public String terminate(Ice.Current current) + { + _controllerHelper.shutdown(); + current.adapter.remove(current.id); + while(true) + { + try + { + _controllerHelper.join(); + break; + } + catch(InterruptedException ex) + { + } + } + return _controllerHelper.getOutput(); + } + + private ControllerHelperI _controllerHelper; + } +} diff --git a/java-compat/test/android/controller/src/main/res/layout/main.xml b/java-compat/test/android/controller/src/main/res/layout/main.xml new file mode 100644 index 00000000000..df4c8db98c7 --- /dev/null +++ b/java-compat/test/android/controller/src/main/res/layout/main.xml @@ -0,0 +1,55 @@ +<?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"> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingBottom="5dip"> + <TextView + android:layout_width="5dip" + android:layout_weight="25" + android:layout_height="wrap_content" + android:text="IPv4" + android:layout_gravity="center_vertical"/> + + <Spinner + android:id="@+id/ipv4" + android:layout_width="5dip" + android:layout_weight="75" + android:layout_height="wrap_content" + android:drawSelectorOnTop="false"/> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingBottom="5dip"> + <TextView + android:layout_width="0dip" + android:layout_weight="25" + android:layout_height="wrap_content" + android:text="IPv6" + android:layout_gravity="center_vertical"/> + + <Spinner + android:id="@+id/ipv6" + android:layout_width="0dip" + android:layout_weight="75" + android:layout_height="wrap_content" + android:drawSelectorOnTop="false"/> + </LinearLayout> + + <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"/> +</LinearLayout> diff --git a/java-compat/test/android/controller/src/main/res/raw/client.bks b/java-compat/test/android/controller/src/main/res/raw/client.bks Binary files differnew file mode 100644 index 00000000000..7a5b88d45c1 --- /dev/null +++ b/java-compat/test/android/controller/src/main/res/raw/client.bks diff --git a/java-compat/test/android/controller/src/main/res/raw/icon.png b/java-compat/test/android/controller/src/main/res/raw/icon.png Binary files differnew file mode 100644 index 00000000000..75024841d32 --- /dev/null +++ b/java-compat/test/android/controller/src/main/res/raw/icon.png diff --git a/java-compat/test/android/controller/src/main/res/raw/server.bks b/java-compat/test/android/controller/src/main/res/raw/server.bks Binary files differnew file mode 100644 index 00000000000..2da60311b53 --- /dev/null +++ b/java-compat/test/android/controller/src/main/res/raw/server.bks diff --git a/java-compat/test/android/controller/src/main/res/values/strings.xml b/java-compat/test/android/controller/src/main/res/values/strings.xml new file mode 100644 index 00000000000..f96e345d87f --- /dev/null +++ b/java-compat/test/android/controller/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Test Controller</string> + <string name="no_bluetooth">Bluetooth disabled</string> +</resources> |