| 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 7731ee56128d668c804eaa006c852669e9fdeb59..36ed497df1498fc87ebbb37b292fc29d0afcec6b 100644
 | 
| --- a/net/http/transport_security_state_unittest.cc
 | 
| +++ b/net/http/transport_security_state_unittest.cc
 | 
| @@ -25,6 +25,7 @@
 | 
|  #include "net/cert/cert_verifier.h"
 | 
|  #include "net/cert/cert_verify_result.h"
 | 
|  #include "net/cert/ct_policy_status.h"
 | 
| +#include "net/cert/internal/test_helpers.h"
 | 
|  #include "net/cert/test_root_certs.h"
 | 
|  #include "net/cert/x509_cert_types.h"
 | 
|  #include "net/cert/x509_certificate.h"
 | 
| @@ -78,7 +79,9 @@ const char* const kBadPath[] = {
 | 
|      nullptr,
 | 
|  };
 | 
|  
 | 
| -// A mock ReportSenderInterface that just remembers the latest report
 | 
| +const char kOCSPPathPrefix[] = "net/data/parse_ocsp_unittest/";
 | 
| +
 | 
| +// A mock ReportSender that just remembers the latest report
 | 
|  // URI and report to be sent.
 | 
|  class MockCertificateReportSender
 | 
|      : public TransportSecurityState::ReportSenderInterface {
 | 
| @@ -1883,4 +1886,123 @@ TEST_F(TransportSecurityStateTest, ExpectCTReporter) {
 | 
|    EXPECT_EQ(GURL(kExpectCTStaticReportURI), reporter.report_uri());
 | 
|  }
 | 
|  
 | 
| +class MockExpectStapleReportSender : public MockCertificateReportSender {
 | 
| + public:
 | 
| +  bool ReportSent() { return !latest_report().empty(); }
 | 
| +};
 | 
| +
 | 
| +class ExpectStapleTest : public TransportSecurityStateTest {
 | 
| + public:
 | 
| +  ExpectStapleTest() : verify_time_(base::Time::Now()) {
 | 
| +    TransportSecurityStateTest::SetUp();
 | 
| +    security_state_.SetReportSender(&report_sender_);
 | 
| +    EnableStaticExpectStaple(&security_state_);
 | 
| +  }
 | 
| +
 | 
| +  struct OCSPTest {
 | 
| +    std::string response;
 | 
| +    scoped_refptr<X509Certificate> certificate;
 | 
| +  };
 | 
| +
 | 
| +  static bool LoadOCSPFromFile(std::string file_name, OCSPTest* ocsp) {
 | 
| +    std::string ca_data;
 | 
| +    std::string cert_data;
 | 
| +    const PemBlockMapping mappings[] = {
 | 
| +        {"OCSP RESPONSE", &ocsp->response},
 | 
| +        {"CA CERTIFICATE", &ca_data},
 | 
| +        {"CERTIFICATE", &cert_data},
 | 
| +    };
 | 
| +    std::string full_path = std::string(kOCSPPathPrefix) + file_name;
 | 
| +    if (!ReadTestDataFromPemFile(full_path, mappings))
 | 
| +      return false;
 | 
| +
 | 
| +    // Parse the server certificate
 | 
| +    CertificateList server_cert_list =
 | 
| +        X509Certificate::CreateCertificateListFromBytes(
 | 
| +            cert_data.data(), cert_data.size(),
 | 
| +            X509Certificate::FORMAT_SINGLE_CERTIFICATE);
 | 
| +    ocsp->certificate = server_cert_list[0];
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  static void CheckExpectStapleReport(
 | 
| +      const std::string& serialized_report,
 | 
| +      const HostPortPair& host_port,
 | 
| +      const X509Certificate& served_certificate_chain,
 | 
| +      bool is_issued_by_known_root,
 | 
| +      const OCSPVerifyResult& ocsp_verify_result) {
 | 
| +    std::unique_ptr<base::Value> value(
 | 
| +        base::JSONReader::Read(serialized_report));
 | 
| +    ASSERT_TRUE(value);
 | 
| +    ASSERT_TRUE(value->IsType(base::Value::TYPE_DICTIONARY));
 | 
| +
 | 
| +    base::DictionaryValue* report_dict;
 | 
| +    ASSERT_TRUE(value->GetAsDictionary(&report_dict));
 | 
| +    std::string report_hostname;
 | 
| +    EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname));
 | 
| +    EXPECT_EQ(host_port.host(), report_hostname);
 | 
| +    int report_port;
 | 
| +    EXPECT_TRUE(report_dict->GetInteger("port", &report_port));
 | 
| +    EXPECT_EQ(host_port.port(), report_port);
 | 
| +
 | 
| +    // Check certificate chain.
 | 
| +    const base::ListValue* report_served_certificate_chain = nullptr;
 | 
| +    if (is_issued_by_known_root) {
 | 
| +      ASSERT_TRUE(report_dict->GetList("served-certificate-chain",
 | 
| +                                       &report_served_certificate_chain));
 | 
| +      std::vector<std::string> pem_encoded_chain;
 | 
| +      served_certificate_chain.GetPEMEncodedChain(&pem_encoded_chain);
 | 
| +      ASSERT_EQ(pem_encoded_chain.size(),
 | 
| +                report_served_certificate_chain->GetSize());
 | 
| +      for (size_t i = 0; i < pem_encoded_chain.size(); i++) {
 | 
| +        std::string cert_pem;
 | 
| +        ASSERT_TRUE(report_served_certificate_chain->GetString(i, &cert_pem));
 | 
| +        EXPECT_EQ(pem_encoded_chain[i], cert_pem);
 | 
| +      }
 | 
| +    } else {
 | 
| +      EXPECT_FALSE(report_dict->GetList("served-certificate-chain",
 | 
| +                                        &report_served_certificate_chain));
 | 
| +    }
 | 
| +
 | 
| +    // Check stapled responses.
 | 
| +    const base::ListValue* report_ocsp_responses = nullptr;
 | 
| +    ASSERT_TRUE(report_dict->GetList("ocsp-responses", &report_ocsp_responses));
 | 
| +    const auto& ocsp_responses = ocsp_verify_result.stapled_responses;
 | 
| +    ASSERT_EQ(ocsp_responses.size(), report_ocsp_responses->GetSize());
 | 
| +    for (size_t i = 0; i < ocsp_responses.size(); i++) {
 | 
| +      const base::DictionaryValue* report_ocsp_response = nullptr;
 | 
| +      report_ocsp_responses->GetDictionary(i, &report_ocsp_response);
 | 
| +      bool is_date_valid;
 | 
| +      ASSERT_TRUE(
 | 
| +          report_ocsp_response->GetBoolean("is-date-valid", &is_date_valid));
 | 
| +      EXPECT_EQ(ocsp_responses[i].is_date_valid, is_date_valid);
 | 
| +      bool is_correct_certificate;
 | 
| +      ASSERT_TRUE(report_ocsp_response->GetBoolean("is-correct-certificate",
 | 
| +                                                   &is_correct_certificate));
 | 
| +      EXPECT_EQ(ocsp_responses[i].is_correct_certificate,
 | 
| +                is_correct_certificate);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  static bool SerializeExpectStapleReport(
 | 
| +      const HostPortPair& host_port_pair,
 | 
| +      const X509Certificate& unverified_certificate,
 | 
| +      bool is_issued_by_known_root,
 | 
| +      const OCSPVerifyResult& ocsp_verify_result,
 | 
| +      std::string* serialized_report) {
 | 
| +    return TransportSecurityState::SerializeExpectStapleReport(
 | 
| +        host_port_pair, unverified_certificate, is_issued_by_known_root,
 | 
| +        ocsp_verify_result, serialized_report);
 | 
| +  }
 | 
| +
 | 
| +  TransportSecurityState security_state_;
 | 
| +  MockExpectStapleReportSender report_sender_;
 | 
| +  base::Time verify_time_;
 | 
| +};
 | 
| +
 | 
| +TEST_F(ExpectStapleTest, TestSerialization){
 | 
| +    // TODO(dadrian)
 | 
| +};
 | 
| +
 | 
|  }  // namespace net
 | 
| 
 |