1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.dvr.recorder; 18 19 import static android.support.test.InstrumentationRegistry.getContext; 20 21 import android.os.Build; 22 import android.support.test.filters.SdkSuppress; 23 import android.support.test.filters.SmallTest; 24 import android.test.MoreAsserts; 25 import android.util.LongSparseArray; 26 27 import com.android.tv.common.feature.CommonFeatures; 28 import com.android.tv.common.feature.TestableFeature; 29 import com.android.tv.data.Program; 30 import com.android.tv.dvr.DvrDataManagerInMemoryImpl; 31 import com.android.tv.dvr.data.SeriesRecording; 32 import com.android.tv.testing.FakeClock; 33 34 import org.junit.After; 35 import org.junit.Before; 36 import org.junit.Test; 37 38 import java.util.ArrayList; 39 import java.util.Collections; 40 import java.util.List; 41 42 /** 43 * Tests for {@link SeriesRecordingScheduler} 44 */ 45 @SmallTest 46 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N) 47 public class SeriesRecordingSchedulerTest { 48 private static final String PROGRAM_TITLE = "MyProgram"; 49 private static final long CHANNEL_ID = 123; 50 private static final long SERIES_RECORDING_ID1 = 1; 51 private static final String SERIES_ID = "SERIES_ID"; 52 private static final String SEASON_NUMBER1 = "SEASON NUMBER1"; 53 private static final String SEASON_NUMBER2 = "SEASON NUMBER2"; 54 private static final String EPISODE_NUMBER1 = "EPISODE NUMBER1"; 55 private static final String EPISODE_NUMBER2 = "EPISODE NUMBER2"; 56 57 private final SeriesRecording mBaseSeriesRecording = new SeriesRecording.Builder() 58 .setTitle(PROGRAM_TITLE).setChannelId(CHANNEL_ID).setSeriesId(SERIES_ID).build(); 59 private final Program mBaseProgram = new Program.Builder().setTitle(PROGRAM_TITLE) 60 .setChannelId(CHANNEL_ID).setSeriesId(SERIES_ID).build(); 61 private final TestableFeature mDvrFeature = CommonFeatures.DVR; 62 63 private DvrDataManagerInMemoryImpl mDataManager; 64 65 @Before 66 public void setUp() { 67 mDvrFeature.enableForTest(); 68 FakeClock fakeClock = FakeClock.createWithCurrentTime(); 69 mDataManager = new DvrDataManagerInMemoryImpl(getContext(), fakeClock); 70 } 71 72 @After 73 public void tearDown() { 74 mDvrFeature.resetForTests(); 75 } 76 77 @Test 78 public void testPickOneProgramPerEpisode_onePerEpisode() { 79 SeriesRecording seriesRecording = SeriesRecording.buildFrom(mBaseSeriesRecording) 80 .setId(SERIES_RECORDING_ID1).build(); 81 mDataManager.addSeriesRecording(seriesRecording); 82 List<Program> programs = new ArrayList<>(); 83 Program program1 = new Program.Builder(mBaseProgram).setSeasonNumber(SEASON_NUMBER1) 84 .setEpisodeNumber(EPISODE_NUMBER1).build(); 85 programs.add(program1); 86 Program program2 = new Program.Builder(mBaseProgram).setSeasonNumber(SEASON_NUMBER2) 87 .setEpisodeNumber(EPISODE_NUMBER2).build(); 88 programs.add(program2); 89 LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode( 90 mDataManager, Collections.singletonList(seriesRecording), programs); 91 MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program2); 92 } 93 94 @Test 95 public void testPickOneProgramPerEpisode_manyPerEpisode() { 96 SeriesRecording seriesRecording = SeriesRecording.buildFrom(mBaseSeriesRecording) 97 .setId(SERIES_RECORDING_ID1).build(); 98 mDataManager.addSeriesRecording(seriesRecording); 99 List<Program> programs = new ArrayList<>(); 100 Program program1 = new Program.Builder(mBaseProgram).setSeasonNumber(SEASON_NUMBER1) 101 .setEpisodeNumber(EPISODE_NUMBER1).setStartTimeUtcMillis(0).build(); 102 programs.add(program1); 103 Program program2 = new Program.Builder(program1).setStartTimeUtcMillis(1).build(); 104 programs.add(program2); 105 Program program3 = new Program.Builder(mBaseProgram).setSeasonNumber(SEASON_NUMBER2) 106 .setEpisodeNumber(EPISODE_NUMBER2).build(); 107 programs.add(program3); 108 Program program4 = new Program.Builder(program1).setStartTimeUtcMillis(1).build(); 109 programs.add(program4); 110 LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode( 111 mDataManager, Collections.singletonList(seriesRecording), programs); 112 MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program3); 113 } 114 115 @Test 116 public void testPickOneProgramPerEpisode_nullEpisode() { 117 SeriesRecording seriesRecording = SeriesRecording.buildFrom(mBaseSeriesRecording) 118 .setId(SERIES_RECORDING_ID1).build(); 119 mDataManager.addSeriesRecording(seriesRecording); 120 List<Program> programs = new ArrayList<>(); 121 Program program1 = new Program.Builder(mBaseProgram).setStartTimeUtcMillis(0).build(); 122 programs.add(program1); 123 Program program2 = new Program.Builder(mBaseProgram).setStartTimeUtcMillis(1).build(); 124 programs.add(program2); 125 LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode( 126 mDataManager, Collections.singletonList(seriesRecording), programs); 127 MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program2); 128 } 129 } 130