1 /*
2  * Copyright (C) 2020 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 
17 package com.android.server.hdmi;
18 
19 import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
20 import static com.android.server.hdmi.Constants.ADDR_TV;
21 import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
22 
23 import static com.google.common.truth.Truth.assertThat;
24 
25 import static org.mockito.Mockito.spy;
26 
27 import android.content.Context;
28 import android.content.ContextWrapper;
29 import android.os.Looper;
30 import android.os.test.TestLooper;
31 import android.platform.test.annotations.Presubmit;
32 
33 import androidx.test.InstrumentationRegistry;
34 import androidx.test.filters.SmallTest;
35 
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.junit.runners.JUnit4;
40 
41 import java.util.ArrayList;
42 import java.util.Collections;
43 
44 /** Tests for {@link ActiveSourceAction} */
45 @SmallTest
46 @Presubmit
47 @RunWith(JUnit4.class)
48 public class ActiveSourceActionTest {
49 
50     private Context mContextSpy;
51     private HdmiControlService mHdmiControlService;
52     private FakeNativeWrapper mNativeWrapper;
53     private FakePowerManagerWrapper mPowerManager;
54 
55     private TestLooper mTestLooper = new TestLooper();
56     private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
57     private int mPhysicalAddress;
58 
59     @Before
setUp()60     public void setUp() throws Exception {
61         mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
62 
63         FakeAudioFramework audioFramework = new FakeAudioFramework();
64         mHdmiControlService = new HdmiControlService(mContextSpy, Collections.emptyList(),
65                 audioFramework.getAudioManager(), audioFramework.getAudioDeviceVolumeManager()) {
66             @Override
67             boolean isPowerStandby() {
68                 return false;
69             }
70 
71             @Override
72             protected void writeStringSystemProperty(String key, String value) {
73                 // do nothing
74             }
75         };
76 
77         Looper looper = mTestLooper.getLooper();
78         mHdmiControlService.setIoLooper(looper);
79         mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy));
80         mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper());
81         mNativeWrapper = new FakeNativeWrapper();
82         HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
83                 this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
84         mHdmiControlService.setCecController(hdmiCecController);
85         mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
86         mHdmiControlService.initService();
87         mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY);
88         mPowerManager = new FakePowerManagerWrapper(mContextSpy);
89         mHdmiControlService.setPowerManager(mPowerManager);
90         mPhysicalAddress = 0x2000;
91         mNativeWrapper.setPhysicalAddress(mPhysicalAddress);
92         mTestLooper.dispatchAll();
93     }
94 
95     @Test
playbackDevice_sendsActiveSource_sendsMenuStatus()96     public void playbackDevice_sendsActiveSource_sendsMenuStatus() {
97         HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback(
98                 mHdmiControlService);
99         playbackDevice.init();
100         mLocalDevices.add(playbackDevice);
101         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
102         mTestLooper.dispatchAll();
103 
104         HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
105                 playbackDevice, ADDR_TV);
106         playbackDevice.addAndStartAction(action);
107         mTestLooper.dispatchAll();
108 
109         HdmiCecMessage activeSource =
110                 HdmiCecMessageBuilder.buildActiveSource(
111                         playbackDevice.getDeviceInfo().getLogicalAddress(), mPhysicalAddress);
112         HdmiCecMessage menuStatus =
113                 HdmiCecMessageBuilder.buildReportMenuStatus(
114                         playbackDevice.getDeviceInfo().getLogicalAddress(),
115                         ADDR_TV,
116                         Constants.MENU_STATE_ACTIVATED);
117 
118         assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
119         assertThat(mNativeWrapper.getResultMessages()).contains(menuStatus);
120     }
121 
122     @Test
playbackDevice_updatesActiveSourceState()123     public void playbackDevice_updatesActiveSourceState() {
124         HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback(
125                 mHdmiControlService);
126         playbackDevice.init();
127         mLocalDevices.add(playbackDevice);
128         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
129         mTestLooper.dispatchAll();
130 
131         HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
132                 playbackDevice, ADDR_TV);
133         playbackDevice.addAndStartAction(action);
134         mTestLooper.dispatchAll();
135 
136         assertThat(playbackDevice.getActiveSource().logicalAddress)
137                 .isEqualTo(playbackDevice.getDeviceInfo().getLogicalAddress());
138         assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress);
139         assertThat(playbackDevice.isActiveSource()).isTrue();
140     }
141 }
142