1 /*
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  */
16 package com.android.server.hdmi;
17 
18 import static com.google.common.truth.Truth.assertThat;
19 
20 import static junit.framework.Assert.assertTrue;
21 
22 import static org.mockito.Mockito.doReturn;
23 import static org.mockito.Mockito.never;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26 import static org.testng.Assert.assertThrows;
27 
28 import android.content.Context;
29 import android.content.res.Resources;
30 import android.hardware.hdmi.HdmiControlManager;
31 import android.os.test.TestLooper;
32 import android.platform.test.annotations.Presubmit;
33 
34 import androidx.test.InstrumentationRegistry;
35 import androidx.test.filters.SmallTest;
36 
37 import com.android.internal.R;
38 
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 import org.junit.runners.JUnit4;
43 import org.mockito.Mock;
44 import org.mockito.MockitoAnnotations;
45 
46 @SmallTest
47 @Presubmit
48 @RunWith(JUnit4.class)
49 public final class HdmiCecConfigTest {
50     private static final String TAG = "HdmiCecConfigTest";
51 
52     private static final int TIMEOUT_CONTENT_CHANGE_SEC = 3;
53 
54     private final TestLooper mTestLooper = new TestLooper();
55 
56     private Context mContext;
57 
58     @Mock private HdmiCecConfig.StorageAdapter mStorageAdapter;
59     @Mock private HdmiCecConfig.SettingChangeListener mSettingChangeListener;
60 
setBooleanResource(int resId, boolean value)61     private void setBooleanResource(int resId, boolean value) {
62         Resources resources = mContext.getResources();
63         doReturn(value).when(resources).getBoolean(resId);
64     }
65 
66     @Before
setUp()67     public void setUp() throws Exception {
68         MockitoAnnotations.initMocks(this);
69         mContext = FakeHdmiCecConfig.buildContext(InstrumentationRegistry.getTargetContext());
70     }
71 
72     @Test
getAllCecSettings_BasicSanity()73     public void getAllCecSettings_BasicSanity() {
74         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
75         assertThat(hdmiCecConfig.getAllSettings())
76                 .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
77                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
78                     HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL,
79                     HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE,
80                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
81                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
82                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
83                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
84                     HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
85                     HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY,
86                     HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP,
87                     HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE,
88                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV,
89                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU,
90                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU,
91                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU,
92                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU,
93                     HdmiControlManager
94                         .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU,
95                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM,
96                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD,
97                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1,
98                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3,
99                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2,
100                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC,
101                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS,
102                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC,
103                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO,
104                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP,
105                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD,
106                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD,
107                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST,
108                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO,
109                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX,
110                     HdmiControlManager.SETTING_NAME_EARC_ENABLED);
111     }
112 
113     @Test
getUserCecSettings_BasicSanity()114     public void getUserCecSettings_BasicSanity() {
115         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
116         assertThat(hdmiCecConfig.getUserSettings())
117                 .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
118                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
119                     HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL,
120                     HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE,
121                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
122                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
123                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
124                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
125                     HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
126                     HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY,
127                     HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP,
128                     HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE,
129                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV,
130                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU,
131                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU,
132                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU,
133                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU,
134                     HdmiControlManager
135                         .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU,
136                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM,
137                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD,
138                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1,
139                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3,
140                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2,
141                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC,
142                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS,
143                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC,
144                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO,
145                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP,
146                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD,
147                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD,
148                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST,
149                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO,
150                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX,
151                     HdmiControlManager.SETTING_NAME_EARC_ENABLED);
152     }
153 
154     @Test
getUserCecSettings_WithOverride()155     public void getUserCecSettings_WithOverride() {
156         setBooleanResource(R.bool.config_cecHdmiCecEnabled_userConfigurable, false);
157         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
158         assertThat(hdmiCecConfig.getUserSettings())
159                 .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
160                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
161                     HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL,
162                     HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE,
163                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
164                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
165                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
166                     HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
167                     HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY,
168                     HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP,
169                     HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE,
170                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV,
171                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU,
172                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU,
173                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU,
174                     HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU,
175                     HdmiControlManager
176                         .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU,
177                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM,
178                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD,
179                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1,
180                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3,
181                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2,
182                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC,
183                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS,
184                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC,
185                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO,
186                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP,
187                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD,
188                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD,
189                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST,
190                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO,
191                     HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX,
192                     HdmiControlManager.SETTING_NAME_EARC_ENABLED);
193     }
194 
195     @Test
isStringValueType_InvalidSetting()196     public void isStringValueType_InvalidSetting() {
197         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
198         assertThrows(IllegalArgumentException.class,
199                 () -> hdmiCecConfig.isStringValueType("foo"));
200     }
201 
202     @Test
isStringValueType_BasicSanity()203     public void isStringValueType_BasicSanity() {
204         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
205         assertTrue(hdmiCecConfig.isStringValueType(
206                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE));
207     }
208 
209     @Test
isIntValueType_InvalidSetting()210     public void isIntValueType_InvalidSetting() {
211         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
212         assertThrows(IllegalArgumentException.class,
213                 () -> hdmiCecConfig.isIntValueType("foo"));
214     }
215 
216     @Test
isIntValueType_BasicSanity()217     public void isIntValueType_BasicSanity() {
218         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
219         assertTrue(hdmiCecConfig.isIntValueType(
220                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED));
221     }
222 
223     @Test
getAllowedStringValues_InvalidSetting()224     public void getAllowedStringValues_InvalidSetting() {
225         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
226         assertThrows(IllegalArgumentException.class,
227                 () -> hdmiCecConfig.getAllowedStringValues("foo"));
228     }
229 
230     @Test
getAllowedStringValues_InvalidValueType()231     public void getAllowedStringValues_InvalidValueType() {
232         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
233         assertThrows(IllegalArgumentException.class,
234                 () -> hdmiCecConfig.getAllowedStringValues(
235                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED));
236     }
237 
238     @Test
getAllowedStringValues_BasicSanity()239     public void getAllowedStringValues_BasicSanity() {
240         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
241         assertThat(hdmiCecConfig.getAllowedStringValues(
242                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE))
243                 .containsExactly(HdmiControlManager.POWER_CONTROL_MODE_TV,
244                                  HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM,
245                                  HdmiControlManager.POWER_CONTROL_MODE_BROADCAST,
246                                  HdmiControlManager.POWER_CONTROL_MODE_NONE);
247     }
248 
249     @Test
getAllowedStringValues_WithOverride()250     public void getAllowedStringValues_WithOverride() {
251         setBooleanResource(R.bool.config_cecPowerControlModeNone_allowed, false);
252         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
253         assertThat(hdmiCecConfig.getAllowedStringValues(
254                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE))
255                 .containsExactly(HdmiControlManager.POWER_CONTROL_MODE_TV,
256                                  HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM,
257                                  HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
258     }
259 
260     @Test
getAllowedIntValues_InvalidSetting()261     public void getAllowedIntValues_InvalidSetting() {
262         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
263         assertThrows(IllegalArgumentException.class,
264                 () -> hdmiCecConfig.getAllowedIntValues("foo"));
265     }
266 
267     @Test
getAllowedIntValues_InvalidValueType()268     public void getAllowedIntValues_InvalidValueType() {
269         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
270         assertThrows(IllegalArgumentException.class,
271                 () -> hdmiCecConfig.getAllowedIntValues(
272                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE));
273     }
274 
275     @Test
getAllowedIntValues_BasicSanity()276     public void getAllowedIntValues_BasicSanity() {
277         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
278         assertThat(hdmiCecConfig.getAllowedIntValues(
279                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED))
280                 .containsExactly(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED,
281                                  HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
282     }
283 
284     @Test
getAllowedIntValues_WithOverride()285     public void getAllowedIntValues_WithOverride() {
286         setBooleanResource(R.bool.config_cecHdmiCecControlDisabled_allowed, false);
287         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
288         assertThat(hdmiCecConfig.getAllowedIntValues(
289                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED))
290                 .containsExactly(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
291     }
292 
293     @Test
getDefaultStringValue_InvalidSetting()294     public void getDefaultStringValue_InvalidSetting() {
295         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
296         assertThrows(IllegalArgumentException.class,
297                 () -> hdmiCecConfig.getDefaultStringValue("foo"));
298     }
299 
300     @Test
getDefaultStringValue_InvalidValueType()301     public void getDefaultStringValue_InvalidValueType() {
302         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
303         assertThrows(IllegalArgumentException.class,
304                 () -> hdmiCecConfig.getDefaultStringValue(
305                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED));
306     }
307 
308     @Test
getDefaultStringValue_BasicSanity()309     public void getDefaultStringValue_BasicSanity() {
310         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
311         assertThat(hdmiCecConfig.getDefaultStringValue(
312                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE))
313                 .isEqualTo(HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM);
314     }
315 
316     @Test
getDefaultStringValue_WithOverride()317     public void getDefaultStringValue_WithOverride() {
318         setBooleanResource(R.bool.config_cecPowerControlModeTvAndAudioSystem_default, false);
319         setBooleanResource(R.bool.config_cecPowerControlModeBroadcast_default, true);
320         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
321         assertThat(hdmiCecConfig.getDefaultStringValue(
322                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE))
323                 .isEqualTo(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
324     }
325 
326     @Test
getDefaultStringValue_MultipleDefaults()327     public void getDefaultStringValue_MultipleDefaults() {
328         setBooleanResource(R.bool.config_cecPowerControlModeBroadcast_default, true);
329         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
330         assertThat(hdmiCecConfig.getDefaultStringValue(
331                 HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE))
332                 .isEqualTo(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
333     }
334 
335     @Test
getDefaultStringValue_NoDefault()336     public void getDefaultStringValue_NoDefault() {
337         setBooleanResource(R.bool.config_cecPowerControlModeTvAndAudioSystem_default, false);
338         assertThrows(RuntimeException.class,
339                 () -> new HdmiCecConfig(mContext, mStorageAdapter));
340     }
341 
342     @Test
getDefaultIntValue_InvalidSetting()343     public void getDefaultIntValue_InvalidSetting() {
344         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
345         assertThrows(IllegalArgumentException.class,
346                 () -> hdmiCecConfig.getDefaultIntValue("foo"));
347     }
348 
349     @Test
getDefaultIntValue_InvalidValueType()350     public void getDefaultIntValue_InvalidValueType() {
351         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
352         assertThrows(IllegalArgumentException.class,
353                 () -> hdmiCecConfig.getDefaultIntValue(
354                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE));
355     }
356 
357     @Test
getDefaultIntValue_BasicSanity()358     public void getDefaultIntValue_BasicSanity() {
359         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
360         assertThat(hdmiCecConfig.getDefaultIntValue(
361                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED))
362                 .isEqualTo(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
363     }
364 
365     @Test
getDefaultIntValue_WithOverride()366     public void getDefaultIntValue_WithOverride() {
367         setBooleanResource(R.bool.config_cecHdmiCecControlEnabled_default, false);
368         setBooleanResource(R.bool.config_cecHdmiCecControlDisabled_default, true);
369         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
370         assertThat(hdmiCecConfig.getDefaultIntValue(
371                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED))
372                 .isEqualTo(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
373     }
374 
375     @Test
getStringValue_InvalidSetting()376     public void getStringValue_InvalidSetting() {
377         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
378         assertThrows(IllegalArgumentException.class,
379                 () -> hdmiCecConfig.getStringValue("foo"));
380     }
381 
382     @Test
getStringValue_InvalidType()383     public void getStringValue_InvalidType() {
384         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
385         assertThrows(IllegalArgumentException.class,
386                 () -> hdmiCecConfig.getStringValue(
387                     HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED));
388     }
389 
390     @Test
getStringValue_SharedPref_BasicSanity()391     public void getStringValue_SharedPref_BasicSanity() {
392         when(mStorageAdapter.retrieveSharedPref(
393                   HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
394                   HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE))
395                 .thenReturn(
396                         HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
397         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
398         assertThat(hdmiCecConfig.getStringValue(
399                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST))
400                 .isEqualTo(HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
401     }
402 
403     @Test
getIntValue_InvalidSetting()404     public void getIntValue_InvalidSetting() {
405         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
406         assertThrows(IllegalArgumentException.class,
407                 () -> hdmiCecConfig.getIntValue("foo"));
408     }
409 
410     @Test
getIntValue_InvalidType()411     public void getIntValue_InvalidType() {
412         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
413         assertThrows(IllegalArgumentException.class,
414                 () -> hdmiCecConfig.getIntValue(
415                     HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE));
416     }
417 
418     @Test
getIntValue_SharedPref_BasicSanity()419     public void getIntValue_SharedPref_BasicSanity() {
420         when(mStorageAdapter.retrieveSharedPref(
421                   HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
422                   Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED)))
423                 .thenReturn(Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
424         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
425         assertThat(hdmiCecConfig.getIntValue(
426                     HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING))
427                 .isEqualTo(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
428     }
429 
430     @Test
setStringValue_InvalidSetting()431     public void setStringValue_InvalidSetting() {
432         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
433         assertThrows(IllegalArgumentException.class,
434                 () -> hdmiCecConfig.setStringValue("foo", "bar"));
435     }
436 
437     @Test
setStringValue_NotConfigurable()438     public void setStringValue_NotConfigurable() {
439         setBooleanResource(R.bool.config_cecPowerControlMode_userConfigurable, false);
440         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
441         assertThrows(IllegalArgumentException.class,
442                 () -> hdmiCecConfig.setStringValue(
443                         HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
444                         HdmiControlManager.POWER_CONTROL_MODE_BROADCAST));
445     }
446 
447     @Test
setStringValue_InvalidValue()448     public void setStringValue_InvalidValue() {
449         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
450         assertThrows(IllegalArgumentException.class,
451                 () -> hdmiCecConfig.setStringValue(
452                         HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
453                         "bar"));
454     }
455 
456     @Test
setStringValue_SharedPref_BasicSanity()457     public void setStringValue_SharedPref_BasicSanity() {
458         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
459         hdmiCecConfig.setStringValue(
460                   HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
461                   HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
462         verify(mStorageAdapter).storeSharedPref(
463                   HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
464                   HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
465     }
466 
467     @Test
setIntValue_InvalidSetting()468     public void setIntValue_InvalidSetting() {
469         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
470         assertThrows(IllegalArgumentException.class,
471                 () -> hdmiCecConfig.setIntValue("foo", 0));
472     }
473 
474     @Test
setIntValue_NotConfigurable()475     public void setIntValue_NotConfigurable() {
476         setBooleanResource(R.bool.config_cecHdmiCecEnabled_userConfigurable, false);
477         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
478         assertThrows(IllegalArgumentException.class,
479                 () -> hdmiCecConfig.setIntValue(
480                         HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
481                         HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
482     }
483 
484     @Test
setIntValue_InvalidValue()485     public void setIntValue_InvalidValue() {
486         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
487         assertThrows(IllegalArgumentException.class,
488                 () -> hdmiCecConfig.setIntValue(
489                         HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
490                         123));
491     }
492 
493     @Test
setIntValue_SharedPref_BasicSanity()494     public void setIntValue_SharedPref_BasicSanity() {
495         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
496         hdmiCecConfig.setIntValue(
497                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
498                 HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
499         verify(mStorageAdapter).storeSharedPref(
500                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
501                 Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
502     }
503 
504     @Test
registerChangeListener_SharedPref_BasicSanity()505     public void registerChangeListener_SharedPref_BasicSanity() {
506         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
507         hdmiCecConfig.registerChangeListener(
508                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
509                 mSettingChangeListener);
510         hdmiCecConfig.setIntValue(
511                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
512                 HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
513         verify(mSettingChangeListener).onChange(
514                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING);
515     }
516 
517     @Test
removeChangeListener_SharedPref_BasicSanity()518     public void removeChangeListener_SharedPref_BasicSanity() {
519         HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
520         hdmiCecConfig.registerChangeListener(
521                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
522                 mSettingChangeListener);
523         hdmiCecConfig.removeChangeListener(
524                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
525                 mSettingChangeListener);
526         hdmiCecConfig.setIntValue(
527                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
528                 HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
529         verify(mSettingChangeListener, never()).onChange(
530                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING);
531     }
532 }
533