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