diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/CoreTests/android/core/NsdServiceInfoTest.java | 163 | ||||
-rw-r--r-- | tests/DozeTest/Android.mk | 14 | ||||
-rw-r--r-- | tests/DozeTest/AndroidManifest.xml | 35 | ||||
-rwxr-xr-x | tests/DozeTest/res/drawable-hdpi/ic_app.png | bin | 0 -> 3608 bytes | |||
-rw-r--r-- | tests/DozeTest/res/drawable-mdpi/ic_app.png | bin | 0 -> 5198 bytes | |||
-rw-r--r-- | tests/DozeTest/res/layout/dream.xml | 41 | ||||
-rw-r--r-- | tests/DozeTest/res/values/strings.xml | 25 | ||||
-rw-r--r-- | tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java | 166 | ||||
-rw-r--r-- | tests/TileBenchmark/Android.mk | 4 |
9 files changed, 446 insertions, 2 deletions
diff --git a/tests/CoreTests/android/core/NsdServiceInfoTest.java b/tests/CoreTests/android/core/NsdServiceInfoTest.java new file mode 100644 index 0000000..5bf0167 --- /dev/null +++ b/tests/CoreTests/android/core/NsdServiceInfoTest.java @@ -0,0 +1,163 @@ +package android.core; + +import android.test.AndroidTestCase; + +import android.os.Bundle; +import android.os.Parcel; +import android.os.StrictMode; +import android.net.nsd.NsdServiceInfo; +import android.util.Log; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.net.InetAddress; +import java.net.UnknownHostException; + + +public class NsdServiceInfoTest extends AndroidTestCase { + + public final static InetAddress LOCALHOST; + static { + // Because test. + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + + InetAddress _host = null; + try { + _host = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { } + LOCALHOST = _host; + } + + public void testLimits() throws Exception { + NsdServiceInfo info = new NsdServiceInfo(); + + // Non-ASCII keys. + boolean exceptionThrown = false; + try { + info.setAttribute("猫", "meow"); + } catch (IllegalArgumentException e) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + assertEmptyServiceInfo(info); + + // ASCII keys with '=' character. + exceptionThrown = false; + try { + info.setAttribute("kitten=", "meow"); + } catch (IllegalArgumentException e) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + assertEmptyServiceInfo(info); + + // Single key + value length too long. + exceptionThrown = false; + try { + String longValue = "loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + + "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + + "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + + "ooooooooooooooooooooooooooooong"; // 248 characters. + info.setAttribute("longcat", longValue); // Key + value == 255 characters. + } catch (IllegalArgumentException e) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + assertEmptyServiceInfo(info); + + // Total TXT record length too long. + exceptionThrown = false; + int recordsAdded = 0; + try { + for (int i = 100; i < 300; ++i) { + // 6 char key + 5 char value + 2 bytes overhead = 13 byte record length. + String key = String.format("key%d", i); + info.setAttribute(key, "12345"); + recordsAdded++; + } + } catch (IllegalArgumentException e) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + assertTrue(100 == recordsAdded); + assertTrue(info.getTxtRecord().length == 1300); + } + + public void testParcel() throws Exception { + NsdServiceInfo emptyInfo = new NsdServiceInfo(); + checkParcelable(emptyInfo); + + NsdServiceInfo fullInfo = new NsdServiceInfo(); + fullInfo.setServiceName("kitten"); + fullInfo.setServiceType("_kitten._tcp"); + fullInfo.setPort(4242); + fullInfo.setHost(LOCALHOST); + checkParcelable(fullInfo); + + NsdServiceInfo noHostInfo = new NsdServiceInfo(); + noHostInfo.setServiceName("kitten"); + noHostInfo.setServiceType("_kitten._tcp"); + noHostInfo.setPort(4242); + checkParcelable(noHostInfo); + + NsdServiceInfo attributedInfo = new NsdServiceInfo(); + attributedInfo.setServiceName("kitten"); + attributedInfo.setServiceType("_kitten._tcp"); + attributedInfo.setPort(4242); + attributedInfo.setHost(LOCALHOST); + attributedInfo.setAttribute("color", "pink"); + attributedInfo.setAttribute("sound", (new String("にゃあ")).getBytes("UTF-8")); + attributedInfo.setAttribute("adorable", (String) null); + attributedInfo.setAttribute("sticky", "yes"); + attributedInfo.setAttribute("siblings", new byte[] {}); + attributedInfo.setAttribute("edge cases", new byte[] {0, -1, 127, -128}); + attributedInfo.removeAttribute("sticky"); + checkParcelable(attributedInfo); + + // Sanity check that we actually wrote attributes to attributedInfo. + assertTrue(attributedInfo.getAttributes().keySet().contains("adorable")); + String sound = new String(attributedInfo.getAttributes().get("sound"), "UTF-8"); + assertTrue(sound.equals("にゃあ")); + byte[] edgeCases = attributedInfo.getAttributes().get("edge cases"); + assertTrue(Arrays.equals(edgeCases, new byte[] {0, -1, 127, -128})); + assertFalse(attributedInfo.getAttributes().keySet().contains("sticky")); + } + + public void checkParcelable(NsdServiceInfo original) { + // Write to parcel. + Parcel p = Parcel.obtain(); + Bundle writer = new Bundle(); + writer.putParcelable("test_info", original); + writer.writeToParcel(p, 0); + + // Extract from parcel. + p.setDataPosition(0); + Bundle reader = p.readBundle(); + reader.setClassLoader(NsdServiceInfo.class.getClassLoader()); + NsdServiceInfo result = reader.getParcelable("test_info"); + + // Assert equality of base fields. + assertEquality(original.getServiceName(), result.getServiceName()); + assertEquality(original.getServiceType(), result.getServiceType()); + assertEquality(original.getHost(), result.getHost()); + assertTrue(original.getPort() == result.getPort()); + + // Assert equality of attribute map. + Map<String, byte[]> originalMap = original.getAttributes(); + Map<String, byte[]> resultMap = result.getAttributes(); + assertEquality(originalMap.keySet(), resultMap.keySet()); + for (String key : originalMap.keySet()) { + assertTrue(Arrays.equals(originalMap.get(key), resultMap.get(key))); + } + } + + public void assertEquality(Object expected, Object result) { + assertTrue(expected == result || expected.equals(result)); + } + + public void assertEmptyServiceInfo(NsdServiceInfo shouldBeEmpty) { + assertTrue(null == shouldBeEmpty.getTxtRecord()); + } +} diff --git a/tests/DozeTest/Android.mk b/tests/DozeTest/Android.mk new file mode 100644 index 0000000..01f10e5 --- /dev/null +++ b/tests/DozeTest/Android.mk @@ -0,0 +1,14 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +# Only compile source java files in this apk. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := DozeTest + +include $(BUILD_PACKAGE) + +# Use the following include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/DozeTest/AndroidManifest.xml b/tests/DozeTest/AndroidManifest.xml new file mode 100644 index 0000000..c199f69 --- /dev/null +++ b/tests/DozeTest/AndroidManifest.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.dreams.dozetest"> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + + <application android:label="@string/app_name"> + <service + android:name="DozeTestDream" + android:exported="true" + android:icon="@drawable/ic_app" + android:label="@string/doze_dream_name"> + <!-- Commented out to prevent this dream from appearing in the list of + dreams that the user can select via the Settings application. + <intent-filter> + <action android:name="android.service.dreams.DreamService" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + --> + </service> + </application> +</manifest> diff --git a/tests/DozeTest/res/drawable-hdpi/ic_app.png b/tests/DozeTest/res/drawable-hdpi/ic_app.png Binary files differnew file mode 100755 index 0000000..66a1984 --- /dev/null +++ b/tests/DozeTest/res/drawable-hdpi/ic_app.png diff --git a/tests/DozeTest/res/drawable-mdpi/ic_app.png b/tests/DozeTest/res/drawable-mdpi/ic_app.png Binary files differnew file mode 100644 index 0000000..5ae7701 --- /dev/null +++ b/tests/DozeTest/res/drawable-mdpi/ic_app.png diff --git a/tests/DozeTest/res/layout/dream.xml b/tests/DozeTest/res/layout/dream.xml new file mode 100644 index 0000000..1c8fd3f --- /dev/null +++ b/tests/DozeTest/res/layout/dream.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:orientation="vertical"> + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/alarm_clock_label" /> + <TextView android:id="@+id/alarm_clock" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <Space + android:layout_width="match_parent" + android:layout_height="32dp" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/tick_clock_label" /> + <TextClock android:id="@+id/tick_clock" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> +</LinearLayout> diff --git a/tests/DozeTest/res/values/strings.xml b/tests/DozeTest/res/values/strings.xml new file mode 100644 index 0000000..f21911f --- /dev/null +++ b/tests/DozeTest/res/values/strings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <!-- Name of the package of basic screensavers, shown in Settings > Apps. [CHAR LIMIT=40] --> + <string name="app_name">Doze Test</string> + + <!-- Name of the screensaver. [CHAR LIMIT=40] --> + <string name="doze_dream_name">Doze Test</string> + + <string name="alarm_clock_label">This clock is updated using the Alarm Manager</string> + <string name="tick_clock_label">This clock is updated using TIME_TICK Broadcasts</string> +</resources> diff --git a/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java new file mode 100644 index 0000000..a0b2d1a --- /dev/null +++ b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dreams.dozetest; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.PowerManager; +import android.service.dreams.DozeHardware; +import android.service.dreams.DreamService; +import android.text.format.DateFormat; +import android.util.Log; +import android.widget.TextView; + +import java.util.Date; + +/** + * Simple test for doze mode. + * <p> + * adb shell setprop debug.doze.component com.android.dreams.dozetest/.DozeTestDream + * </p> + */ +public class DozeTestDream extends DreamService { + private static final String TAG = DozeTestDream.class.getSimpleName(); + private static final boolean DEBUG = false; + + // Amount of time to allow to update the time shown on the screen before releasing + // the wakelock. This timeout is design to compensate for the fact that we don't + // currently have a way to know when time display contents have actually been + // refreshed once the dream has finished rendering a new frame. + private static final int UPDATE_TIME_TIMEOUT = 100; + + // A doze hardware message string we use for end-to-end testing. + // Doesn't mean anything. Real hardware won't handle it. + private static final String TEST_PING_MESSAGE = "test.ping"; + + private PowerManager mPowerManager; + private PowerManager.WakeLock mWakeLock; + private AlarmManager mAlarmManager; + private PendingIntent mAlarmIntent; + + private TextView mAlarmClock; + + private final Date mTime = new Date(); + private java.text.DateFormat mTimeFormat; + + private boolean mDreaming; + private DozeHardware mDozeHardware; + + @Override + public void onCreate() { + super.onCreate(); + + mPowerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); + mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); + + mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent("com.android.dreams.dozetest.ACTION_ALARM"); + intent.setPackage(getPackageName()); + IntentFilter filter = new IntentFilter(); + filter.addAction(intent.getAction()); + registerReceiver(mAlarmReceiver, filter); + mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent, + PendingIntent.FLAG_CANCEL_CURRENT); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + unregisterReceiver(mAlarmReceiver); + mAlarmIntent.cancel(); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + setInteractive(false); + setLowProfile(true); + setFullscreen(true); + setContentView(R.layout.dream); + setScreenBright(false); + + mAlarmClock = (TextView)findViewById(R.id.alarm_clock); + + mTimeFormat = DateFormat.getTimeFormat(this); + } + + @Override + public void onDreamingStarted() { + super.onDreamingStarted(); + + mDreaming = true; + mDozeHardware = getDozeHardware(); + + Log.d(TAG, "Dream started: canDoze=" + canDoze() + + ", dozeHardware=" + mDozeHardware); + + performTimeUpdate(); + + if (mDozeHardware != null) { + mDozeHardware.sendMessage(TEST_PING_MESSAGE, null); + mDozeHardware.setEnableMcu(true); + } + startDozing(); + } + + @Override + public void onDreamingStopped() { + super.onDreamingStopped(); + + mDreaming = false; + if (mDozeHardware != null) { + mDozeHardware.setEnableMcu(false); + mDozeHardware = null; + } + + Log.d(TAG, "Dream ended: isDozing=" + isDozing()); + + stopDozing(); + cancelTimeUpdate(); + } + + private void performTimeUpdate() { + if (mDreaming) { + long now = System.currentTimeMillis(); + now -= now % 60000; // back up to last minute boundary + + mTime.setTime(now); + mAlarmClock.setText(mTimeFormat.format(mTime)); + + mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, now + 60000, mAlarmIntent); + + mWakeLock.acquire(UPDATE_TIME_TIMEOUT); + } + } + + private void cancelTimeUpdate() { + mAlarmManager.cancel(mAlarmIntent); + } + + private final BroadcastReceiver mAlarmReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + performTimeUpdate(); + } + }; +} diff --git a/tests/TileBenchmark/Android.mk b/tests/TileBenchmark/Android.mk index 5851113..9a057af 100644 --- a/tests/TileBenchmark/Android.mk +++ b/tests/TileBenchmark/Android.mk @@ -17,7 +17,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_SRC_FILES := LOCAL_PACKAGE_NAME := TileBenchmark @@ -25,4 +25,4 @@ LOCAL_MODULE_TAGS := tests LOCAL_JAVA_LIBRARIES := android.test.runner -include $(BUILD_PACKAGE)
\ No newline at end of file +include $(BUILD_PACKAGE) |