| Index: net/cert/internal/path_builder_unittest.cc
|
| diff --git a/net/cert/internal/path_builder_unittest.cc b/net/cert/internal/path_builder_unittest.cc
|
| index 5f0a2eb62348d5c64db87734cee6f22b67784b9c..7c2c061c11f970421575f8117ca2b1d732167c84 100644
|
| --- a/net/cert/internal/path_builder_unittest.cc
|
| +++ b/net/cert/internal/path_builder_unittest.cc
|
| @@ -5,18 +5,13 @@
|
| #include "net/cert/internal/path_builder.h"
|
|
|
| #include "base/base_paths.h"
|
| -#include "base/cancelable_callback.h"
|
| #include "base/files/file_util.h"
|
| -#include "base/location.h"
|
| #include "base/path_service.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "net/base/test_completion_callback.h"
|
| #include "net/cert/internal/cert_issuer_source_static.h"
|
| #include "net/cert/internal/parsed_certificate.h"
|
| #include "net/cert/internal/signature_policy.h"
|
| #include "net/cert/internal/test_helpers.h"
|
| #include "net/cert/internal/trust_store_in_memory.h"
|
| -#include "net/cert/internal/trust_store_test_helpers.h"
|
| #include "net/cert/internal/verify_certificate_chain.h"
|
| #include "net/cert/pem_tokenizer.h"
|
| #include "net/der/input.h"
|
| @@ -44,32 +39,17 @@ class AsyncCertIssuerSourceStatic : public CertIssuerSource {
|
| public:
|
| class StaticAsyncRequest : public Request {
|
| public:
|
| - StaticAsyncRequest(const IssuerCallback& issuers_callback,
|
| - ParsedCertificateList&& issuers)
|
| - : cancelable_closure_(base::Bind(&StaticAsyncRequest::RunCallback,
|
| - base::Unretained(this))),
|
| - issuers_callback_(issuers_callback) {
|
| + StaticAsyncRequest(ParsedCertificateList&& issuers) {
|
| issuers_.swap(issuers);
|
| issuers_iter_ = issuers_.begin();
|
| }
|
| ~StaticAsyncRequest() override {}
|
|
|
| - CompletionStatus GetNext(
|
| - scoped_refptr<ParsedCertificate>* out_cert) override {
|
| - if (issuers_iter_ == issuers_.end())
|
| - *out_cert = nullptr;
|
| - else
|
| - *out_cert = std::move(*issuers_iter_++);
|
| - return CompletionStatus::SYNC;
|
| + void GetNext(ParsedCertificateList* out_certs) override {
|
| + if (issuers_iter_ != issuers_.end())
|
| + out_certs->push_back(std::move(*issuers_iter_++));
|
| }
|
|
|
| - base::Closure callback() { return cancelable_closure_.callback(); }
|
| -
|
| - private:
|
| - void RunCallback() { issuers_callback_.Run(this); }
|
| -
|
| - base::CancelableClosure cancelable_closure_;
|
| - IssuerCallback issuers_callback_;
|
| ParsedCertificateList issuers_;
|
| ParsedCertificateList::iterator issuers_iter_;
|
|
|
| @@ -85,14 +65,12 @@ class AsyncCertIssuerSourceStatic : public CertIssuerSource {
|
| void SyncGetIssuersOf(const ParsedCertificate* cert,
|
| ParsedCertificateList* issuers) override {}
|
| void AsyncGetIssuersOf(const ParsedCertificate* cert,
|
| - const IssuerCallback& issuers_callback,
|
| std::unique_ptr<Request>* out_req) override {
|
| num_async_gets_++;
|
| ParsedCertificateList issuers;
|
| static_cert_issuer_source_.SyncGetIssuersOf(cert, &issuers);
|
| std::unique_ptr<StaticAsyncRequest> req(
|
| - new StaticAsyncRequest(issuers_callback, std::move(issuers)));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, req->callback());
|
| + new StaticAsyncRequest(std::move(issuers)));
|
| *out_req = std::move(req);
|
| }
|
| int num_async_gets() const { return num_async_gets_; }
|
| @@ -131,21 +109,6 @@ class AsyncCertIssuerSourceStatic : public CertIssuerSource {
|
| return ::testing::AssertionSuccess();
|
| }
|
|
|
| -// Run the path builder, and wait for async completion if necessary. The return
|
| -// value signifies whether the path builder completed synchronously or
|
| -// asynchronously, not that RunPathBuilder itself is asynchronous.
|
| -CompletionStatus RunPathBuilder(CertPathBuilder* path_builder) {
|
| - TestClosure callback;
|
| - CompletionStatus rv = path_builder->Run(callback.closure());
|
| -
|
| - if (rv == CompletionStatus::ASYNC) {
|
| - DVLOG(1) << "waiting for async completion...";
|
| - callback.WaitForResult();
|
| - DVLOG(1) << "async completed.";
|
| - }
|
| - return rv;
|
| -}
|
| -
|
| class PathBuilderMultiRootTest : public ::testing::Test {
|
| public:
|
| PathBuilderMultiRootTest() : signature_policy_(1024) {}
|
| @@ -194,7 +157,7 @@ TEST_F(PathBuilderMultiRootTest, TargetHasNameAndSpkiOfTrustAnchor) {
|
| CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_,
|
| &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
| const auto& path = result.GetBestValidPath()->path;
|
| @@ -214,7 +177,7 @@ TEST_F(PathBuilderMultiRootTest, TargetWithSameNameAsTrustAnchorFails) {
|
| CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_,
|
| &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_FALSE(result.HasValidPath());
|
| }
|
| @@ -245,7 +208,7 @@ TEST_F(PathBuilderMultiRootTest, SelfSignedTrustAnchorSupplementalCert) {
|
| expired_time, &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_FALSE(result.HasValidPath());
|
| ASSERT_EQ(2U, result.paths.size());
|
| @@ -277,7 +240,7 @@ TEST_F(PathBuilderMultiRootTest, TargetIsSelfSignedTrustAnchor) {
|
| CertPathBuilder path_builder(e_by_e_, &trust_store, &signature_policy_, time_,
|
| &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
| const auto& path = result.GetBestValidPath()->path;
|
| @@ -296,7 +259,7 @@ TEST_F(PathBuilderMultiRootTest, TargetDirectlySignedByTrustAnchor) {
|
| CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_,
|
| &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
| const auto& path = result.GetBestValidPath()->path;
|
| @@ -325,35 +288,12 @@ TEST_F(PathBuilderMultiRootTest, TriesSyncFirst) {
|
| path_builder.AddCertIssuerSource(&async_certs);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
| EXPECT_EQ(0, async_certs.num_async_gets());
|
| }
|
|
|
| -// Test that async cert queries are not made if no callback is provided.
|
| -TEST_F(PathBuilderMultiRootTest, SychronousOnlyMode) {
|
| - TrustStoreInMemory trust_store;
|
| - AddTrustedCertificate(e_by_e_, &trust_store);
|
| -
|
| - CertIssuerSourceStatic sync_certs;
|
| - sync_certs.AddCert(f_by_e_);
|
| -
|
| - AsyncCertIssuerSourceStatic async_certs;
|
| - async_certs.AddCert(b_by_f_);
|
| -
|
| - CertPathBuilder::Result result;
|
| - CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_,
|
| - &result);
|
| - path_builder.AddCertIssuerSource(&async_certs);
|
| - path_builder.AddCertIssuerSource(&sync_certs);
|
| -
|
| - EXPECT_EQ(CompletionStatus::SYNC, path_builder.Run(base::Closure()));
|
| -
|
| - EXPECT_FALSE(result.HasValidPath());
|
| - EXPECT_EQ(0, async_certs.num_async_gets());
|
| -}
|
| -
|
| // If async queries are needed, all async sources will be queried
|
| // simultaneously.
|
| TEST_F(PathBuilderMultiRootTest, TestAsyncSimultaneous) {
|
| @@ -377,7 +317,7 @@ TEST_F(PathBuilderMultiRootTest, TestAsyncSimultaneous) {
|
| path_builder.AddCertIssuerSource(&async_certs2);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
| EXPECT_EQ(1, async_certs1.num_async_gets());
|
| @@ -402,7 +342,7 @@ TEST_F(PathBuilderMultiRootTest, TestLongChain) {
|
| &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
|
|
| @@ -436,7 +376,7 @@ TEST_F(PathBuilderMultiRootTest, TestBacktracking) {
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
| path_builder.AddCertIssuerSource(&async_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
|
|
| @@ -474,7 +414,7 @@ TEST_F(PathBuilderMultiRootTest, TestCertIssuerOrdering) {
|
| time_, &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
|
|
| @@ -558,7 +498,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestRolloverOnlyOldRootTrusted) {
|
| &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
|
|
| @@ -606,7 +546,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestRolloverBothRootsTrusted) {
|
| &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
|
|
| @@ -630,141 +570,34 @@ TEST_F(PathBuilderKeyRolloverTest, TestRolloverBothRootsTrusted) {
|
| }
|
| }
|
|
|
| -// If trust anchors are provided both synchronously and asynchronously for the
|
| -// same cert, the synchronously provided ones should be tried first, and
|
| -// pathbuilder should finish synchronously.
|
| -TEST_F(PathBuilderKeyRolloverTest, TestSyncAnchorsPreferred) {
|
| - TrustStoreInMemoryAsync trust_store;
|
| - // Both oldintermediate and newintermediate are trusted, but oldintermediate
|
| - // is returned synchronously and newintermediate asynchronously.
|
| - trust_store.AddSyncTrustAnchor(
|
| - TrustAnchor::CreateFromCertificateNoConstraints(oldintermediate_));
|
| - trust_store.AddAsyncTrustAnchor(
|
| - TrustAnchor::CreateFromCertificateNoConstraints(newintermediate_));
|
| -
|
| - CertPathBuilder::Result result;
|
| - CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_,
|
| - &result);
|
| -
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| -
|
| - EXPECT_TRUE(result.HasValidPath());
|
| -
|
| - ASSERT_EQ(1U, result.paths.size());
|
| - const auto& path = result.paths[0]->path;
|
| - EXPECT_TRUE(result.paths[0]->valid);
|
| - ASSERT_EQ(1U, path.certs.size());
|
| - EXPECT_EQ(target_, path.certs[0]);
|
| - EXPECT_EQ(oldintermediate_, path.trust_anchor->cert());
|
| -}
|
| -
|
| -// Async trust anchor checks should be done before synchronous issuer checks are
|
| -// considered. (Avoiding creating unnecessarily long paths.)
|
| -//
|
| -// Two valid paths could be built:
|
| -// newintermediate <- newrootrollover <- oldroot
|
| -// newintermediate <- newroot
|
| -// One invalid path could be built:
|
| -// newintermediate <- oldroot
|
| -//
|
| -// First: newintermediate <- oldroot will be tried, since oldroot is
|
| -// available synchronously, but this path will not verify.
|
| -// Second: newintermediate <- newroot should be built, even though
|
| -// newrootrollover issuer is available synchronously and newroot is async. This
|
| -// path should verify and pathbuilder will stop.
|
| -TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsBeforeSyncIssuers) {
|
| - TrustStoreInMemoryAsync trust_store;
|
| - trust_store.AddSyncTrustAnchor(oldroot_);
|
| - trust_store.AddAsyncTrustAnchor(
|
| - TrustAnchor::CreateFromCertificateNoConstraints(newroot_));
|
| -
|
| - CertIssuerSourceStatic sync_certs;
|
| - sync_certs.AddCert(newrootrollover_);
|
| -
|
| - CertPathBuilder::Result result;
|
| - CertPathBuilder path_builder(newintermediate_, &trust_store,
|
| - &signature_policy_, time_, &result);
|
| - path_builder.AddCertIssuerSource(&sync_certs);
|
| -
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| -
|
| - EXPECT_TRUE(result.HasValidPath());
|
| -
|
| - ASSERT_EQ(2U, result.paths.size());
|
| - {
|
| - const auto& path = result.paths[0]->path;
|
| - EXPECT_FALSE(result.paths[0]->valid);
|
| - ASSERT_EQ(1U, path.certs.size());
|
| - EXPECT_EQ(newintermediate_, path.certs[0]);
|
| - EXPECT_EQ(oldroot_, path.trust_anchor);
|
| - }
|
| - {
|
| - const auto& path = result.paths[1]->path;
|
| - EXPECT_TRUE(result.paths[1]->valid);
|
| - ASSERT_EQ(1U, path.certs.size());
|
| - EXPECT_EQ(newintermediate_, path.certs[0]);
|
| - EXPECT_EQ(newroot_, path.trust_anchor->cert());
|
| - }
|
| -}
|
| -
|
| -// If async trust anchor query returned no results, and there are no issuer
|
| +// If trust anchor query returned no results, and there are no issuer
|
| // sources, path building should fail at that point.
|
| -TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsNoMatchAndNoIssuerSources) {
|
| - TrustStoreInMemoryAsync trust_store;
|
| - trust_store.AddAsyncTrustAnchor(
|
| +TEST_F(PathBuilderKeyRolloverTest, TestAnchorsNoMatchAndNoIssuerSources) {
|
| + TrustStoreInMemory trust_store;
|
| + trust_store.AddTrustAnchor(
|
| TrustAnchor::CreateFromCertificateNoConstraints(newroot_));
|
|
|
| CertPathBuilder::Result result;
|
| CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_,
|
| &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_FALSE(result.HasValidPath());
|
|
|
| ASSERT_EQ(0U, result.paths.size());
|
| }
|
|
|
| -// Both trust store and issuer source are async. Should successfully build a
|
| -// path.
|
| -TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsAndAsyncIssuers) {
|
| - TrustStoreInMemoryAsync trust_store;
|
| - trust_store.AddAsyncTrustAnchor(
|
| - TrustAnchor::CreateFromCertificateNoConstraints(newroot_));
|
| -
|
| - AsyncCertIssuerSourceStatic async_certs;
|
| - async_certs.AddCert(newintermediate_);
|
| -
|
| - CertPathBuilder::Result result;
|
| - CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_,
|
| - &result);
|
| - path_builder.AddCertIssuerSource(&async_certs);
|
| -
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| -
|
| - EXPECT_TRUE(result.HasValidPath());
|
| -
|
| - ASSERT_EQ(1U, result.paths.size());
|
| - const auto& path = result.paths[0]->path;
|
| - EXPECT_TRUE(result.paths[0]->valid);
|
| - ASSERT_EQ(2U, path.certs.size());
|
| - EXPECT_EQ(target_, path.certs[0]);
|
| - EXPECT_EQ(newintermediate_, path.certs[1]);
|
| - EXPECT_EQ(newroot_, path.trust_anchor->cert());
|
| -}
|
| -
|
| // Tests that multiple trust root matches on a single path will be considered.
|
| // Both roots have the same subject but different keys. Only one of them will
|
| // verify.
|
| TEST_F(PathBuilderKeyRolloverTest, TestMultipleRootMatchesOnlyOneWorks) {
|
| - TrustStoreInMemoryAsync trust_store;
|
| - // Since FindTrustAnchorsByNormalizedName returns newroot synchronously, it
|
| - // should be tried first.
|
| - trust_store.AddSyncTrustAnchor(
|
| + TrustStoreInMemory trust_store;
|
| + // Add two trust anchors (newroot_ and oldroot_). Path building will attempt
|
| + // them in this same order.
|
| + trust_store.AddTrustAnchor(
|
| TrustAnchor::CreateFromCertificateNoConstraints(newroot_));
|
| - // oldroot is returned asynchronously, so it should only be tried after the
|
| - // path built with newroot fails.
|
| - trust_store.AddAsyncTrustAnchor(oldroot_);
|
| + trust_store.AddTrustAnchor(oldroot_);
|
|
|
| // Only oldintermediate is supplied, so the path with newroot should fail,
|
| // oldroot should succeed.
|
| @@ -776,7 +609,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestMultipleRootMatchesOnlyOneWorks) {
|
| &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
| ASSERT_EQ(2U, result.paths.size());
|
| @@ -827,7 +660,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestRolloverLongChain) {
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
| path_builder.AddCertIssuerSource(&async_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
| ASSERT_EQ(3U, result.paths.size());
|
| @@ -882,7 +715,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestEndEntityIsTrustRoot) {
|
| CertPathBuilder path_builder(newintermediate_, &trust_store,
|
| &signature_policy_, time_, &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_FALSE(result.HasValidPath());
|
| }
|
| @@ -907,7 +740,7 @@ TEST_F(PathBuilderKeyRolloverTest,
|
| time_, &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| // This could actually be OK, but CertPathBuilder does not build the
|
| // newroot <- newrootrollover <- oldroot path.
|
| @@ -927,7 +760,7 @@ TEST_F(PathBuilderKeyRolloverTest,
|
| CertPathBuilder path_builder(newroot_, &trust_store, &signature_policy_,
|
| time_, &result);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| ASSERT_TRUE(result.HasValidPath());
|
|
|
| @@ -975,7 +808,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediates) {
|
| path_builder.AddCertIssuerSource(&sync_certs2);
|
| path_builder.AddCertIssuerSource(&async_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_TRUE(result.HasValidPath());
|
| ASSERT_EQ(2U, result.paths.size());
|
| @@ -1024,7 +857,7 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediateAndRoot) {
|
| &result);
|
| path_builder.AddCertIssuerSource(&sync_certs);
|
|
|
| - EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
|
| + path_builder.Run();
|
|
|
| EXPECT_FALSE(result.HasValidPath());
|
| ASSERT_EQ(2U, result.paths.size());
|
| @@ -1042,9 +875,11 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediateAndRoot) {
|
| EXPECT_EQ(newroot_->der_cert(), path.trust_anchor->cert()->der_cert());
|
| }
|
|
|
| +// TODO(eroman): Re-enable these tests
|
| +#if 0
|
| class MockCertIssuerSourceRequest : public CertIssuerSource::Request {
|
| public:
|
| - MOCK_METHOD1(GetNext, CompletionStatus(scoped_refptr<ParsedCertificate>*));
|
| + MOCK_METHOD1(GetNext, void(ParsedCertificateList*));
|
| };
|
|
|
| class MockCertIssuerSource : public CertIssuerSource {
|
| @@ -1053,7 +888,6 @@ class MockCertIssuerSource : public CertIssuerSource {
|
| void(const ParsedCertificate*, ParsedCertificateList*));
|
| MOCK_METHOD3(AsyncGetIssuersOf,
|
| void(const ParsedCertificate*,
|
| - const IssuerCallback&,
|
| std::unique_ptr<Request>*));
|
| };
|
|
|
| @@ -1292,6 +1126,8 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateAsyncIntermediates) {
|
| EXPECT_EQ(newroot_, path1.trust_anchor->cert());
|
| }
|
|
|
| +#endif
|
| +
|
| } // namespace
|
|
|
| } // namespace net
|
|
|