Index: chromeos/display/output_configurator_unittest.cc |
diff --git a/chromeos/display/output_configurator_unittest.cc b/chromeos/display/output_configurator_unittest.cc |
index 18b2bdc290ff02a305969ec800baf1256d4b9f0c..4e2334573a0eb71cc152270c68da8355ef5f8fe2 100644 |
--- a/chromeos/display/output_configurator_unittest.cc |
+++ b/chromeos/display/output_configurator_unittest.cc |
@@ -72,6 +72,11 @@ std::string GetCTMAction( |
ctm.x_scale, ctm.x_offset, ctm.y_scale, ctm.y_offset); |
} |
+// Returns a string describing a TestDelegate::SetHDCPState() call. |
+std::string GetSetHDCPStateAction(RROutput id, HDCPState state) { |
+ return base::StringPrintf("set_hdcp(id=%lu,state=%d)", id, state); |
+} |
+ |
// Joins a sequence of strings describing actions (e.g. kScreenDim) such |
// that they can be compared against a string returned by |
// TestDelegate::GetActionsAndClear(). The list of actions must be |
@@ -95,7 +100,9 @@ class TestDelegate : public OutputConfigurator::Delegate { |
public: |
static const int kXRandREventBase = 10; |
- TestDelegate() : configure_crtc_result_(true) {} |
+ TestDelegate() |
+ : configure_crtc_result_(true), |
+ hdcp_state_(HDCP_STATE_UNDESIRED) {} |
virtual ~TestDelegate() {} |
const std::vector<OutputConfigurator::OutputSnapshot>& outputs() const { |
@@ -110,6 +117,8 @@ class TestDelegate : public OutputConfigurator::Delegate { |
configure_crtc_result_ = result; |
} |
+ void set_hdcp_state(HDCPState state) { hdcp_state_ = state; } |
+ |
// Returns a comma-separated string describing the actions that were |
// requested since the previous call to GetActionsAndClear() (i.e. |
// results are non-repeatable). |
@@ -168,10 +177,12 @@ class TestDelegate : public OutputConfigurator::Delegate { |
} |
virtual bool GetHDCPState(RROutput id, HDCPState* state) OVERRIDE { |
+ *state = hdcp_state_; |
return true; |
} |
virtual bool SetHDCPState(RROutput id, HDCPState state) OVERRIDE { |
+ AppendAction(GetSetHDCPStateAction(id, state)); |
return true; |
} |
@@ -204,6 +215,9 @@ class TestDelegate : public OutputConfigurator::Delegate { |
// Return value returned by ConfigureCrtc(). |
bool configure_crtc_result_; |
+ // Result value of GetHDCPState(). |
+ HDCPState hdcp_state_; |
+ |
DISALLOW_COPY_AND_ASSIGN(TestDelegate); |
}; |
@@ -340,6 +354,7 @@ class OutputConfiguratorTest : public testing::Test { |
o->current_mode = kSmallModeId; |
o->native_mode = kSmallModeId; |
o->is_internal = true; |
+ o->type = OUTPUT_TYPE_INTERNAL; |
o->is_aspect_preserving_scaling = true; |
o->mode_infos[kSmallModeId] = small_mode_info; |
o->has_display_id = true; |
@@ -351,6 +366,7 @@ class OutputConfiguratorTest : public testing::Test { |
o->current_mode = kBigModeId; |
o->native_mode = kBigModeId; |
o->is_internal = false; |
+ o->type = OUTPUT_TYPE_HDMI; |
o->is_aspect_preserving_scaling = true; |
o->mode_infos[kSmallModeId] = small_mode_info; |
o->mode_infos[kBigModeId] = big_mode_info; |
@@ -1090,4 +1106,102 @@ TEST_F(OutputConfiguratorTest, PanelFitting) { |
EXPECT_EQ(kSmallModeHeight, info->height); |
} |
+TEST_F(OutputConfiguratorTest, OutputProtection) { |
+ configurator_.Init(false); |
+ configurator_.Start(0); |
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear()); |
+ |
+ OutputConfigurator::OutputProtectionClientId id = |
+ configurator_.RegisterOutputProtectionClient(); |
+ EXPECT_NE(0u, id); |
+ |
+ // One output. |
+ UpdateOutputs(1, true); |
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear()); |
+ uint32_t link_mask = 0; |
+ uint32_t protection_mask = 0; |
+ EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(id, &link_mask, |
+ &protection_mask)); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_TYPE_INTERNAL), link_mask); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_PROTECTION_METHOD_NONE), |
+ protection_mask); |
+ EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); |
+ |
+ // Two outputs. |
+ UpdateOutputs(2, true); |
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear()); |
+ EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(id, &link_mask, |
+ &protection_mask)); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_TYPE_INTERNAL | OUTPUT_TYPE_HDMI), |
+ link_mask); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_PROTECTION_METHOD_NONE), |
+ protection_mask); |
+ EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); |
+ |
+ EXPECT_TRUE( |
+ configurator_.EnableOutputProtection(id, OUTPUT_PROTECTION_METHOD_HDCP)); |
+ EXPECT_EQ(GetSetHDCPStateAction(outputs_[1].output, HDCP_STATE_DESIRED), |
+ delegate_->GetActionsAndClear()); |
+ |
+ // Enable protection. |
+ delegate_->set_hdcp_state(HDCP_STATE_ENABLED); |
+ EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(id, &link_mask, |
+ &protection_mask)); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_TYPE_INTERNAL | OUTPUT_TYPE_HDMI), |
+ link_mask); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_PROTECTION_METHOD_HDCP), |
+ protection_mask); |
+ EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); |
+} |
+ |
+TEST_F(OutputConfiguratorTest, OutputProtectionTwoClients) { |
+ OutputConfigurator::OutputProtectionClientId client1 = |
+ configurator_.RegisterOutputProtectionClient(); |
+ OutputConfigurator::OutputProtectionClientId client2 = |
+ configurator_.RegisterOutputProtectionClient(); |
+ EXPECT_NE(client1, client2); |
+ |
+ configurator_.Init(false); |
+ configurator_.Start(0); |
+ UpdateOutputs(2, true); |
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear()); |
+ |
+ // Clients never know state enableness for methods that they didn't request. |
+ EXPECT_TRUE( |
+ configurator_.EnableOutputProtection(client1, |
+ OUTPUT_PROTECTION_METHOD_HDCP)); |
+ EXPECT_EQ(GetSetHDCPStateAction(outputs_[1].output, |
+ HDCP_STATE_DESIRED).c_str(), |
+ delegate_->GetActionsAndClear()); |
+ delegate_->set_hdcp_state(HDCP_STATE_ENABLED); |
+ |
+ uint32_t link_mask = 0; |
+ uint32_t protection_mask = 0; |
+ EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(client1, &link_mask, |
+ &protection_mask)); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_TYPE_INTERNAL | OUTPUT_TYPE_HDMI), |
+ link_mask); |
+ EXPECT_EQ(OUTPUT_PROTECTION_METHOD_HDCP, protection_mask); |
+ |
+ EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(client2, &link_mask, |
+ &protection_mask)); |
+ EXPECT_EQ(static_cast<uint32_t>(OUTPUT_TYPE_INTERNAL | OUTPUT_TYPE_HDMI), |
+ link_mask); |
+ EXPECT_EQ(OUTPUT_PROTECTION_METHOD_NONE, protection_mask); |
+ |
+ // Protections will be disabled only if no more clients request them. |
+ EXPECT_TRUE( |
+ configurator_.EnableOutputProtection(client2, |
+ OUTPUT_PROTECTION_METHOD_NONE)); |
+ EXPECT_EQ(GetSetHDCPStateAction(outputs_[1].output, |
+ HDCP_STATE_DESIRED).c_str(), |
+ delegate_->GetActionsAndClear()); |
+ EXPECT_TRUE( |
+ configurator_.EnableOutputProtection(client1, |
+ OUTPUT_PROTECTION_METHOD_NONE)); |
+ EXPECT_EQ(GetSetHDCPStateAction(outputs_[1].output, |
+ HDCP_STATE_UNDESIRED).c_str(), |
+ delegate_->GetActionsAndClear()); |
+} |
+ |
} // namespace chromeos |