aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNick Chalko <nchalko@google.com>2015-11-04 15:15:29 -0800
committerNick Chalko <nchalko@google.com>2015-11-10 13:59:03 -0800
commit7d67089aa1e9aa2123c3cd2f386d7019a1544db1 (patch)
tree6f90c2065a853628dd7704788dd41b787acb6fae /tests
parent07b043dc3db83d6d20f0e8513b946830ab00e37b (diff)
downloadTV-7d67089aa1e9aa2123c3cd2f386d7019a1544db1.tar.gz
Sync to ub-tv-glee at 1.07.007
hash dce17da9f45fc4304787b1898d9915511b1df954 Change-Id: I08ac6fc0123a6653644281155e35c11b71bc5fa0
Diffstat (limited to 'tests')
-rw-r--r--tests/common/Android.mk2
-rw-r--r--tests/common/src/com/android/tv/testing/ChannelInfo.java2
-rw-r--r--tests/common/src/com/android/tv/testing/ComparatorTester.java2
-rw-r--r--tests/common/src/com/android/tv/testing/Utils.java55
-rw-r--r--tests/common/src/com/android/tv/testing/testinput/ChannelStateData.aidl2
-rw-r--r--tests/common/src/com/android/tv/testing/testinput/ITestInputControl.aidl2
-rw-r--r--tests/common/src/com/android/tv/testing/uihelper/LiveChannelsUiDeviceHelper.java2
-rw-r--r--tests/common/src/com/android/tv/testing/uihelper/MenuHelper.java4
-rw-r--r--tests/func/Android.mk2
-rw-r--r--tests/func/src/com/android/tv/tests/ui/AboutFragmentTest.java57
-rw-r--r--tests/input/src/com/android/tv/testinput/TestTvInputService.java2
-rw-r--r--tests/jank/Android.mk2
-rw-r--r--tests/unit/Android.mk2
-rw-r--r--tests/unit/src/com/android/tv/BaseMainActivityTestCase.java3
-rw-r--r--tests/unit/src/com/android/tv/FeaturesTest.java34
-rw-r--r--tests/unit/src/com/android/tv/MainActivityTest.java2
-rw-r--r--tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java44
-rw-r--r--tests/unit/src/com/android/tv/data/ChannelNumberTest.java5
-rw-r--r--tests/unit/src/com/android/tv/data/ProgramDataManagerTest.java38
-rw-r--r--tests/unit/src/com/android/tv/data/WatchedHistoryManagerTest.java146
-rw-r--r--tests/unit/src/com/android/tv/recommendation/ChannelRecordTest.java4
-rw-r--r--tests/unit/src/com/android/tv/recommendation/EvaluatorTestCase.java4
-rw-r--r--tests/unit/src/com/android/tv/recommendation/RecommendationUtils.java24
-rw-r--r--tests/unit/src/com/android/tv/recommendation/RecommenderTest.java3
-rw-r--r--tests/unit/src/com/android/tv/util/ImageCacheTest.java2
-rw-r--r--tests/unit/src/com/android/tv/util/MultiLongSparseArrayTest.java100
-rw-r--r--tests/unit/src/com/android/tv/util/UtilsTest_GetMultiAudioString.java85
27 files changed, 556 insertions, 74 deletions
diff --git a/tests/common/Android.mk b/tests/common/Android.mk
index 62005890..aecd15bc 100644
--- a/tests/common/Android.mk
+++ b/tests/common/Android.mk
@@ -14,7 +14,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
# Link tv-common as shared library to avoid the problem of initialization of the constants
LOCAL_JAVA_LIBRARIES := tv-common
-LOCAL_INSTRUMENTATION_FOR := TV
+LOCAL_INSTRUMENTATION_FOR := LiveTv
LOCAL_MODULE := tv-test-common
LOCAL_MODULE_TAGS := optional
LOCAL_SDK_VERSION := system_current
diff --git a/tests/common/src/com/android/tv/testing/ChannelInfo.java b/tests/common/src/com/android/tv/testing/ChannelInfo.java
index 40a8bba8..28ba4a64 100644
--- a/tests/common/src/com/android/tv/testing/ChannelInfo.java
+++ b/tests/common/src/com/android/tv/testing/ChannelInfo.java
@@ -81,7 +81,7 @@ public final class ChannelInfo {
.setOriginalNetworkId(channelNumber);
if (context != null) {
// tests/input/tools/get_test_logos.sh only stores 1000 logos.
- int logo_num = (channelNumber % 1000) + 1;
+ int logo_num = (channelNumber % 1000);
builder.setLogoUrl(
"android.resource://com.android.tv.testinput/drawable/ch_" + logo_num
+ "_logo"
diff --git a/tests/common/src/com/android/tv/testing/ComparatorTester.java b/tests/common/src/com/android/tv/testing/ComparatorTester.java
index dc5cf00f..3774532f 100644
--- a/tests/common/src/com/android/tv/testing/ComparatorTester.java
+++ b/tests/common/src/com/android/tv/testing/ComparatorTester.java
@@ -125,4 +125,4 @@ public class ComparatorTester<T> {
}
}
}
-}
+} \ No newline at end of file
diff --git a/tests/common/src/com/android/tv/testing/Utils.java b/tests/common/src/com/android/tv/testing/Utils.java
index 33fe4c54..c1a7506f 100644
--- a/tests/common/src/com/android/tv/testing/Utils.java
+++ b/tests/common/src/com/android/tv/testing/Utils.java
@@ -25,11 +25,21 @@ import android.media.tv.TvContentRating;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.net.Uri;
+import android.os.Looper;
import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.tv.util.MainThreadExecutor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Random;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
/**
* An utility class for testing.
@@ -38,7 +48,11 @@ import java.io.OutputStream;
*
* @see com.android.tv.util.Utils#isRunningInTest
*/
-public class Utils {
+public final class Utils {
+ private static final String TAG ="Utils";
+
+ private static final long DEFAULT_RANDOM_SEED = getSeed();
+
public static String getUriStringForResource(Context context, int resId) {
if (resId == 0) {
return "";
@@ -105,5 +119,44 @@ public class Utils {
return ratings.toString();
}
+ /**
+ * Return the Random class which is needed to make random data for testing.
+ * Default seed of the random is today's date.
+ */
+ public static Random createTestRandom() {
+ return new Random(DEFAULT_RANDOM_SEED);
+ }
+
+ /**
+ * Executes a call on the main thread, blocking until it is completed.
+ *
+ * <p>Useful for doing things that are not thread-safe, such as looking at or modifying the view
+ * hierarchy.
+ *
+ * @param runnable The code to run on the main thread.
+ */
+ public static void runOnMainSync(Runnable runnable) {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ runnable.run();
+ } else {
+ Future<?> temp = MainThreadExecutor.getInstance().submit(runnable);
+ try {
+ temp.get();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ } catch (ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private static long getSeed() {
+ // Set random seed as the date to track failed test data easily.
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
+ String today = dateFormat.format(new Date());
+ Log.d(TAG, "Today's random seed is " + today);
+ return Long.valueOf(today);
+ }
+
private Utils() {}
}
diff --git a/tests/common/src/com/android/tv/testing/testinput/ChannelStateData.aidl b/tests/common/src/com/android/tv/testing/testinput/ChannelStateData.aidl
index cdf43adb..8b3e7dcc 100644
--- a/tests/common/src/com/android/tv/testing/testinput/ChannelStateData.aidl
+++ b/tests/common/src/com/android/tv/testing/testinput/ChannelStateData.aidl
@@ -1,3 +1,3 @@
package com.android.tv.testing.testinput;
-parcelable ChannelStateData;
+parcelable ChannelStateData; \ No newline at end of file
diff --git a/tests/common/src/com/android/tv/testing/testinput/ITestInputControl.aidl b/tests/common/src/com/android/tv/testing/testinput/ITestInputControl.aidl
index a82f378b..15039000 100644
--- a/tests/common/src/com/android/tv/testing/testinput/ITestInputControl.aidl
+++ b/tests/common/src/com/android/tv/testing/testinput/ITestInputControl.aidl
@@ -6,4 +6,4 @@ import com.android.tv.testing.testinput.ChannelStateData;
/** Remote interface for controlling the test TV Input Service */
interface ITestInputControl {
void updateChannelState(int origId, in ChannelStateData data);
-}
+} \ No newline at end of file
diff --git a/tests/common/src/com/android/tv/testing/uihelper/LiveChannelsUiDeviceHelper.java b/tests/common/src/com/android/tv/testing/uihelper/LiveChannelsUiDeviceHelper.java
index 31204410..6757cf01 100644
--- a/tests/common/src/com/android/tv/testing/uihelper/LiveChannelsUiDeviceHelper.java
+++ b/tests/common/src/com/android/tv/testing/uihelper/LiveChannelsUiDeviceHelper.java
@@ -48,4 +48,4 @@ public class LiveChannelsUiDeviceHelper extends BaseUiDeviceHelper {
mUiDevice.pressBack();
}
}
-}
+} \ No newline at end of file
diff --git a/tests/common/src/com/android/tv/testing/uihelper/MenuHelper.java b/tests/common/src/com/android/tv/testing/uihelper/MenuHelper.java
index cb403a61..3d992618 100644
--- a/tests/common/src/com/android/tv/testing/uihelper/MenuHelper.java
+++ b/tests/common/src/com/android/tv/testing/uihelper/MenuHelper.java
@@ -121,6 +121,10 @@ public class MenuHelper extends BaseUiDeviceHelper {
R.string.options_item_channel_sources);
}
+ public UiObject2 assertPressOptionsAbout() {
+ return assertPressMenuItem(R.string.menu_title_options,
+ R.string.options_item_about);
+ }
public UiObject2 assertPressOptionsClosedCaptions() {
return assertPressMenuItem(R.string.menu_title_options,
diff --git a/tests/func/Android.mk b/tests/func/Android.mk
index 53ed5e72..2fd68b08 100644
--- a/tests/func/Android.mk
+++ b/tests/func/Android.mk
@@ -14,7 +14,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
tv-test-common \
ub-uiautomator \
-LOCAL_INSTRUMENTATION_FOR := TV
+LOCAL_INSTRUMENTATION_FOR := LiveTv
LOCAL_SDK_VERSION := current
diff --git a/tests/func/src/com/android/tv/tests/ui/AboutFragmentTest.java b/tests/func/src/com/android/tv/tests/ui/AboutFragmentTest.java
new file mode 100644
index 00000000..cd7a5718
--- /dev/null
+++ b/tests/func/src/com/android/tv/tests/ui/AboutFragmentTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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.tv.tests.ui;
+
+import static com.android.tv.testing.uihelper.UiDeviceAsserts.assertWaitForCondition;
+
+import android.support.test.uiautomator.BySelector;
+import android.support.test.uiautomator.Until;
+import android.test.suitebuilder.annotation.LargeTest;
+
+import com.android.tv.Features;
+import com.android.tv.R;
+import com.android.tv.testing.uihelper.ByResource;
+import com.android.tv.testing.uihelper.SidePanelHelper;
+
+/**
+ * Test for the About menu.
+ */
+@LargeTest
+public class AboutFragmentTest extends LiveChannelsTestCase {
+ private SidePanelHelper mSidePanelHelper;
+ private BySelector mAboutSidePanel;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mSidePanelHelper = new SidePanelHelper(mDevice, mTargetResources);
+ mAboutSidePanel = mSidePanelHelper.bySidePanelTitled(R.string.side_panel_title_about);
+ }
+
+ public void testAllowAnalytics_present() {
+ mLiveChannelsHelper.assertAppStarted();
+ mMenuHelper.assertPressOptionsAbout();
+ assertWaitForCondition(mDevice, Until.hasObject(mAboutSidePanel));
+ BySelector improveSelector = ByResource
+ .text(mTargetResources, R.string.about_menu_improve_summary);
+ if (Features.ANALYTICS_OPT_OUT.isEnabled(getInstrumentation().getContext())) {
+ assertWaitForCondition(mDevice, Until.hasObject(improveSelector));
+ } else {
+ assertFalse(mDevice.hasObject(improveSelector));
+ }
+ mDevice.pressBack();
+ }
+}
diff --git a/tests/input/src/com/android/tv/testinput/TestTvInputService.java b/tests/input/src/com/android/tv/testinput/TestTvInputService.java
index 6f906786..a81977d6 100644
--- a/tests/input/src/com/android/tv/testinput/TestTvInputService.java
+++ b/tests/input/src/com/android/tv/testinput/TestTvInputService.java
@@ -342,4 +342,4 @@ public class TestTvInputService extends TvInputService {
}
}
}
-}
+} \ No newline at end of file
diff --git a/tests/jank/Android.mk b/tests/jank/Android.mk
index 28f8ddf0..3d0b3bfd 100644
--- a/tests/jank/Android.mk
+++ b/tests/jank/Android.mk
@@ -15,7 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
ub-janktesthelper \
ub-uiautomator \
-LOCAL_INSTRUMENTATION_FOR := TV
+LOCAL_INSTRUMENTATION_FOR := LiveTv
LOCAL_SDK_VERSION := current
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index 1cd4f153..55ee5276 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -14,7 +14,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
LOCAL_PACKAGE_NAME := TVUnitTests
-LOCAL_INSTRUMENTATION_FOR := TV
+LOCAL_INSTRUMENTATION_FOR := LiveTv
LOCAL_SDK_VERSION := current
diff --git a/tests/unit/src/com/android/tv/BaseMainActivityTestCase.java b/tests/unit/src/com/android/tv/BaseMainActivityTestCase.java
index 208085d6..e2f620ed 100644
--- a/tests/unit/src/com/android/tv/BaseMainActivityTestCase.java
+++ b/tests/unit/src/com/android/tv/BaseMainActivityTestCase.java
@@ -18,6 +18,7 @@ package com.android.tv;
import android.content.Context;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
+import android.text.TextUtils;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
@@ -131,7 +132,7 @@ public abstract class BaseMainActivityTestCase
waitUntilChannelLoadingFinish();
List<Channel> channelList = mActivity.getChannelDataManager().getChannelList();
for (Channel c : channelList) {
- if (c.getDisplayName().equals(displayName)) {
+ if (TextUtils.equals(c.getDisplayName(), displayName)) {
return c;
}
}
diff --git a/tests/unit/src/com/android/tv/FeaturesTest.java b/tests/unit/src/com/android/tv/FeaturesTest.java
new file mode 100644
index 00000000..a0a6a5be
--- /dev/null
+++ b/tests/unit/src/com/android/tv/FeaturesTest.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 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.tv;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for features.
+ */
+@SmallTest
+public class FeaturesTest extends TestCase {
+
+ public void testPropertyFeatureKeyLength() {
+ // This forces the class to be loaded and verifies all PropertyFeature key lengths.
+ // If any keys are too long the test will fail to load.
+ assertEquals(false, Features.TEST_FEATURE.isEnabled(null));
+ }
+}
diff --git a/tests/unit/src/com/android/tv/MainActivityTest.java b/tests/unit/src/com/android/tv/MainActivityTest.java
index 04271a7b..a09111e8 100644
--- a/tests/unit/src/com/android/tv/MainActivityTest.java
+++ b/tests/unit/src/com/android/tv/MainActivityTest.java
@@ -58,7 +58,7 @@ public class MainActivityTest extends BaseMainActivityTestCase {
private void showProgramGuide() throws Throwable {
// Run on UI thread so views can be modified
- runTestOnUiThread(new Runnable() {
+ getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mActivity.getOverlayManager().showProgramGuide();
diff --git a/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java b/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
index b239d0ed..fa127369 100644
--- a/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
+++ b/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
@@ -25,9 +25,9 @@ import android.database.Cursor;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Channels;
import android.net.Uri;
-import android.os.HandlerThread;
import android.test.AndroidTestCase;
import android.test.MoreAsserts;
+import android.test.UiThreadTest;
import android.test.mock.MockContentProvider;
import android.test.mock.MockContentResolver;
import android.test.mock.MockCursor;
@@ -39,6 +39,7 @@ import android.util.SparseArray;
import com.android.tv.analytics.StubTracker;
import com.android.tv.testing.ChannelInfo;
import com.android.tv.testing.Constants;
+import com.android.tv.testing.Utils;
import com.android.tv.util.TvInputManagerHelper;
import org.mockito.Matchers;
@@ -51,9 +52,10 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
- * Test for {@link com.android.tv.data.ChannelDataManager}
+ * Test for {@link ChannelDataManager}
*
* A test method may include tests for multiple methods to minimize the DB access.
+ * Note that all the methods of {@link ChannelDataManager} should be called from the UI thread.
*/
@SmallTest
public class ChannelDataManagerTest extends AndroidTestCase {
@@ -68,7 +70,6 @@ public class ChannelDataManagerTest extends AndroidTestCase {
private static final String COLUMN_LOCKED = "locked";
private ChannelDataManager mChannelDataManager;
- private HandlerThread mHandlerThread;
private TestChannelDataManagerListener mListener;
private FakeContentResolver mContentResolver;
private FakeContentProvider mContentProvider;
@@ -77,26 +78,32 @@ public class ChannelDataManagerTest extends AndroidTestCase {
protected void setUp() throws Exception {
super.setUp();
assertTrue("More than 2 channels to test", Constants.UNIT_TEST_CHANNEL_COUNT > 2);
- TvInputManagerHelper mockHelper = Mockito.mock(TvInputManagerHelper.class);
- Mockito.when(mockHelper.hasTvInputInfo(Matchers.anyString())).thenReturn(true);
mContentProvider = new FakeContentProvider(getContext());
mContentResolver = new FakeContentResolver();
mContentResolver.addProvider(TvContract.AUTHORITY, mContentProvider);
- mHandlerThread = new HandlerThread(TAG);
- mHandlerThread.start();
- mChannelDataManager = new ChannelDataManager(getContext(), mockHelper, new StubTracker(),
- mContentResolver, mHandlerThread.getLooper());
mListener = new TestChannelDataManagerListener();
- mChannelDataManager.addListener(mListener);
-
+ Utils.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ TvInputManagerHelper mockHelper = Mockito.mock(TvInputManagerHelper.class);
+ Mockito.when(mockHelper.hasTvInputInfo(Matchers.anyString())).thenReturn(true);
+ mChannelDataManager = new ChannelDataManager(getContext(), mockHelper,
+ new StubTracker(), mContentResolver);
+ mChannelDataManager.addListener(mListener);
+ }
+ });
}
@Override
protected void tearDown() throws Exception {
+ Utils.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mChannelDataManager.stop();
+ }
+ });
super.tearDown();
- mHandlerThread.quitSafely();
- mChannelDataManager.stop();
}
private void startAndWaitForComplete() throws Exception {
@@ -114,6 +121,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
startAndWaitForComplete();
}
+ @UiThreadTest
public void testIsDbLoadFinished() throws Exception {
startAndWaitForComplete();
assertTrue(mChannelDataManager.isDbLoadFinished());
@@ -125,6 +133,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
* - {@link ChannelDataManager#getChannelList}
* - {@link ChannelDataManager#getChannel}
*/
+ @UiThreadTest
public void testGetChannels() throws Exception {
startAndWaitForComplete();
@@ -159,6 +168,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
/**
* Test for {@link ChannelDataManager#getChannelCount} when no channel is available.
*/
+ @UiThreadTest
public void testGetChannels_noChannels() throws Exception {
mContentProvider.clear();
startAndWaitForComplete();
@@ -170,6 +180,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
* - {@link ChannelDataManager#updateBrowsable}
* - {@link ChannelDataManager#applyUpdatedValuesToDb}
*/
+ @UiThreadTest
public void testBrowsable() throws Exception {
startAndWaitForComplete();
@@ -208,6 +219,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
* - {@link ChannelDataManager#updateBrowsable}
* - {@link ChannelDataManager#applyUpdatedValuesToDb}
*/
+ @UiThreadTest
public void testBrowsable_skipNotification() throws Exception {
startAndWaitForComplete();
@@ -241,6 +253,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
* - {@link ChannelDataManager#updateLocked}
* - {@link ChannelDataManager#applyUpdatedValuesToDb}
*/
+ @UiThreadTest
public void testLocked() throws Exception {
startAndWaitForComplete();
@@ -269,6 +282,7 @@ public class ChannelDataManagerTest extends AndroidTestCase {
/**
* Test ChannelDataManager when channels in TvContract are updated, removed, or added.
*/
+ @UiThreadTest
public void testChannelListChanged() throws Exception {
startAndWaitForComplete();
@@ -336,8 +350,8 @@ public class ChannelDataManagerTest extends AndroidTestCase {
if (DEBUG) {
Log.d(TAG, "onChanged(uri=" + uri + ", observer=" + observer + ")");
}
- // Do not call {@link ContentObserver#onChange} directly
- // to run it on the {@link #mHandlerThread}.
+ // Do not call {@link ContentObserver#onChange} directly to run it on the correct
+ // thread.
if (observer != null) {
observer.dispatchChange(false, uri);
} else {
diff --git a/tests/unit/src/com/android/tv/data/ChannelNumberTest.java b/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
index 1935b4d9..1dd18da0 100644
--- a/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
+++ b/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
@@ -43,6 +43,9 @@ public class ChannelNumberTest extends TestCase {
public void testParseChannelNumber() {
assertNull(parseChannelNumber(""));
assertNull(parseChannelNumber(" "));
+ assertNull(parseChannelNumber("abcd12"));
+ assertNull(parseChannelNumber("12abcd"));
+ assertNull(parseChannelNumber("-12"));
assertChannelEquals(parseChannelNumber("1"), "1", false, "");
assertChannelEquals(parseChannelNumber("1234 4321"), "1234", true, "4321");
assertChannelEquals(parseChannelNumber("3-4"), "3", true, "4");
@@ -76,6 +79,8 @@ public class ChannelNumberTest extends TestCase {
assertEquals("compareTo(null,null)", 0, ChannelNumber.compare(null, null));
assertEquals("compareTo(1,1)", 0, ChannelNumber.compare("1", "1"));
assertEquals("compareTo(null,1)<0", true, ChannelNumber.compare(null, "1") < 0);
+ assertEquals("compareTo(mal-formatted,1)<0", true, ChannelNumber.compare("abcd", "1") < 0);
+ assertEquals("compareTo(mal-formatted,1)<0", true, ChannelNumber.compare(".4", "1") < 0);
assertEquals("compareTo(1,null)>0", true, ChannelNumber.compare("1", null) > 0);
}
diff --git a/tests/unit/src/com/android/tv/data/ProgramDataManagerTest.java b/tests/unit/src/com/android/tv/data/ProgramDataManagerTest.java
index 60e3e210..78b3a930 100644
--- a/tests/unit/src/com/android/tv/data/ProgramDataManagerTest.java
+++ b/tests/unit/src/com/android/tv/data/ProgramDataManagerTest.java
@@ -27,7 +27,6 @@ import android.test.mock.MockContentProvider;
import android.test.mock.MockContentResolver;
import android.test.mock.MockCursor;
import android.test.suitebuilder.annotation.SmallTest;
-import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
@@ -80,6 +79,7 @@ public class ProgramDataManagerTest extends AndroidTestCase {
mHandlerThread.start();
mProgramDataManager = new ProgramDataManager(
mContentResolver, mClock, mHandlerThread.getLooper());
+ mProgramDataManager.setPrefetchEnabled(true);
mProgramDataManager.addListener(mListener);
}
@@ -95,14 +95,6 @@ public class ProgramDataManagerTest extends AndroidTestCase {
assertTrue(mListener.programUpdatedLatch.await(WAIT_TIME_OUT_MS, TimeUnit.MILLISECONDS));
}
- private static boolean equals(ProgramInfo lhs, long lhsStarTimeMs, Program rhs) {
- return TextUtils.equals(lhs.title, rhs.getTitle())
- && TextUtils.equals(lhs.episode, rhs.getEpisodeTitle())
- && TextUtils.equals(lhs.description, rhs.getDescription())
- && lhsStarTimeMs == rhs.getStartTimeUtcMillis()
- && lhsStarTimeMs + lhs.durationMs == rhs.getEndTimeUtcMillis();
- }
-
/**
* Test for {@link ProgramInfo#getIndex} and {@link ProgramInfo#getStartTimeMs}.
*/
@@ -150,8 +142,7 @@ public class ProgramDataManagerTest extends AndroidTestCase {
for (Program program : programs) {
ProgramInfo programInfoAt = stub.build(getContext(), index);
long startTimeMs = stub.getStartTimeMs(index, channelId);
- assertTrue(program.toString() + " differ from " + programInfoAt,
- equals(programInfoAt, startTimeMs, program));
+ assertProgramEquals(startTimeMs, programInfoAt, program);
index++;
}
// Case #2: Corner cases where there's a program that starts at the start of the range.
@@ -194,13 +185,12 @@ public class ProgramDataManagerTest extends AndroidTestCase {
TestProgramDataManagerOnCurrentProgramUpdatedListener listener =
new TestProgramDataManagerOnCurrentProgramUpdatedListener();
mProgramDataManager.addOnCurrentProgramUpdatedListener(testChannelId, listener);
- assertTrue(listener.currentProgramUpdatedLatch.await(WAIT_TIME_OUT_MS,
- TimeUnit.MILLISECONDS));
+ assertTrue(
+ listener.currentProgramUpdatedLatch.await(WAIT_TIME_OUT_MS, TimeUnit.MILLISECONDS));
assertEquals(testChannelId, listener.updatedChannelId);
- assertTrue(ProgramDataManagerTest.equals(
- nextProgramInfo, nextProgramStartTimeMs,
- mProgramDataManager.getCurrentProgram(testChannelId)));
- assertEquals(listener.updatedProgram, mProgramDataManager.getCurrentProgram(testChannelId));
+ Program currentProgram = mProgramDataManager.getCurrentProgram(testChannelId);
+ assertProgramEquals(nextProgramStartTimeMs, nextProgramInfo, currentProgram);
+ assertEquals(listener.updatedProgram, currentProgram);
}
/**
@@ -220,8 +210,8 @@ public class ProgramDataManagerTest extends AndroidTestCase {
mContentProvider.simulateAppend(testChannelId);
assertTrue(mListener.programUpdatedLatch.await(WAIT_TIME_OUT_MS, TimeUnit.MILLISECONDS));
programList = mProgramDataManager.getPrograms(testChannelId, mClock.currentTimeMillis());
- assertTrue(lastProgramEndTime
- < programList.get(programList.size() - 1).getEndTimeUtcMillis());
+ assertTrue(
+ lastProgramEndTime < programList.get(programList.size() - 1).getEndTimeUtcMillis());
}
/**
@@ -239,6 +229,16 @@ public class ProgramDataManagerTest extends AndroidTestCase {
TimeUnit.MILLISECONDS));
}
+ public static void assertProgramEquals(long expectedStartTime, ProgramInfo expectedInfo,
+ Program actualProgram) {
+ assertEquals("title", expectedInfo.title, actualProgram.getTitle());
+ assertEquals("episode", expectedInfo.episode, actualProgram.getEpisodeTitle());
+ assertEquals("description", expectedInfo.description, actualProgram.getDescription());
+ assertEquals("startTime", expectedStartTime, actualProgram.getStartTimeUtcMillis());
+ assertEquals("endTime", expectedStartTime + expectedInfo.durationMs,
+ actualProgram.getEndTimeUtcMillis());
+ }
+
private class FakeContentResolver extends MockContentResolver {
@Override
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
diff --git a/tests/unit/src/com/android/tv/data/WatchedHistoryManagerTest.java b/tests/unit/src/com/android/tv/data/WatchedHistoryManagerTest.java
new file mode 100644
index 00000000..e5da60eb
--- /dev/null
+++ b/tests/unit/src/com/android/tv/data/WatchedHistoryManagerTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 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.tv.data;
+
+import android.test.AndroidTestCase;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.tv.data.WatchedHistoryManager.WatchedRecord;
+import com.android.tv.testing.Utils;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test for {@link com.android.tv.data.WatchedHistoryManagerTest}
+ */
+@SmallTest
+public class WatchedHistoryManagerTest extends AndroidTestCase {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "WatchedHistoryManager";
+
+ // Wait time for expected success.
+ private static final long WAIT_TIME_OUT_MS = 1000L;
+ private static final int MAX_HISTORY_SIZE = 100;
+
+ private WatchedHistoryManager mWatchedHistoryManager;
+ private TestWatchedHistoryManagerListener mListener;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Utils.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mWatchedHistoryManager = new WatchedHistoryManager(getContext(), MAX_HISTORY_SIZE);
+ mListener = new TestWatchedHistoryManagerListener();
+ mWatchedHistoryManager.setListener(mListener);
+ }
+ });
+ }
+
+ private void startAndWaitForComplete() throws Exception {
+ mWatchedHistoryManager.start();
+ try {
+ assertTrue(mListener.loadFinishedLatch.await(WAIT_TIME_OUT_MS, TimeUnit.MILLISECONDS));
+ } catch (InterruptedException e) {
+ throw e;
+ }
+ }
+
+ @UiThreadTest
+ public void testIsLoaded() throws Exception {
+ assertFalse(mWatchedHistoryManager.isLoaded());
+ startAndWaitForComplete();
+ assertTrue(mWatchedHistoryManager.isLoaded());
+ }
+
+ @UiThreadTest
+ public void testLogChannelViewStop() throws Exception {
+ startAndWaitForComplete();
+ long fakeId = 100000000;
+ long time = System.currentTimeMillis();
+ long duration = TimeUnit.MINUTES.toMillis(10);
+ Channel channel = new Channel.Builder().setId(fakeId).build();
+ mWatchedHistoryManager.logChannelViewStop(channel, time, duration);
+
+ WatchedRecord record = mWatchedHistoryManager.getRecord(0);
+ WatchedRecord recordFromSharedPreferences =
+ mWatchedHistoryManager.getRecordFromSharedPreferences(0);
+ assertEquals(record.channelId, fakeId);
+ assertEquals(record.watchedStartTime, time - duration);
+ assertEquals(record.duration, duration);
+ assertEquals(record, recordFromSharedPreferences);
+ }
+
+ @UiThreadTest
+ public void testCircularHistoryQueue() throws Exception {
+ startAndWaitForComplete();
+ final long startChannelId = 100000000;
+ long time = System.currentTimeMillis();
+ long duration = TimeUnit.MINUTES.toMillis(10);
+
+ int size = MAX_HISTORY_SIZE * 2;
+ for (int i = 0; i < size; ++i) {
+ Channel channel = new Channel.Builder().setId(startChannelId + i).build();
+ mWatchedHistoryManager.logChannelViewStop(channel, time + duration * i, duration);
+ }
+ for (int i = 0; i < MAX_HISTORY_SIZE; ++i) {
+ WatchedRecord record = mWatchedHistoryManager.getRecord(i);
+ WatchedRecord recordFromSharedPreferences =
+ mWatchedHistoryManager.getRecordFromSharedPreferences(i);
+ assertEquals(record, recordFromSharedPreferences);
+ assertEquals(record.channelId, startChannelId + size - 1 - i);
+ }
+ // Since the WatchedHistory is a circular queue, the value for 0 and maxHistorySize
+ // are same.
+ assertEquals(mWatchedHistoryManager.getRecordFromSharedPreferences(0),
+ mWatchedHistoryManager.getRecordFromSharedPreferences(MAX_HISTORY_SIZE));
+ }
+
+ @UiThreadTest
+ public void testWatchedRecordEquals() {
+ assertTrue(new WatchedRecord(1, 2, 3).equals(new WatchedRecord(1, 2, 3)));
+ assertFalse(new WatchedRecord(1, 2, 3).equals(new WatchedRecord(1, 2, 4)));
+ assertFalse(new WatchedRecord(1, 2, 3).equals(new WatchedRecord(1, 4, 3)));
+ assertFalse(new WatchedRecord(1, 2, 3).equals(new WatchedRecord(4, 2, 3)));
+ }
+
+ @UiThreadTest
+ public void testEncodeDecodeWatchedRecord() throws Exception {
+ long fakeId = 100000000;
+ long time = System.currentTimeMillis();
+ long duration = TimeUnit.MINUTES.toMillis(10);
+ WatchedRecord record = new WatchedRecord(fakeId, time, duration);
+ WatchedRecord sameRecord = mWatchedHistoryManager.decode(
+ mWatchedHistoryManager.encode(record));
+ assertEquals(record, sameRecord);
+ }
+
+ private class TestWatchedHistoryManagerListener implements WatchedHistoryManager.Listener {
+ public CountDownLatch loadFinishedLatch = new CountDownLatch(1);
+
+ @Override
+ public void onLoadFinished() {
+ loadFinishedLatch.countDown();
+ }
+
+ @Override
+ public void onNewRecordAdded(WatchedRecord watchedRecord) { }
+ }
+}
diff --git a/tests/unit/src/com/android/tv/recommendation/ChannelRecordTest.java b/tests/unit/src/com/android/tv/recommendation/ChannelRecordTest.java
index 44026386..bf8fecde 100644
--- a/tests/unit/src/com/android/tv/recommendation/ChannelRecordTest.java
+++ b/tests/unit/src/com/android/tv/recommendation/ChannelRecordTest.java
@@ -19,6 +19,8 @@ package com.android.tv.recommendation;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.tv.testing.Utils;
+
import java.util.Random;
import java.util.concurrent.TimeUnit;
@@ -38,7 +40,7 @@ public class ChannelRecordTest extends AndroidTestCase {
super.setUp();
mLatestWatchEndTimeMs = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1);
mChannelRecord = new ChannelRecord(getContext(), null, false);
- mRandom = RecommendationUtils.createTestRandom();
+ mRandom = Utils.createTestRandom();
}
public void testGetLastWatchEndTime_noHistory() {
diff --git a/tests/unit/src/com/android/tv/recommendation/EvaluatorTestCase.java b/tests/unit/src/com/android/tv/recommendation/EvaluatorTestCase.java
index febeeda1..0255947b 100644
--- a/tests/unit/src/com/android/tv/recommendation/EvaluatorTestCase.java
+++ b/tests/unit/src/com/android/tv/recommendation/EvaluatorTestCase.java
@@ -17,11 +17,11 @@
package com.android.tv.recommendation;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import com.android.tv.data.Channel;
import com.android.tv.recommendation.RecommendationUtils.ChannelRecordSortedMapHelper;
import com.android.tv.recommendation.Recommender.Evaluator;
+import com.android.tv.testing.Utils;
import java.util.ArrayList;
import java.util.List;
@@ -47,7 +47,7 @@ public abstract class EvaluatorTestCase<T extends Evaluator> extends AndroidTest
mEvaluator = createEvaluator();
mEvaluator.setRecommender(mRecommender);
mChannelRecordSortedMap.setRecommender(mRecommender);
- mChannelRecordSortedMap.resetRandom(RecommendationUtils.createTestRandom());
+ mChannelRecordSortedMap.resetRandom(Utils.createTestRandom());
}
/**
diff --git a/tests/unit/src/com/android/tv/recommendation/RecommendationUtils.java b/tests/unit/src/com/android/tv/recommendation/RecommendationUtils.java
index 8e57a267..4a613995 100644
--- a/tests/unit/src/com/android/tv/recommendation/RecommendationUtils.java
+++ b/tests/unit/src/com/android/tv/recommendation/RecommendationUtils.java
@@ -17,21 +17,18 @@
package com.android.tv.recommendation;
import android.content.Context;
-import android.util.Log;
import com.android.tv.data.Channel;
+import com.android.tv.testing.Utils;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Date;
import java.util.List;
-import java.util.Locale;
import java.util.Random;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
@@ -39,23 +36,6 @@ import java.util.concurrent.TimeUnit;
public class RecommendationUtils {
private static final String TAG = "RecommendationUtils";
private static final long INVALID_CHANNEL_ID = -1;
- private static final long DEFAULT_RANDOM_SEED = getSeed();
-
- private static long getSeed() {
- // Set random seed as the date to track failed test data easily.
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
- String today = dateFormat.format(new Date());
- Log.d(TAG, "Today's random seed is " + today);
- return Long.valueOf(today);
- }
-
- /**
- * Return the Random class which is needed to make random data for testing.
- * Default seed of the random is today's date.
- */
- public static Random createTestRandom() {
- return new Random(DEFAULT_RANDOM_SEED);
- }
/**
* Create a mock RecommendationDataManager backed by a {@link ChannelRecordSortedMapHelper}.
@@ -88,7 +68,7 @@ public class RecommendationUtils {
public static class ChannelRecordSortedMapHelper extends TreeMap<Long, ChannelRecord> {
private final Context mContext;
private Recommender mRecommender;
- private Random mRandom = createTestRandom();
+ private Random mRandom = Utils.createTestRandom();
public ChannelRecordSortedMapHelper(Context context) {
mContext = context;
diff --git a/tests/unit/src/com/android/tv/recommendation/RecommenderTest.java b/tests/unit/src/com/android/tv/recommendation/RecommenderTest.java
index 62c5b4ab..0ca67052 100644
--- a/tests/unit/src/com/android/tv/recommendation/RecommenderTest.java
+++ b/tests/unit/src/com/android/tv/recommendation/RecommenderTest.java
@@ -22,6 +22,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import com.android.tv.data.Channel;
import com.android.tv.recommendation.RecommendationUtils.ChannelRecordSortedMapHelper;
+import com.android.tv.testing.Utils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -78,7 +79,7 @@ public class RecommenderTest extends AndroidTestCase {
mChannelRecordSortedMap = new ChannelRecordSortedMapHelper(getContext());
mDataManager = RecommendationUtils
.createMockRecommendationDataManager(mChannelRecordSortedMap);
- mChannelRecordSortedMap.resetRandom(RecommendationUtils.createTestRandom());
+ mChannelRecordSortedMap.resetRandom(Utils.createTestRandom());
}
public void testRecommendChannels_includeRecommendedOnly_allChannelsHaveNoScore() {
diff --git a/tests/unit/src/com/android/tv/util/ImageCacheTest.java b/tests/unit/src/com/android/tv/util/ImageCacheTest.java
index 396372b2..74d5ef72 100644
--- a/tests/unit/src/com/android/tv/util/ImageCacheTest.java
+++ b/tests/unit/src/com/android/tv/util/ImageCacheTest.java
@@ -73,4 +73,4 @@ public class ImageCacheTest extends TestCase {
mImageCache.putIfNeeded( INFO_200);
assertSame("after", INFO_100, mImageCache.get(KEY));
}
-}
+} \ No newline at end of file
diff --git a/tests/unit/src/com/android/tv/util/MultiLongSparseArrayTest.java b/tests/unit/src/com/android/tv/util/MultiLongSparseArrayTest.java
new file mode 100644
index 00000000..d44ffdef
--- /dev/null
+++ b/tests/unit/src/com/android/tv/util/MultiLongSparseArrayTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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.tv.util;
+
+import android.test.MoreAsserts;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+import java.util.Collections;
+
+/**
+ * Tests for {@link MultiLongSparseArray}.
+ */
+@SmallTest
+public class MultiLongSparseArrayTest extends TestCase {
+
+ public void testEmpty() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ assertSame(Collections.EMPTY_SET, sparseArray.get(0));
+ }
+
+ public void testOneElement() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ sparseArray.put(0, "foo");
+ MoreAsserts.assertContentsInAnyOrder(sparseArray.get(0), "foo");
+ }
+
+ public void testTwoElements() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ sparseArray.put(0, "foo");
+ sparseArray.put(0, "bar");
+ MoreAsserts.assertContentsInAnyOrder(sparseArray.get(0), "foo", "bar");
+ }
+
+
+ public void testClearEmptyCache() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ sparseArray.clearEmptyCache();
+ assertEquals(0, sparseArray.getEmptyCacheSize());
+ sparseArray.put(0, "foo");
+ sparseArray.remove(0, "foo");
+ assertEquals(1, sparseArray.getEmptyCacheSize());
+ sparseArray.clearEmptyCache();
+ assertEquals(0, sparseArray.getEmptyCacheSize());
+ }
+
+ public void testMaxEmptyCacheSize() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ sparseArray.clearEmptyCache();
+ assertEquals(0, sparseArray.getEmptyCacheSize());
+ for (int i = 0; i <= MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT + 2; i++) {
+ sparseArray.put(i, "foo");
+ }
+ for (int i = 0; i <= MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT + 2; i++) {
+ sparseArray.remove(i, "foo");
+ }
+ assertEquals(MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT,
+ sparseArray.getEmptyCacheSize());
+ sparseArray.clearEmptyCache();
+ assertEquals(0, sparseArray.getEmptyCacheSize());
+ }
+
+ public void testReuseEmptySets() {
+ MultiLongSparseArray<String> sparseArray = new MultiLongSparseArray<>();
+ sparseArray.clearEmptyCache();
+ assertEquals(0, sparseArray.getEmptyCacheSize());
+ // create a bunch of sets
+ for (int i = 0; i <= MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT + 2; i++) {
+ sparseArray.put(i, "foo");
+ }
+ // remove them so they are all put in the cache.
+ for (int i = 0; i <= MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT + 2; i++) {
+ sparseArray.remove(i, "foo");
+ }
+ assertEquals(MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT,
+ sparseArray.getEmptyCacheSize());
+
+ // now create elements, that use the cached empty sets.
+ for (int i = 0; i < MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT; i++) {
+ sparseArray.put(10 + i, "bar");
+ assertEquals(MultiLongSparseArray.DEFAULT_MAX_EMPTIES_KEPT - i - 1,
+ sparseArray.getEmptyCacheSize());
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/tv/util/UtilsTest_GetMultiAudioString.java b/tests/unit/src/com/android/tv/util/UtilsTest_GetMultiAudioString.java
new file mode 100644
index 00000000..601ed661
--- /dev/null
+++ b/tests/unit/src/com/android/tv/util/UtilsTest_GetMultiAudioString.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 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.tv.util;
+
+import android.content.Context;
+import android.media.tv.TvTrackInfo;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Tests for {@link com.android.tv.util.Utils#getMultiAudioString}.
+ */
+@SmallTest
+public class UtilsTest_GetMultiAudioString extends AndroidTestCase {
+ private static final String TRACK_ID = "test_track_id";
+ private static final int AUDIO_SAMPLE_RATE = 48000;
+
+ public void testAudioTrackLanguage() {
+ Context context = getContext();
+ assertEquals("Korean",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("kor"), false));
+ assertEquals("English",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng"), false));
+ assertEquals("Unknown language",
+ Utils.getMultiAudioString(context, createAudioTrackInfo(null), false));
+ // TODO: Check whether the following tests are expected.
+ assertEquals("", Utils.getMultiAudioString(context, createAudioTrackInfo(""), false));
+ assertEquals("abc", Utils.getMultiAudioString(context, createAudioTrackInfo("abc"), false));
+ }
+
+ public void testAudioTrackCount() {
+ Context context = getContext();
+ assertEquals("English",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", -1), false));
+ assertEquals("English",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 0), false));
+ assertEquals("English (mono)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 1), false));
+ assertEquals("English (stereo)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 2), false));
+ assertEquals("English (3 channels)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 3), false));
+ assertEquals("English (4 channels)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 4), false));
+ assertEquals("English (5 channels)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 5), false));
+ assertEquals("English (5.1 surround)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 6), false));
+ assertEquals("English (7 channels)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 7), false));
+ assertEquals("English (7.1 surround)",
+ Utils.getMultiAudioString(context, createAudioTrackInfo("eng", 8), false));
+ }
+
+ public void testShowSampleRate() {
+ assertEquals("Korean (48kHz)",
+ Utils.getMultiAudioString(getContext(), createAudioTrackInfo("kor", 0), true));
+ assertEquals("Korean (7.1 surround, 48kHz)",
+ Utils.getMultiAudioString(getContext(), createAudioTrackInfo("kor", 8), true));
+ }
+
+ private static TvTrackInfo createAudioTrackInfo(String language) {
+ return createAudioTrackInfo(language, 0);
+ }
+
+ private static TvTrackInfo createAudioTrackInfo(String language, int channelCount) {
+ return new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, TRACK_ID)
+ .setLanguage(language).setAudioChannelCount(channelCount)
+ .setAudioSampleRate(AUDIO_SAMPLE_RATE).build();
+ }
+}