From 525beb28e50be024bcd0570cca1ed9128a6e4b68 Mon Sep 17 00:00:00 2001 From: Shraddha Basantwani Date: Tue, 3 Nov 2020 17:49:54 +0530 Subject: [PATCH] CEC : Add validator for select analogue service message Test: atest HdmiCecMessageValidatorTest Bug: 170811408 Change-Id: I540c290090a3ea48b04a678e39325aa7d419e04a --- .../server/hdmi/HdmiCecMessageValidator.java | 21 +++++++++++++++++++ .../hdmi/HdmiCecMessageValidatorTest.java | 16 ++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java index a3ae72e189614..46913227ff7e2 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java @@ -159,6 +159,10 @@ public class HdmiCecMessageValidator { // TODO: Handle messages for the Tuner Control. addValidationInfo( Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS, statusRequestValidator, DEST_DIRECT); + addValidationInfo( + Constants.MESSAGE_SELECT_ANALOG_SERVICE, + new SelectAnalogueServiceValidator(), + DEST_DIRECT); // Messages for the Vendor Specific Commands. VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14); @@ -890,4 +894,21 @@ public class HdmiCecMessageValidator { || (params[0] == 0x20)); } } + + /** + * Check if the given select analogue service parameter is valid. A valid parameter should lie + * within the range description defined in CEC 1.4 Specification : Operand Descriptions + * (Section 17) + */ + private class SelectAnalogueServiceValidator implements ParameterValidator { + @Override + public int isValid(byte[] params) { + if (params.length < 4) { + return ERROR_PARAMETER_SHORT; + } + return toErrorCode(isValidAnalogueBroadcastType(params[0]) + && isValidAnalogueFrequency(HdmiUtils.twoBytesToInt(params, 1)) + && isValidBroadcastSystem(params[3])); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java index 5b31f8c186602..e69fa15741548 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java @@ -409,6 +409,22 @@ public class HdmiCecMessageValidatorTest { assertMessageValidity("40:41:26").isEqualTo(ERROR_PARAMETER); } + @Test + public void isValid_selectAnalogueService() { + assertMessageValidity("40:92:00:13:0F:00:96").isEqualTo(OK); + assertMessageValidity("40:92:02:EA:60:1F").isEqualTo(OK); + + assertMessageValidity("4F:92:00:13:0F:00").isEqualTo(ERROR_DESTINATION); + assertMessageValidity("F0:92:02:EA:60:1F").isEqualTo(ERROR_SOURCE); + assertMessageValidity("40:92:00:13:0F").isEqualTo(ERROR_PARAMETER_SHORT); + // Invalid Analogue Broadcast type + assertMessageValidity("40:92:03:EA:60:1F").isEqualTo(ERROR_PARAMETER); + // Invalid Analogue Frequency + assertMessageValidity("40:92:00:FF:FF:00").isEqualTo(ERROR_PARAMETER); + // Invalid Broadcast system + assertMessageValidity("40:92:02:EA:60:20").isEqualTo(ERROR_PARAMETER); + } + private IntegerSubject assertMessageValidity(String message) { return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message))); }