RecordingTaskTest.java revision 3a72b93e554bd22a5c64e71a6956d9604ce05108
1/* 2 * Copyright (C) 2015 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 17package com.android.tv.dvr; 18 19import static org.mockito.Matchers.any; 20import static org.mockito.Matchers.anyInt; 21import static org.mockito.Matchers.anyLong; 22import static org.mockito.Matchers.argThat; 23import static org.mockito.Matchers.eq; 24import static org.mockito.Matchers.longThat; 25import static org.mockito.Mockito.verify; 26import static org.mockito.Mockito.verifyNoMoreInteractions; 27import static org.mockito.Mockito.when; 28 29import android.os.Handler; 30import android.os.Looper; 31import android.os.Message; 32import android.os.SystemClock; 33import android.support.test.filters.SdkSuppress; 34import android.test.AndroidTestCase; 35import android.test.suitebuilder.annotation.SmallTest; 36 37import com.android.tv.common.recording.TvRecording; 38import com.android.tv.data.Channel; 39import com.android.tv.dvr.RecordingTask.State; 40import com.android.tv.testing.FakeClock; 41import com.android.tv.testing.dvr.RecordingTestUtils; 42 43import org.hamcrest.BaseMatcher; 44import org.hamcrest.Description; 45import org.mockito.ArgumentMatcher; 46import org.mockito.Mock; 47import org.mockito.MockitoAnnotations; 48 49import java.util.concurrent.TimeUnit; 50 51/** 52 * Tests for {@link RecordingTask}. 53 */ 54@SmallTest 55@SdkSuppress(minSdkVersion = 23) 56public class RecordingTaskTest extends AndroidTestCase { 57 private static final long DURATION = TimeUnit.MINUTES.toMillis(30); 58 private static final long START_OFFSET = Scheduler.MS_TO_WAKE_BEFORE_START; 59 60 private FakeClock mFakeClock; 61 private DvrDataManagerInMemoryImpl mDataManager; 62 @Mock 63 Handler mMockHandler; 64 @Mock 65 DvrSessionManager mMockSessionManager; 66 @Mock 67 TvRecording.TvRecordingClient mMockTvRecordingClient; 68 69 @Override 70 protected void setUp() throws Exception { 71 super.setUp(); 72 if (Looper.myLooper() == null) { 73 Looper.prepare(); 74 } 75 MockitoAnnotations.initMocks(this); 76 mFakeClock = FakeClock.createWithCurrentTime(); 77 mDataManager = new DvrDataManagerInMemoryImpl(getContext()); 78 } 79 80 81 public void testHandle_init() { 82 Recording r = createRecording(); 83 RecordingTask task = createRecordingTask(r); 84 Channel channel = r.getChannel(); 85 String inputId = channel.getInputId(); 86 when(mMockSessionManager.canAcquireDvrSession(inputId, channel)).thenReturn(true); 87 when(mMockSessionManager.acquireDvrSession(inputId, channel)) 88 .thenReturn(mMockTvRecordingClient); 89 when(mMockHandler.sendEmptyMessageDelayed(anyInt(), anyLong())).thenReturn(true); 90 91 long delay = START_OFFSET - RecordingTask.MS_BEFORE_START; 92 long uptime = SystemClock.uptimeMillis(); 93 assertTrue(task.handleMessage(createMessage(RecordingTask.MESSAGE_INIT))); 94 95 assertEquals(State.CONNECTION_PENDING, task.getState()); 96 verify(mMockSessionManager).canAcquireDvrSession(inputId, channel); 97 verify(mMockSessionManager).acquireDvrSession(inputId, channel); 98 verify(mMockTvRecordingClient).connect(eq(inputId), any(TvRecording.ClientCallback.class)); 99 100 verifySendMessageAt(RecordingTask.MESSAGE_START_RECORDING, uptime + delay); 101 verifyNoMoreInteractions(mMockHandler, mMockTvRecordingClient, mMockSessionManager); 102 } 103 104 105 public void testHandle_init_cannotAcquireSession() { 106 Recording r = createRecording(); 107 r = mDataManager.addRecordingInternal(r); 108 RecordingTask task = createRecordingTask(r); 109 110 when(mMockSessionManager.canAcquireDvrSession(r.getChannel().getInputId(), r.getChannel())) 111 .thenReturn(false); 112 113 assertTrue(task.handleMessage(createMessage(RecordingTask.MESSAGE_INIT))); 114 115 assertEquals(State.ERROR, task.getState()); 116 verifySendMessage(Scheduler.HandlerWrapper.MESSAGE_REMOVE); 117 Recording updatedRecording = mDataManager.getRecording(r.getId()); 118 assertEquals("status", Recording.STATE_RECORDING_FAILED, updatedRecording.getState()); 119 } 120 121 public void testOnConnected() { 122 Recording r = createRecording(); 123 mDataManager.addRecording(r); 124 RecordingTask task = createRecordingTask(r); 125 126 task.onConnected(); 127 128 assertEquals(State.CONNECTED, task.getState()); 129 } 130 131 private Recording createRecording() { 132 long startTime = mFakeClock.currentTimeMillis() + START_OFFSET; 133 long endTime = startTime + DURATION; 134 return RecordingTestUtils.createTestRecordingWithPeriod(startTime, endTime); 135 } 136 137 private RecordingTask createRecordingTask(Recording r) { 138 RecordingTask recordingTask = new RecordingTask(r, mMockSessionManager, mDataManager, 139 mFakeClock); 140 recordingTask.setHandler(mMockHandler); 141 return recordingTask; 142 } 143 144 private void verifySendMessage(int what) { 145 verify(mMockHandler).sendMessageAtTime(argThat(messageMatchesWhat(what)), anyLong()); 146 } 147 148 private void verifySendMessageAt(int what, long when) { 149 verify(mMockHandler).sendMessageAtTime(argThat(messageMatchesWhat(what)), delta(when, 100)); 150 } 151 152 private static long delta(final long value, final long delta) { 153 return longThat(new BaseMatcher<Long>() { 154 @Override 155 public boolean matches(Object item) { 156 Long other = (Long) item; 157 return other >= value - delta && other <= value + delta; 158 } 159 160 @Override 161 public void describeTo(Description description) { 162 description.appendText("eq " + value + "±" + delta); 163 164 } 165 }); 166 } 167 168 private Message createMessage(int what) { 169 Message msg = new Message(); 170 msg.setTarget(mMockHandler); 171 msg.what = what; 172 return msg; 173 } 174 175 public static ArgumentMatcher<Message> messageMatchesWhat(final int what) { 176 return new ArgumentMatcher<Message>() { 177 @Override 178 public boolean matches(Object argument) { 179 Message message = (Message) argument; 180 return message.what == what; 181 } 182 }; 183 } 184}