HDMICEC: Invalidate <Active Source> from unexpected logical addresses
The <Active Source> message can only be processed if it is received from a logical address that is not specific to recorders or audio systems. Test: atest HdmiCecMessageValidatorTest Bug: 238417516 Change-Id: Ib0d4169d87d4aa8589a0a12916968f6deb1071f4
This commit is contained in:
@@ -99,7 +99,8 @@ public class HdmiCecMessageValidator {
|
||||
// Messages related to the physical address.
|
||||
PhysicalAddressValidator physicalAddressValidator = new PhysicalAddressValidator();
|
||||
addValidationInfo(Constants.MESSAGE_ACTIVE_SOURCE,
|
||||
physicalAddressValidator, ADDR_ALL, ADDR_BROADCAST);
|
||||
physicalAddressValidator, ADDR_ALL ^ (ADDR_RECORDER_1 | ADDR_RECORDER_2
|
||||
| ADDR_AUDIO_SYSTEM | ADDR_RECORDER_3), ADDR_BROADCAST);
|
||||
addValidationInfo(Constants.MESSAGE_INACTIVE_SOURCE,
|
||||
physicalAddressValidator, ADDR_NOT_UNREGISTERED, ADDR_DIRECT);
|
||||
addValidationInfo(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS,
|
||||
|
||||
@@ -149,31 +149,4 @@ public class ActiveSourceActionTest {
|
||||
assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress);
|
||||
assertThat(playbackDevice.isActiveSource()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void audioDevice_sendsActiveSource_noMenuStatus() {
|
||||
HdmiCecLocalDeviceAudioSystem audioDevice = new HdmiCecLocalDeviceAudioSystem(
|
||||
mHdmiControlService);
|
||||
audioDevice.init();
|
||||
mLocalDevices.add(audioDevice);
|
||||
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
|
||||
mTestLooper.dispatchAll();
|
||||
|
||||
HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
|
||||
audioDevice, ADDR_TV);
|
||||
audioDevice.addAndStartAction(action);
|
||||
mTestLooper.dispatchAll();
|
||||
|
||||
HdmiCecMessage activeSource =
|
||||
HdmiCecMessageBuilder.buildActiveSource(
|
||||
audioDevice.getDeviceInfo().getLogicalAddress(), mPhysicalAddress);
|
||||
HdmiCecMessage menuStatus =
|
||||
HdmiCecMessageBuilder.buildReportMenuStatus(
|
||||
audioDevice.getDeviceInfo().getLogicalAddress(),
|
||||
ADDR_TV,
|
||||
Constants.MENU_STATE_ACTIVATED);
|
||||
|
||||
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
|
||||
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(menuStatus);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
|
||||
package com.android.server.hdmi;
|
||||
|
||||
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
|
||||
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
|
||||
import static com.android.server.hdmi.Constants.ADDR_RECORDER_1;
|
||||
import static com.android.server.hdmi.Constants.ADDR_RECORDER_2;
|
||||
import static com.android.server.hdmi.Constants.ADDR_RECORDER_3;
|
||||
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_DESTINATION;
|
||||
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_PARAMETER;
|
||||
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_PARAMETER_LONG;
|
||||
@@ -38,7 +43,9 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/** Tests for {@link com.android.server.hdmi.HdmiCecMessageValidator} class. */
|
||||
@SmallTest
|
||||
@@ -640,6 +647,22 @@ public class HdmiCecMessageValidatorTest {
|
||||
assertMessageValidity("4F:80:12:00:50:50").isEqualTo(ERROR_PARAMETER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isValid_activeSource() {
|
||||
// Only source devices should broadcast <Active Source> messages.
|
||||
List<Integer> nonSourceDevicesAddresses = Arrays.asList(ADDR_RECORDER_1, ADDR_RECORDER_2,
|
||||
ADDR_AUDIO_SYSTEM, ADDR_RECORDER_3);
|
||||
|
||||
for (int i = 0; i < ADDR_BROADCAST; ++i) {
|
||||
String message = Integer.toHexString(i) + "F:82:10:00";
|
||||
if (nonSourceDevicesAddresses.contains(i)) {
|
||||
assertMessageValidity(message).isEqualTo(ERROR_SOURCE);
|
||||
} else {
|
||||
assertMessageValidity(message).isEqualTo(OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private IntegerSubject assertMessageValidity(String message) {
|
||||
return assertThat(HdmiUtils.buildMessage(message).getValidationResult());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user