1633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko/* 2633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * Copyright (C) 2015 The Android Open Source Project 3633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * 4633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * you may not use this file except in compliance with the License. 6633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * You may obtain a copy of the License at 7633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * 8633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * 10633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * Unless required by applicable law or agreed to in writing, software 11633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * See the License for the specific language governing permissions and 14633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko * limitations under the License 15633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko */ 16633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 17633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkopackage com.android.tv.dvr.recorder; 18633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 199d283c91d496eac51237ced05d649081bb08d3e1nchalkoimport static com.google.common.truth.Truth.assertThat; 209d283c91d496eac51237ced05d649081bb08d3e1nchalko 21633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.content.Intent; 22633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.os.Build; 23633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.support.test.filters.SdkSuppress; 24633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.support.test.filters.SmallTest; 25633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.test.ServiceTestCase; 26633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.common.feature.CommonFeatures; 27633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.common.feature.TestableFeature; 28633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport org.mockito.MockitoAnnotations; 29633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 3095961816a768da387f0b5523cf4363ace2044089Nick Chalko/** Tests for {@link DvrRecordingService}. */ 31633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko@SmallTest 32633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N) 33633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkopublic class DvrRecordingServiceTest 34633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko extends ServiceTestCase<DvrRecordingServiceTest.MockDvrRecordingService> { 35633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private final TestableFeature mDvrFeature = CommonFeatures.DVR; 36633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 37633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 38633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko protected void setUp() throws Exception { 39633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko super.setUp(); 40633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mDvrFeature.enableForTest(); 41633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko MockitoAnnotations.initMocks(this); 42633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko setupService(); 43633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 44633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 45633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 46633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko protected void tearDown() throws Exception { 47633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mDvrFeature.resetForTests(); 48633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko super.tearDown(); 49633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 50633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 51633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public DvrRecordingServiceTest() { 52633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko super(MockDvrRecordingService.class); 53633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 54633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 55633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public void testStartService_null() throws Exception { 56633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Not recording 57633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(null); 589d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 59633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 60633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Recording 61633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 62633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(null); 639d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 649d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 65633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().reset(); 66633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 67633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 68633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public void testStartService_noUpcomingRecording() throws Exception { 69633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko Intent intent = new Intent(getContext(), DvrRecordingServiceTest.class); 70633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko intent.putExtra(DvrRecordingService.EXTRA_START_FOR_RECORDING, false); 71633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 72633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Not recording 73633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(intent); 749d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 759d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isFalse(); 76633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopForegroundIfNotRecordingInternal(); 779d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 78633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 79633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Recording, ended quickly 80633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 81633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(intent); 829d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 839d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 849d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 85633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopRecording(); 869d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 879d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 88633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopForegroundIfNotRecordingInternal(); 899d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 909d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 91633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().reset(); 92633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 93633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Recording, ended later 94633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 95633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(intent); 969d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 979d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 989d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 99633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopForegroundIfNotRecordingInternal(); 1009d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1019d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1029d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 103633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopRecording(); 1049d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 1059d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 106633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().reset(); 107633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 108633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 109633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public void testStartService_hasUpcomingRecording() throws Exception { 110633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko Intent intent = new Intent(getContext(), DvrRecordingServiceTest.class); 111633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko intent.putExtra(DvrRecordingService.EXTRA_START_FOR_RECORDING, true); 112633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 113633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Not recording 114633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(intent); 1159d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1169d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1179d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 118633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 1199d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1209d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1219d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 122633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopRecording(); 1239d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 1249d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 125633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().reset(); 126633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 127633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // Recording 128633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 129633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startService(intent); 1309d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1319d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1329d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 133633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().startRecording(); 1349d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1359d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1369d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 137633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopRecording(); 1389d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isTrue(); 1399d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mForegroundForUpcomingRecording).isTrue(); 1409d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isTrue(); 141633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().stopRecording(); 1429d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mInForeground).isFalse(); 1439d283c91d496eac51237ced05d649081bb08d3e1nchalko assertThat(getService().mIsRecording).isFalse(); 144633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko getService().reset(); 145633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 146633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 1479d283c91d496eac51237ced05d649081bb08d3e1nchalko /** Mock {@link DvrRecordingService}. */ 148633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public static class MockDvrRecordingService extends DvrRecordingService { 149633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private int mRecordingCount = 0; 150633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private boolean mInForeground; 151633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private boolean mForegroundForUpcomingRecording; 152633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 153633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 154633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko protected void startForegroundInternal(boolean hasUpcomingRecording) { 155633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mForegroundForUpcomingRecording = hasUpcomingRecording; 156633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mInForeground = true; 157633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 158633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 159633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 160633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko protected void stopForegroundInternal() { 161633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mInForeground = false; 162633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 163633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 164633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private void startRecording() { 165633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mOnRecordingSessionChangeListener.onRecordingSessionChange(true, ++mRecordingCount); 166633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 167633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 168633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private void stopRecording() { 169633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mOnRecordingSessionChangeListener.onRecordingSessionChange(false, --mRecordingCount); 170633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 171633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 172633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private void reset() { 173633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mRecordingCount = 0; 174633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mInForeground = false; 175633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mIsRecording = false; 176633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 177633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 17895961816a768da387f0b5523cf4363ace2044089Nick Chalko} 179