aboutsummaryrefslogtreecommitdiff
path: root/tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java')
-rw-r--r--tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java b/tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java
new file mode 100644
index 00000000..d88e67ad
--- /dev/null
+++ b/tests/func/src/com/android/tv/tests/ui/dvr/DvrLibraryTest.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2017 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.dvr;
+
+import static com.android.tv.testing.uihelper.UiDeviceAsserts.assertHas;
+import static com.android.tv.testing.uihelper.UiDeviceAsserts.assertWaitForCondition;
+import static com.android.tv.testing.uihelper.UiDeviceAsserts.assertWaitUntilFocused;
+
+import android.os.Build;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.BySelector;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+
+import com.android.tv.R;
+import com.android.tv.testing.uihelper.ByResource;
+import com.android.tv.testing.uihelper.Constants;
+import com.android.tv.tests.ui.LiveChannelsTestCase;
+
+import java.util.regex.Pattern;
+
+@MediumTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
+public class DvrLibraryTest extends LiveChannelsTestCase {
+ private static final String PROGRAM_NAME_PREFIX = "Title(";
+
+ private BySelector mRecentRow;
+ private BySelector mScheduledRow;
+ private BySelector mSeriesRow;
+ private BySelector mFullScheduleCard;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mRecentRow = By.hasDescendant(ByResource.text(mTargetResources, R.string.dvr_main_recent));
+ mScheduledRow = By.hasDescendant(
+ ByResource.text(mTargetResources, R.string.dvr_main_scheduled));
+ mSeriesRow = By.hasDescendant(ByResource.text(mTargetResources, R.string.dvr_main_series));
+ mFullScheduleCard = By.focusable(true).hasDescendant(
+ ByResource.text(mTargetResources, R.string.dvr_full_schedule_card_view_title));
+ mLiveChannelsHelper.assertAppStarted();
+ }
+
+ public void testCancel() {
+ mMenuHelper.assertPressDvrLibrary();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, Constants.MENU, false);
+ }
+
+ public void testEmptyLibrary() {
+ mMenuHelper.assertPressDvrLibrary();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+
+ // DVR Library is empty, only Scheduled row and Full schedule card should be displayed.
+ assertHas(mDevice, mRecentRow, false);
+ assertHas(mDevice, mScheduledRow, true);
+ assertHas(mDevice, mSeriesRow, false);
+
+ mDevice.pressDPadCenter();
+ assertWaitUntilFocused(mDevice, mFullScheduleCard);
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+
+ // Empty schedules screen should be shown.
+ assertHas(mDevice, Constants.DVR_SCHEDULES, true);
+ assertHas(mDevice, ByResource.text(mTargetResources, R.string.dvr_schedules_empty_state),
+ true);
+
+ // Close the DVR library.
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ }
+
+ public void testScheduleRecordings() {
+ BySelector newScheduleCard = By.focusable(true).hasDescendant(
+ By.textStartsWith(PROGRAM_NAME_PREFIX)).hasDescendant(By.textEndsWith("today"));
+ BySelector seriesCardWithOneSchedule = By.focusable(true).hasDescendant(
+ By.textStartsWith(PROGRAM_NAME_PREFIX)).hasDescendant(By.text(mTargetResources
+ .getQuantityString(R.plurals.dvr_count_scheduled_recordings, 1, 1)));
+ BySelector seriesCardWithOneRecordedProgram = By.focusable(true).hasDescendant(
+ By.textStartsWith(PROGRAM_NAME_PREFIX)).hasDescendant(By.text(mTargetResources
+ .getQuantityString(R.plurals.dvr_count_new_recordings, 1, 1)));
+ Pattern watchButton = Pattern.compile("^" + mTargetResources
+ .getString(R.string.dvr_detail_watch).toUpperCase() + "\n.*$");
+
+ mMenuHelper.showMenu();
+ mMenuHelper.assertNavigateToPlayControlsRow();
+ mDevice.pressDPadRight();
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.hasObject(
+ ByResource.text(mTargetResources, R.string.dvr_action_record_episode)));
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(
+ ByResource.text(mTargetResources, R.string.dvr_action_record_episode)));
+
+ mMenuHelper.assertPressDvrLibrary();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+
+ // Schedule should be automatically added to the series.
+ assertHas(mDevice, mRecentRow, false);
+ assertHas(mDevice, mScheduledRow, true);
+ assertHas(mDevice, mSeriesRow, true);
+ String programName = mDevice.findObject(By.textStartsWith(PROGRAM_NAME_PREFIX)).getText();
+
+ // Move to scheduled row, there should be one new schedule and one full schedule card.
+ mDevice.pressDPadRight();
+ assertWaitUntilFocused(mDevice, newScheduleCard);
+ mDevice.pressDPadRight();
+ assertWaitUntilFocused(mDevice, mFullScheduleCard);
+
+ // Enters the full schedule, there should be one schedule in the full schedule.
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, Constants.DVR_SCHEDULES, true);
+ assertHas(mDevice, ByResource.text(mTargetResources, R.string.dvr_schedules_empty_state),
+ false);
+ assertHas(mDevice, By.textStartsWith(programName), true);
+
+ // Moves to the series card, clicks it, the detail page should be shown with "View schedule"
+ // button.
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ mDevice.pressDPadLeft();
+ assertWaitUntilFocused(mDevice, newScheduleCard);
+ mDevice.pressDPadDown();
+ assertWaitUntilFocused(mDevice, seriesCardWithOneSchedule);
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_view_schedule).toUpperCase()), true);
+ assertHas(mDevice, By.text(watchButton), false);
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_series_delete).toUpperCase()), false);
+
+ // Clicks the new schedule, the detail page should be shown with "Stop recording" button.
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ assertWaitUntilFocused(mDevice, seriesCardWithOneSchedule);
+ mDevice.pressDPadUp();
+ assertWaitUntilFocused(mDevice, newScheduleCard);
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_stop_recording).toUpperCase()), true);
+
+ // Stops the recording
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.hasObject(
+ ByResource.text(mTargetResources, R.string.dvr_action_stop)));
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(
+ ByResource.text(mTargetResources, R.string.dvr_action_stop)));
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ assertWaitUntilFocused(mDevice, mFullScheduleCard);
+
+ // Moves to series' detail page again, now it should have two more buttons
+ mDevice.pressDPadDown();
+ assertWaitUntilFocused(mDevice, seriesCardWithOneRecordedProgram);
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, By.text(watchButton), true);
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_view_schedule).toUpperCase()), true);
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_series_delete).toUpperCase()), true);
+
+ // Moves to the recent row and clicks the recent recorded program.
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ assertWaitUntilFocused(mDevice, seriesCardWithOneRecordedProgram);
+ mDevice.pressDPadUp();
+ assertWaitUntilFocused(mDevice, mFullScheduleCard);
+ mDevice.pressDPadUp();
+ assertWaitUntilFocused(mDevice, By.focusable(true).hasDescendant(By.text(programName)));
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_watch).toUpperCase()), true);
+ assertHas(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_delete).toUpperCase()), true);
+
+ // Moves to the delete button and clicks to remove the recorded program.
+ mDevice.pressDPadRight();
+ assertWaitUntilFocused(mDevice, By.text(mTargetResources
+ .getString(R.string.dvr_detail_delete).toUpperCase()));
+ mDevice.pressDPadCenter();
+ assertWaitForCondition(mDevice, Until.hasObject(Constants.DVR_LIBRARY));
+ assertWaitUntilFocused(mDevice, mFullScheduleCard);
+
+ // DVR Library should be empty now.
+ assertHas(mDevice, mRecentRow, false);
+ assertHas(mDevice, mScheduledRow, true);
+ assertHas(mDevice, mSeriesRow, false);
+
+ // Close the DVR library.
+ mDevice.pressBack();
+ assertWaitForCondition(mDevice, Until.gone(Constants.DVR_LIBRARY));
+ }
+}