blob: b392935cc9b5e82ccdce122d3c12b2f0d4e12988 [file] [log] [blame]
Amy2a6c3dc2018-06-05 17:31:55 -07001/*
2 * Copyright (C) 2018 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 */
16package com.android.server.hdmi;
17
18import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
Amy9b91e8c2018-06-11 17:26:26 -070019import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
Amy2a6c3dc2018-06-05 17:31:55 -070020import static com.android.server.hdmi.Constants.ADDR_TV;
Amy4e7ff1a2018-06-07 16:24:31 -070021import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
Amyb887fa02018-06-21 11:22:13 -070022import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
Amy6506bd62018-07-02 17:29:36 -070023import static com.google.common.truth.Truth.assertThat;
Amy9b91e8c2018-06-11 17:26:26 -070024import static junit.framework.Assert.assertFalse;
Amy2a6c3dc2018-06-05 17:31:55 -070025import static junit.framework.Assert.assertTrue;
26import static junit.framework.Assert.assertEquals;
27
28import android.media.AudioManager;
Amy4e7ff1a2018-06-07 16:24:31 -070029import android.os.Looper;
Amy4e7ff1a2018-06-07 16:24:31 -070030import android.os.test.TestLooper;
Amy2a6c3dc2018-06-05 17:31:55 -070031import android.support.test.filters.SmallTest;
Nick Chalko7206f3b2018-06-19 10:17:03 -070032
Amy4e7ff1a2018-06-07 16:24:31 -070033import java.util.ArrayList;
Amy2a6c3dc2018-06-05 17:31:55 -070034import org.junit.Before;
35import org.junit.Test;
36import org.junit.runner.RunWith;
37import org.junit.runners.JUnit4;
38
39@SmallTest
40@RunWith(JUnit4.class)
41/**
42 * Tests for {@link HdmiCecLocalDeviceAudioSystem} class.
43 */
44public class HdmiCecLocalDeviceAudioSystemTest {
45
Amyb887fa02018-06-21 11:22:13 -070046 private static final String TAG = "HdmiCecLocalDeviceAudioSystemTest";
Amy2a6c3dc2018-06-05 17:31:55 -070047 private HdmiControlService mHdmiControlService;
Amy4e7ff1a2018-06-07 16:24:31 -070048 private HdmiCecController mHdmiCecController;
Amy2a6c3dc2018-06-05 17:31:55 -070049 private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
Nick Chalko7206f3b2018-06-19 10:17:03 -070050 private FakeNativeWrapper mNativeWrapper;
Amy4e7ff1a2018-06-07 16:24:31 -070051 private Looper mMyLooper;
52 private TestLooper mTestLooper = new TestLooper();
53 private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
Amy2a6c3dc2018-06-05 17:31:55 -070054 private int mMusicVolume;
55 private int mMusicMaxVolume;
56 private boolean mMusicMute;
Amy0fd41e32018-06-21 13:40:27 -070057 private boolean isAwake;
Amy2a6c3dc2018-06-05 17:31:55 -070058
59 @Before
60 public void SetUp() {
Amy0fd41e32018-06-21 13:40:27 -070061 isAwake = false;
Amy2a6c3dc2018-06-05 17:31:55 -070062 mHdmiControlService = new HdmiControlService(null) {
63 @Override
64 AudioManager getAudioManager() {
65 return new AudioManager() {
66 @Override
67 public int getStreamVolume(int streamType) {
68 switch (streamType) {
69 case STREAM_MUSIC:
70 return mMusicVolume;
71 default:
72 return 0;
73 }
74 }
75
76 @Override
77 public boolean isStreamMute(int streamType) {
78 switch (streamType) {
79 case STREAM_MUSIC:
80 return mMusicMute;
81 default:
82 return false;
83 }
84 }
85
86 @Override
87 public int getStreamMaxVolume(int streamType) {
88 switch (streamType) {
89 case STREAM_MUSIC:
90 return mMusicMaxVolume;
91 default:
92 return 100;
93 }
94 }
Amy2a6c3dc2018-06-05 17:31:55 -070095
Amy9b91e8c2018-06-11 17:26:26 -070096 @Override
97 public void adjustStreamVolume(int streamType, int direction, int flags) {
98 switch (streamType) {
99 case STREAM_MUSIC:
100 if (direction == AudioManager.ADJUST_UNMUTE) {
101 mMusicMute = false;
102 } else if (direction == AudioManager.ADJUST_MUTE) {
103 mMusicMute = true;
104 }
105 default:
106 }
107 }
108 };
Amy2a6c3dc2018-06-05 17:31:55 -0700109 }
Amy0fd41e32018-06-21 13:40:27 -0700110
111 @Override
112 void wakeUp() {
113 isAwake = true;
114 }
Amy2a6c3dc2018-06-05 17:31:55 -0700115 };
Amy4e7ff1a2018-06-07 16:24:31 -0700116 mMyLooper = mTestLooper.getLooper();
Amy2a6c3dc2018-06-05 17:31:55 -0700117 mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
Amy4e7ff1a2018-06-07 16:24:31 -0700118 mHdmiCecLocalDeviceAudioSystem.init();
119 mHdmiControlService.setIoLooper(mMyLooper);
120
Nick Chalko7206f3b2018-06-19 10:17:03 -0700121 mNativeWrapper = new FakeNativeWrapper();
Amy4e7ff1a2018-06-07 16:24:31 -0700122 mHdmiCecController = HdmiCecController.createWithNativeWrapper(
Amy9b91e8c2018-06-11 17:26:26 -0700123 mHdmiControlService, mNativeWrapper);
Amy4e7ff1a2018-06-07 16:24:31 -0700124 mHdmiControlService.setCecController(mHdmiCecController);
125 mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
Amy9b91e8c2018-06-11 17:26:26 -0700126 mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
Amy4e7ff1a2018-06-07 16:24:31 -0700127
128 mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
129 mHdmiControlService.initPortInfo();
Amyfc56efb2018-07-09 16:37:07 -0700130 // No TV device interacts with AVR so system audio control won't be turned on here
Amy4e7ff1a2018-06-07 16:24:31 -0700131 mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
132
133 mTestLooper.dispatchAll();
Amy2a6c3dc2018-06-05 17:31:55 -0700134 }
135
136 @Test
137 public void handleGiveAudioStatus_volume_10_mute_true() {
138 mMusicVolume = 10;
139 mMusicMute = true;
140 mMusicMaxVolume = 20;
141 int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume);
142 HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus(
Amy4e7ff1a2018-06-07 16:24:31 -0700143 ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);
Amy9b91e8c2018-06-11 17:26:26 -0700144 HdmiCecMessage messageGive = HdmiCecMessageBuilder.buildGiveAudioStatus(
Amy2a6c3dc2018-06-05 17:31:55 -0700145 ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy2a6c3dc2018-06-05 17:31:55 -0700146
Amy9b91e8c2018-06-11 17:26:26 -0700147 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive));
148 mTestLooper.dispatchAll();
149 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
Amy2a6c3dc2018-06-05 17:31:55 -0700150 }
Amy87eda822018-06-06 17:56:39 -0700151
152 @Test
Amyfc56efb2018-07-09 16:37:07 -0700153 public void handleGiveSystemAudioModeStatus_originalOff() {
Amy87eda822018-06-06 17:56:39 -0700154 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
Amyfc56efb2018-07-09 16:37:07 -0700155 .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Amy9b91e8c2018-06-11 17:26:26 -0700156 HdmiCecMessage messageGive = HdmiCecMessageBuilder
Amy87eda822018-06-06 17:56:39 -0700157 .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy87eda822018-06-06 17:56:39 -0700158
Amy9b91e8c2018-06-11 17:26:26 -0700159 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
160 mTestLooper.dispatchAll();
161 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
Amy87eda822018-06-06 17:56:39 -0700162 }
Amy4e7ff1a2018-06-07 16:24:31 -0700163
164 @Test
165 public void handleRequestArcInitiate() {
166 // TODO(b/80296911): Add tests when finishing handler impl.
167 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
168 .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);
Amy4e7ff1a2018-06-07 16:24:31 -0700169 HdmiCecMessage message = HdmiCecMessageBuilder
170 .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy4e7ff1a2018-06-07 16:24:31 -0700171
Amy9b91e8c2018-06-11 17:26:26 -0700172 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message));
173 mTestLooper.dispatchAll();
174 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
Amy4e7ff1a2018-06-07 16:24:31 -0700175 }
176
177 @Test
178 public void handleRequestArcTermination() {
179 // TODO(b/80297105): Add tests when finishing handler impl.
180 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
181 .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);
Amy9b91e8c2018-06-11 17:26:26 -0700182 HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder
Amy4e7ff1a2018-06-07 16:24:31 -0700183 .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy4e7ff1a2018-06-07 16:24:31 -0700184
Amy9b91e8c2018-06-11 17:26:26 -0700185 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff));
186 mTestLooper.dispatchAll();
187 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
188 }
189
190 @Test
Amyfc56efb2018-07-09 16:37:07 -0700191 public void handleSetSystemAudioMode_setOn_orignalOff() {
192 mMusicMute = true;
Amy9b91e8c2018-06-11 17:26:26 -0700193 HdmiCecMessage messageSet = HdmiCecMessageBuilder
Amyfc56efb2018-07-09 16:37:07 -0700194 .buildSetSystemAudioMode(ADDR_TV, ADDR_AUDIO_SYSTEM, true);
Amy9b91e8c2018-06-11 17:26:26 -0700195 HdmiCecMessage messageGive = HdmiCecMessageBuilder
196 .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
197
Amyfc56efb2018-07-09 16:37:07 -0700198 // Check if originally off
Amy9b91e8c2018-06-11 17:26:26 -0700199 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
Amyfc56efb2018-07-09 16:37:07 -0700200 .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Amy9b91e8c2018-06-11 17:26:26 -0700201
202 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
203 mTestLooper.dispatchAll();
204 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
205
Amyfc56efb2018-07-09 16:37:07 -0700206 // Check if correctly turned on
Amy9b91e8c2018-06-11 17:26:26 -0700207 expectMessage = HdmiCecMessageBuilder
Amyfc56efb2018-07-09 16:37:07 -0700208 .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
Amy9b91e8c2018-06-11 17:26:26 -0700209
210 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet));
211 mTestLooper.dispatchAll();
212 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
213 mTestLooper.dispatchAll();
214 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
Amyfc56efb2018-07-09 16:37:07 -0700215 assertFalse(mMusicMute);
Amy9b91e8c2018-06-11 17:26:26 -0700216 }
217
218 @Test
Amy0fd41e32018-06-21 13:40:27 -0700219 public void handleSystemAudioModeRequest_turnOffByTv() {
Amy9b91e8c2018-06-11 17:26:26 -0700220 assertFalse(mMusicMute);
221
222 // Check if feature correctly turned off
Amy0fd41e32018-06-21 13:40:27 -0700223 HdmiCecMessage messageGive = HdmiCecMessageBuilder
224 .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy9b91e8c2018-06-11 17:26:26 -0700225 HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder
226 .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false);
Amy9b91e8c2018-06-11 17:26:26 -0700227
Amy0fd41e32018-06-21 13:40:27 -0700228 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
229 .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
Amy9b91e8c2018-06-11 17:26:26 -0700230 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff));
231 mTestLooper.dispatchAll();
Amy0fd41e32018-06-21 13:40:27 -0700232 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
233
234 expectMessage = HdmiCecMessageBuilder
235 .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Amy9b91e8c2018-06-11 17:26:26 -0700236 assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
237 mTestLooper.dispatchAll();
238 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
239 assertTrue(mMusicMute);
Amy4e7ff1a2018-06-07 16:24:31 -0700240 }
Amyb887fa02018-06-21 11:22:13 -0700241
242 @Test
243 public void onStandbyAudioSystem_currentSystemAudioControlOn() {
244 // Set system audio control on first
245 mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true);
246
247 // Check if standby correctly turns off the feature
248 mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF);
249 mTestLooper.dispatchAll();
250 HdmiCecMessage expectMessage = HdmiCecMessageBuilder
251 .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
252 assertEquals(expectMessage, mNativeWrapper.getResultMessage());
253 assertTrue(mMusicMute);
254 }
Amy6506bd62018-07-02 17:29:36 -0700255
256 @Test
257 public void systemAudioControlOnPowerOn_alwaysOn() {
258 mHdmiCecLocalDeviceAudioSystem.removeAction(
259 SystemAudioInitiationActionFromAvr.class);
260 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
261 Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
262
263 assertThat(mHdmiCecLocalDeviceAudioSystem
264 .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty();
265 }
266
267 @Test
268 public void systemAudioControlOnPowerOn_neverOn() {
269 mHdmiCecLocalDeviceAudioSystem.removeAction(
270 SystemAudioInitiationActionFromAvr.class);
271 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
272 Constants.NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
273
274 assertThat(mHdmiCecLocalDeviceAudioSystem
275 .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty();
276 }
277
278 @Test
279 public void systemAudioControlOnPowerOn_useLastState_off() {
280 mHdmiCecLocalDeviceAudioSystem.removeAction(
281 SystemAudioInitiationActionFromAvr.class);
282 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
283 Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
284
285 assertThat(mHdmiCecLocalDeviceAudioSystem
286 .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty();
287 }
288
289 @Test
290 public void systemAudioControlOnPowerOn_useLastState_on() {
291 mHdmiCecLocalDeviceAudioSystem.removeAction(
292 SystemAudioInitiationActionFromAvr.class);
293 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
294 Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
295
296 assertThat(mHdmiCecLocalDeviceAudioSystem
297 .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty();
298 }
Amy2a6c3dc2018-06-05 17:31:55 -0700299}