Index: net/http/transport_security_state_unittest.cc |
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc |
index 9597efe3b2d507c96d35cf305acdd4f43497875e..0272cacc8c3c926604c716a2b42808a7f2d00612 100644 |
--- a/net/http/transport_security_state_unittest.cc |
+++ b/net/http/transport_security_state_unittest.cc |
@@ -2650,4 +2650,116 @@ TEST_F(TransportSecurityStateTest, DynamicExpectCTStateDisabled) { |
EXPECT_FALSE(state.GetDynamicExpectCTState(host, &expect_ct_state)); |
} |
+// Tests that dynamic Expect-CT opt-ins are processed correctly (when the |
+// feature is enabled). |
+TEST_F(TransportSecurityStateTest, DynamicExpectCT) { |
+ const char kHeader[] = "max-age=123,enforce,report-uri=\"http://foo.test\""; |
+ SSLInfo ssl; |
+ ssl.is_issued_by_known_root = true; |
+ ssl.ct_compliance_details_available = true; |
+ ssl.ct_cert_policy_compliance = |
+ ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS; |
+ |
+ // First test that the header is not processed when the feature is disabled. |
+ { |
+ base::test::ScopedFeatureList feature_list; |
+ feature_list.InitAndDisableFeature( |
+ TransportSecurityState::kDynamicExpectCTFeature); |
+ TransportSecurityState state; |
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), |
+ ssl); |
+ TransportSecurityState::ExpectCTState expect_ct_state; |
+ EXPECT_FALSE( |
+ state.GetDynamicExpectCTState("example.test", &expect_ct_state)); |
+ } |
+ |
+ // Now test that the header is processed when the feature is enabled. |
+ { |
+ base::test::ScopedFeatureList feature_list; |
+ feature_list.InitAndEnableFeature( |
+ TransportSecurityState::kDynamicExpectCTFeature); |
+ base::Time now = base::Time::Now(); |
+ TransportSecurityState state; |
+ MockExpectCTReporter reporter; |
+ state.SetExpectCTReporter(&reporter); |
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), |
+ ssl); |
+ TransportSecurityState::ExpectCTState expect_ct_state; |
+ EXPECT_TRUE( |
+ state.GetDynamicExpectCTState("example.test", &expect_ct_state)); |
+ EXPECT_EQ(GURL("http://foo.test"), expect_ct_state.report_uri); |
+ EXPECT_TRUE(expect_ct_state.enforce); |
+ EXPECT_LT(now, expect_ct_state.expiry); |
+ // No report should be sent when the header was processed over a connection |
+ // that complied with CT policy. |
+ EXPECT_EQ(0u, reporter.num_failures()); |
+ } |
+} |
+ |
+// Tests that dynamic Expect-CT is not processed for private roots. |
+TEST_F(TransportSecurityStateTest, DynamicExpectCTPrivateRoot) { |
+ const char kHeader[] = "max-age=123,enforce,report-uri=\"http://foo.test\""; |
+ SSLInfo ssl; |
+ ssl.is_issued_by_known_root = false; |
+ ssl.ct_compliance_details_available = true; |
+ ssl.ct_cert_policy_compliance = |
+ ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS; |
+ |
+ base::test::ScopedFeatureList feature_list; |
+ feature_list.InitAndEnableFeature( |
+ TransportSecurityState::kDynamicExpectCTFeature); |
+ TransportSecurityState state; |
+ MockExpectCTReporter reporter; |
+ state.SetExpectCTReporter(&reporter); |
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), ssl); |
+ TransportSecurityState::ExpectCTState expect_ct_state; |
+ EXPECT_FALSE(state.GetDynamicExpectCTState("example.test", &expect_ct_state)); |
+ EXPECT_EQ(0u, reporter.num_failures()); |
+} |
+ |
+// Tests that dynamic Expect-CT is not processed when CT compliance status |
+// wasn't computed. |
+TEST_F(TransportSecurityStateTest, DynamicExpectCTNoComplianceDetails) { |
+ const char kHeader[] = "max-age=123,enforce,report-uri=\"http://foo.test\""; |
+ SSLInfo ssl; |
+ ssl.is_issued_by_known_root = true; |
+ ssl.ct_compliance_details_available = false; |
+ ssl.ct_cert_policy_compliance = |
+ ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS; |
+ |
+ base::test::ScopedFeatureList feature_list; |
+ feature_list.InitAndEnableFeature( |
+ TransportSecurityState::kDynamicExpectCTFeature); |
+ TransportSecurityState state; |
+ MockExpectCTReporter reporter; |
+ state.SetExpectCTReporter(&reporter); |
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), ssl); |
+ TransportSecurityState::ExpectCTState expect_ct_state; |
+ EXPECT_FALSE(state.GetDynamicExpectCTState("example.test", &expect_ct_state)); |
+ EXPECT_EQ(0u, reporter.num_failures()); |
+} |
+ |
+// Tests that Expect-CT reports are sent when an Expect-CT header is received |
+// over a non-compliant connection. |
+TEST_F(TransportSecurityStateTest, DynamicExpectCTNonCompliant) { |
+ const char kHeader[] = "max-age=123,enforce,report-uri=\"http://foo.test\""; |
+ SSLInfo ssl; |
+ ssl.is_issued_by_known_root = true; |
+ ssl.ct_compliance_details_available = true; |
+ ssl.ct_cert_policy_compliance = |
+ ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS; |
+ |
+ base::test::ScopedFeatureList feature_list; |
+ feature_list.InitAndEnableFeature( |
+ TransportSecurityState::kDynamicExpectCTFeature); |
+ TransportSecurityState state; |
+ MockExpectCTReporter reporter; |
+ state.SetExpectCTReporter(&reporter); |
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), ssl); |
+ TransportSecurityState::ExpectCTState expect_ct_state; |
+ EXPECT_FALSE(state.GetDynamicExpectCTState("example.test", &expect_ct_state)); |
+ EXPECT_EQ(1u, reporter.num_failures()); |
+ EXPECT_EQ("example.test", reporter.host_port_pair().host()); |
+} |
+ |
} // namespace net |