| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/cert/internal/path_builder.h" | 5 #include "net/cert/internal/path_builder.h" |
| 6 | 6 |
| 7 #include "base/base_paths.h" | 7 #include "base/base_paths.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "net/cert/internal/cert_issuer_source_static.h" | 10 #include "net/cert/internal/cert_issuer_source_static.h" |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 EXPECT_FALSE(result.paths[0]->valid); | 874 EXPECT_FALSE(result.paths[0]->valid); |
| 875 const auto& path = result.paths[0]->path; | 875 const auto& path = result.paths[0]->path; |
| 876 ASSERT_EQ(2U, path.certs.size()); | 876 ASSERT_EQ(2U, path.certs.size()); |
| 877 EXPECT_EQ(target_, path.certs[0]); | 877 EXPECT_EQ(target_, path.certs[0]); |
| 878 EXPECT_EQ(oldintermediate_, path.certs[1]); | 878 EXPECT_EQ(oldintermediate_, path.certs[1]); |
| 879 // Compare the DER instead of ParsedCertificate pointer, don't care which copy | 879 // Compare the DER instead of ParsedCertificate pointer, don't care which copy |
| 880 // of newroot was used in the path. | 880 // of newroot was used in the path. |
| 881 EXPECT_EQ(newroot_->der_cert(), path.trust_anchor->cert()->der_cert()); | 881 EXPECT_EQ(newroot_->der_cert(), path.trust_anchor->cert()->der_cert()); |
| 882 } | 882 } |
| 883 | 883 |
| 884 // TODO(eroman): Re-enable these tests | |
| 885 #if 0 | |
| 886 class MockCertIssuerSourceRequest : public CertIssuerSource::Request { | 884 class MockCertIssuerSourceRequest : public CertIssuerSource::Request { |
| 887 public: | 885 public: |
| 888 MOCK_METHOD1(GetNext, void(ParsedCertificateList*)); | 886 MOCK_METHOD1(GetNext, void(ParsedCertificateList*)); |
| 889 }; | 887 }; |
| 890 | 888 |
| 891 class MockCertIssuerSource : public CertIssuerSource { | 889 class MockCertIssuerSource : public CertIssuerSource { |
| 892 public: | 890 public: |
| 893 MOCK_METHOD2(SyncGetIssuersOf, | 891 MOCK_METHOD2(SyncGetIssuersOf, |
| 894 void(const ParsedCertificate*, ParsedCertificateList*)); | 892 void(const ParsedCertificate*, ParsedCertificateList*)); |
| 895 MOCK_METHOD3(AsyncGetIssuersOf, | 893 MOCK_METHOD2(AsyncGetIssuersOf, |
| 896 void(const ParsedCertificate*, | 894 void(const ParsedCertificate*, std::unique_ptr<Request>*)); |
| 897 std::unique_ptr<Request>*)); | |
| 898 }; | 895 }; |
| 899 | 896 |
| 900 // Helper class to pass the Request to the PathBuilder when it calls | 897 // Helper class to pass the Request to the PathBuilder when it calls |
| 901 // AsyncGetIssuersOf. (GoogleMock has a ByMove helper, but it apparently can | 898 // AsyncGetIssuersOf. (GoogleMock has a ByMove helper, but it apparently can |
| 902 // only be used with Return, not SetArgPointee.) | 899 // only be used with Return, not SetArgPointee.) |
| 903 class CertIssuerSourceRequestMover { | 900 class CertIssuerSourceRequestMover { |
| 904 public: | 901 public: |
| 905 CertIssuerSourceRequestMover(std::unique_ptr<CertIssuerSource::Request> req) | 902 CertIssuerSourceRequestMover(std::unique_ptr<CertIssuerSource::Request> req) |
| 906 : request_(std::move(req)) {} | 903 : request_(std::move(req)) {} |
| 907 void MoveIt(const ParsedCertificate* cert, | 904 void MoveIt(const ParsedCertificate* cert, |
| 908 const CertIssuerSource::IssuerCallback& issuers_callback, | |
| 909 std::unique_ptr<CertIssuerSource::Request>* out_req) { | 905 std::unique_ptr<CertIssuerSource::Request>* out_req) { |
| 910 *out_req = std::move(request_); | 906 *out_req = std::move(request_); |
| 911 } | 907 } |
| 912 | 908 |
| 913 private: | 909 private: |
| 914 std::unique_ptr<CertIssuerSource::Request> request_; | 910 std::unique_ptr<CertIssuerSource::Request> request_; |
| 915 }; | 911 }; |
| 916 | 912 |
| 913 // Functor that when called with a ParsedCertificateList* will append the |
| 914 // specified certificate. |
| 915 class AppendCertToList { |
| 916 public: |
| 917 explicit AppendCertToList(const scoped_refptr<ParsedCertificate>& cert) |
| 918 : cert_(cert) {} |
| 919 |
| 920 void operator()(ParsedCertificateList* out) { out->push_back(cert_); } |
| 921 |
| 922 private: |
| 923 scoped_refptr<ParsedCertificate> cert_; |
| 924 }; |
| 925 |
| 917 // Test that a single CertIssuerSource returning multiple async batches of | 926 // Test that a single CertIssuerSource returning multiple async batches of |
| 918 // issuers is handled correctly. Due to the StrictMocks, it also tests that path | 927 // issuers is handled correctly. Due to the StrictMocks, it also tests that path |
| 919 // builder does not request issuers of certs that it shouldn't. | 928 // builder does not request issuers of certs that it shouldn't. |
| 920 TEST_F(PathBuilderKeyRolloverTest, TestMultipleAsyncCallbacksFromSingleSource) { | 929 TEST_F(PathBuilderKeyRolloverTest, TestMultipleAsyncIssuersFromSingleSource) { |
| 921 StrictMock<MockCertIssuerSource> cert_issuer_source; | 930 StrictMock<MockCertIssuerSource> cert_issuer_source; |
| 922 | 931 |
| 923 // Only newroot is a trusted root. | 932 // Only newroot is a trusted root. |
| 924 TrustStoreInMemory trust_store; | 933 TrustStoreInMemory trust_store; |
| 925 AddTrustedCertificate(newroot_, &trust_store); | 934 AddTrustedCertificate(newroot_, &trust_store); |
| 926 | 935 |
| 927 CertPathBuilder::Result result; | 936 CertPathBuilder::Result result; |
| 928 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 937 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 929 &result); | 938 &result); |
| 930 path_builder.AddCertIssuerSource(&cert_issuer_source); | 939 path_builder.AddCertIssuerSource(&cert_issuer_source); |
| 931 | 940 |
| 932 CertIssuerSource::IssuerCallback target_issuers_callback; | |
| 933 // Create the mock CertIssuerSource::Request... | 941 // Create the mock CertIssuerSource::Request... |
| 934 std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>> | 942 std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>> |
| 935 target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>()); | 943 target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>()); |
| 936 // Keep a raw pointer to the Request... | 944 // Keep a raw pointer to the Request... |
| 937 StrictMock<MockCertIssuerSourceRequest>* target_issuers_req = | 945 StrictMock<MockCertIssuerSourceRequest>* target_issuers_req = |
| 938 target_issuers_req_owner.get(); | 946 target_issuers_req_owner.get(); |
| 939 // Setup helper class to pass ownership of the Request to the PathBuilder when | 947 // Setup helper class to pass ownership of the Request to the PathBuilder when |
| 940 // it calls AsyncGetIssuersOf. | 948 // it calls AsyncGetIssuersOf. |
| 941 CertIssuerSourceRequestMover req_mover(std::move(target_issuers_req_owner)); | 949 CertIssuerSourceRequestMover req_mover(std::move(target_issuers_req_owner)); |
| 942 { | 950 { |
| 943 ::testing::InSequence s; | 951 ::testing::InSequence s; |
| 944 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(target_.get(), _)); | 952 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(target_.get(), _)); |
| 945 EXPECT_CALL(cert_issuer_source, AsyncGetIssuersOf(target_.get(), _, _)) | 953 EXPECT_CALL(cert_issuer_source, AsyncGetIssuersOf(target_.get(), _)) |
| 946 .WillOnce( | 954 .WillOnce(Invoke(&req_mover, &CertIssuerSourceRequestMover::MoveIt)); |
| 947 DoAll(SaveArg<1>(&target_issuers_callback), | |
| 948 Invoke(&req_mover, &CertIssuerSourceRequestMover::MoveIt))); | |
| 949 } | 955 } |
| 950 | 956 |
| 951 TestClosure callback; | |
| 952 CompletionStatus rv = path_builder.Run(callback.closure()); | |
| 953 ASSERT_EQ(CompletionStatus::ASYNC, rv); | |
| 954 | |
| 955 ASSERT_FALSE(target_issuers_callback.is_null()); | |
| 956 | |
| 957 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 958 | |
| 959 // First async batch: return oldintermediate_. | |
| 960 EXPECT_CALL(*target_issuers_req, GetNext(_)) | 957 EXPECT_CALL(*target_issuers_req, GetNext(_)) |
| 961 .WillOnce(DoAll(SetArgPointee<0>(oldintermediate_), | 958 // First async batch: return oldintermediate_. |
| 962 Return(CompletionStatus::SYNC))) | 959 .WillOnce(Invoke(AppendCertToList(oldintermediate_))) |
| 963 .WillOnce( | 960 // Second async batch: return newintermediate_. |
| 964 DoAll(SetArgPointee<0>(nullptr), Return(CompletionStatus::ASYNC))); | 961 .WillOnce(Invoke(AppendCertToList(newintermediate_))); |
| 965 { | 962 { |
| 966 ::testing::InSequence s; | 963 ::testing::InSequence s; |
| 967 // oldintermediate_ does not create a valid path, so both sync and async | 964 // oldintermediate_ does not create a valid path, so both sync and async |
| 968 // lookups are expected. | 965 // lookups are expected. |
| 969 EXPECT_CALL(cert_issuer_source, | 966 EXPECT_CALL(cert_issuer_source, |
| 970 SyncGetIssuersOf(oldintermediate_.get(), _)); | 967 SyncGetIssuersOf(oldintermediate_.get(), _)); |
| 971 EXPECT_CALL(cert_issuer_source, | 968 EXPECT_CALL(cert_issuer_source, |
| 972 AsyncGetIssuersOf(oldintermediate_.get(), _, _)); | 969 AsyncGetIssuersOf(oldintermediate_.get(), _)); |
| 973 } | 970 } |
| 974 target_issuers_callback.Run(target_issuers_req); | |
| 975 ::testing::Mock::VerifyAndClearExpectations(target_issuers_req); | |
| 976 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 977 | 971 |
| 978 // Second async batch: return newintermediate_. | |
| 979 EXPECT_CALL(*target_issuers_req, GetNext(_)) | |
| 980 .WillOnce(DoAll(SetArgPointee<0>(newintermediate_), | |
| 981 Return(CompletionStatus::SYNC))) | |
| 982 .WillOnce( | |
| 983 DoAll(SetArgPointee<0>(nullptr), Return(CompletionStatus::ASYNC))); | |
| 984 // newroot_ is in the trust store, so this path will be completed | 972 // newroot_ is in the trust store, so this path will be completed |
| 985 // synchronously. AsyncGetIssuersOf will not be called on newintermediate_. | 973 // synchronously. AsyncGetIssuersOf will not be called on newintermediate_. |
| 986 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); | 974 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); |
| 987 target_issuers_callback.Run(target_issuers_req); | 975 |
| 976 // Ensure pathbuilder finished and filled result. |
| 977 path_builder.Run(); |
| 978 |
| 988 // Note that VerifyAndClearExpectations(target_issuers_req) is not called | 979 // Note that VerifyAndClearExpectations(target_issuers_req) is not called |
| 989 // here. PathBuilder could have destroyed it already, so just let the | 980 // here. PathBuilder could have destroyed it already, so just let the |
| 990 // expectations get checked by the destructor. | 981 // expectations get checked by the destructor. |
| 991 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | 982 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); |
| 992 | 983 |
| 993 // Ensure pathbuilder finished and filled result. | |
| 994 callback.WaitForResult(); | |
| 995 | |
| 996 EXPECT_TRUE(result.HasValidPath()); | 984 EXPECT_TRUE(result.HasValidPath()); |
| 997 ASSERT_EQ(2U, result.paths.size()); | 985 ASSERT_EQ(2U, result.paths.size()); |
| 998 | 986 |
| 999 // Path builder first attempts: target <- oldintermediate <- newroot | 987 // Path builder first attempts: target <- oldintermediate <- newroot |
| 1000 // but it will fail since oldintermediate is signed by oldroot. | 988 // but it will fail since oldintermediate is signed by oldroot. |
| 1001 EXPECT_FALSE(result.paths[0]->valid); | 989 EXPECT_FALSE(result.paths[0]->valid); |
| 1002 const auto& path0 = result.paths[0]->path; | 990 const auto& path0 = result.paths[0]->path; |
| 1003 ASSERT_EQ(2U, path0.certs.size()); | 991 ASSERT_EQ(2U, path0.certs.size()); |
| 1004 EXPECT_EQ(target_, path0.certs[0]); | 992 EXPECT_EQ(target_, path0.certs[0]); |
| 1005 EXPECT_EQ(oldintermediate_, path0.certs[1]); | 993 EXPECT_EQ(oldintermediate_, path0.certs[1]); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1022 | 1010 |
| 1023 // Only newroot is a trusted root. | 1011 // Only newroot is a trusted root. |
| 1024 TrustStoreInMemory trust_store; | 1012 TrustStoreInMemory trust_store; |
| 1025 AddTrustedCertificate(newroot_, &trust_store); | 1013 AddTrustedCertificate(newroot_, &trust_store); |
| 1026 | 1014 |
| 1027 CertPathBuilder::Result result; | 1015 CertPathBuilder::Result result; |
| 1028 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 1016 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 1029 &result); | 1017 &result); |
| 1030 path_builder.AddCertIssuerSource(&cert_issuer_source); | 1018 path_builder.AddCertIssuerSource(&cert_issuer_source); |
| 1031 | 1019 |
| 1032 CertIssuerSource::IssuerCallback target_issuers_callback; | |
| 1033 // Create the mock CertIssuerSource::Request... | 1020 // Create the mock CertIssuerSource::Request... |
| 1034 std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>> | 1021 std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>> |
| 1035 target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>()); | 1022 target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>()); |
| 1036 // Keep a raw pointer to the Request... | 1023 // Keep a raw pointer to the Request... |
| 1037 StrictMock<MockCertIssuerSourceRequest>* target_issuers_req = | 1024 StrictMock<MockCertIssuerSourceRequest>* target_issuers_req = |
| 1038 target_issuers_req_owner.get(); | 1025 target_issuers_req_owner.get(); |
| 1039 // Setup helper class to pass ownership of the Request to the PathBuilder when | 1026 // Setup helper class to pass ownership of the Request to the PathBuilder when |
| 1040 // it calls AsyncGetIssuersOf. | 1027 // it calls AsyncGetIssuersOf. |
| 1041 CertIssuerSourceRequestMover req_mover(std::move(target_issuers_req_owner)); | 1028 CertIssuerSourceRequestMover req_mover(std::move(target_issuers_req_owner)); |
| 1042 { | 1029 { |
| 1043 ::testing::InSequence s; | 1030 ::testing::InSequence s; |
| 1044 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(target_.get(), _)); | 1031 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(target_.get(), _)); |
| 1045 EXPECT_CALL(cert_issuer_source, AsyncGetIssuersOf(target_.get(), _, _)) | 1032 EXPECT_CALL(cert_issuer_source, AsyncGetIssuersOf(target_.get(), _)) |
| 1046 .WillOnce( | 1033 .WillOnce(Invoke(&req_mover, &CertIssuerSourceRequestMover::MoveIt)); |
| 1047 DoAll(SaveArg<1>(&target_issuers_callback), | |
| 1048 Invoke(&req_mover, &CertIssuerSourceRequestMover::MoveIt))); | |
| 1049 } | 1034 } |
| 1050 | 1035 |
| 1051 TestClosure callback; | 1036 scoped_refptr<ParsedCertificate> oldintermediate_dupe( |
| 1052 CompletionStatus rv = path_builder.Run(callback.closure()); | 1037 ParsedCertificate::Create(oldintermediate_->der_cert().AsStringPiece(), |
| 1053 ASSERT_EQ(CompletionStatus::ASYNC, rv); | 1038 {}, nullptr)); |
| 1054 | 1039 |
| 1055 ASSERT_FALSE(target_issuers_callback.is_null()); | 1040 EXPECT_CALL(*target_issuers_req, GetNext(_)) |
| 1041 // First async batch: return oldintermediate_. |
| 1042 .WillOnce(Invoke(AppendCertToList(oldintermediate_))) |
| 1043 // Second async batch: return a different copy of oldintermediate_ again. |
| 1044 .WillOnce(Invoke(AppendCertToList(oldintermediate_dupe))) |
| 1045 // Third async batch: return newintermediate_. |
| 1046 .WillOnce(Invoke(AppendCertToList(newintermediate_))); |
| 1056 | 1047 |
| 1057 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 1058 | |
| 1059 // First async batch: return oldintermediate_. | |
| 1060 EXPECT_CALL(*target_issuers_req, GetNext(_)) | |
| 1061 .WillOnce(DoAll(SetArgPointee<0>(oldintermediate_), | |
| 1062 Return(CompletionStatus::SYNC))) | |
| 1063 .WillOnce( | |
| 1064 DoAll(SetArgPointee<0>(nullptr), Return(CompletionStatus::ASYNC))); | |
| 1065 { | 1048 { |
| 1066 ::testing::InSequence s; | 1049 ::testing::InSequence s; |
| 1067 // oldintermediate_ does not create a valid path, so both sync and async | 1050 // oldintermediate_ does not create a valid path, so both sync and async |
| 1068 // lookups are expected. | 1051 // lookups are expected. |
| 1069 EXPECT_CALL(cert_issuer_source, | 1052 EXPECT_CALL(cert_issuer_source, |
| 1070 SyncGetIssuersOf(oldintermediate_.get(), _)); | 1053 SyncGetIssuersOf(oldintermediate_.get(), _)); |
| 1071 EXPECT_CALL(cert_issuer_source, | 1054 EXPECT_CALL(cert_issuer_source, |
| 1072 AsyncGetIssuersOf(oldintermediate_.get(), _, _)); | 1055 AsyncGetIssuersOf(oldintermediate_.get(), _)); |
| 1073 } | 1056 } |
| 1074 target_issuers_callback.Run(target_issuers_req); | |
| 1075 ::testing::Mock::VerifyAndClearExpectations(target_issuers_req); | |
| 1076 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 1077 | 1057 |
| 1078 // Second async batch: return a different copy of oldintermediate_ again. | |
| 1079 scoped_refptr<ParsedCertificate> oldintermediate_dupe( | |
| 1080 ParsedCertificate::Create(oldintermediate_->der_cert().AsStringPiece(), | |
| 1081 {}, nullptr)); | |
| 1082 EXPECT_CALL(*target_issuers_req, GetNext(_)) | |
| 1083 .WillOnce(DoAll(SetArgPointee<0>(oldintermediate_dupe), | |
| 1084 Return(CompletionStatus::SYNC))) | |
| 1085 .WillOnce( | |
| 1086 DoAll(SetArgPointee<0>(nullptr), Return(CompletionStatus::ASYNC))); | |
| 1087 target_issuers_callback.Run(target_issuers_req); | |
| 1088 // oldintermediate was already processed above, it should not generate any | |
| 1089 // more requests. | |
| 1090 ::testing::Mock::VerifyAndClearExpectations(target_issuers_req); | |
| 1091 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 1092 | |
| 1093 // Third async batch: return newintermediate_. | |
| 1094 EXPECT_CALL(*target_issuers_req, GetNext(_)) | |
| 1095 .WillOnce(DoAll(SetArgPointee<0>(newintermediate_), | |
| 1096 Return(CompletionStatus::SYNC))) | |
| 1097 .WillOnce( | |
| 1098 DoAll(SetArgPointee<0>(nullptr), Return(CompletionStatus::ASYNC))); | |
| 1099 // newroot_ is in the trust store, so this path will be completed | 1058 // newroot_ is in the trust store, so this path will be completed |
| 1100 // synchronously. AsyncGetIssuersOf will not be called on newintermediate_. | 1059 // synchronously. AsyncGetIssuersOf will not be called on newintermediate_. |
| 1101 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); | 1060 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); |
| 1102 target_issuers_callback.Run(target_issuers_req); | |
| 1103 // Note that VerifyAndClearExpectations(target_issuers_req) is not called | |
| 1104 // here. PathBuilder could have destroyed it already, so just let the | |
| 1105 // expectations get checked by the destructor. | |
| 1106 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | |
| 1107 | 1061 |
| 1108 // Ensure pathbuilder finished and filled result. | 1062 // Ensure pathbuilder finished and filled result. |
| 1109 callback.WaitForResult(); | 1063 path_builder.Run(); |
| 1064 |
| 1065 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); |
| 1110 | 1066 |
| 1111 EXPECT_TRUE(result.HasValidPath()); | 1067 EXPECT_TRUE(result.HasValidPath()); |
| 1112 ASSERT_EQ(2U, result.paths.size()); | 1068 ASSERT_EQ(2U, result.paths.size()); |
| 1113 | 1069 |
| 1114 // Path builder first attempts: target <- oldintermediate <- newroot | 1070 // Path builder first attempts: target <- oldintermediate <- newroot |
| 1115 // but it will fail since oldintermediate is signed by oldroot. | 1071 // but it will fail since oldintermediate is signed by oldroot. |
| 1116 EXPECT_FALSE(result.paths[0]->valid); | 1072 EXPECT_FALSE(result.paths[0]->valid); |
| 1117 const auto& path0 = result.paths[0]->path; | 1073 const auto& path0 = result.paths[0]->path; |
| 1118 ASSERT_EQ(2U, path0.certs.size()); | 1074 ASSERT_EQ(2U, path0.certs.size()); |
| 1119 EXPECT_EQ(target_, path0.certs[0]); | 1075 EXPECT_EQ(target_, path0.certs[0]); |
| 1120 EXPECT_EQ(oldintermediate_, path0.certs[1]); | 1076 EXPECT_EQ(oldintermediate_, path0.certs[1]); |
| 1121 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); | 1077 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); |
| 1122 | 1078 |
| 1123 // The second async result does not generate any path. | 1079 // The second async result does not generate any path. |
| 1124 | 1080 |
| 1125 // After the third batch of async results, path builder will attempt: | 1081 // After the third batch of async results, path builder will attempt: |
| 1126 // target <- newintermediate <- newroot which will succeed. | 1082 // target <- newintermediate <- newroot which will succeed. |
| 1127 EXPECT_TRUE(result.paths[1]->valid); | 1083 EXPECT_TRUE(result.paths[1]->valid); |
| 1128 const auto& path1 = result.paths[1]->path; | 1084 const auto& path1 = result.paths[1]->path; |
| 1129 ASSERT_EQ(2U, path1.certs.size()); | 1085 ASSERT_EQ(2U, path1.certs.size()); |
| 1130 EXPECT_EQ(target_, path1.certs[0]); | 1086 EXPECT_EQ(target_, path1.certs[0]); |
| 1131 EXPECT_EQ(newintermediate_, path1.certs[1]); | 1087 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 1132 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); | 1088 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); |
| 1133 } | 1089 } |
| 1134 | 1090 |
| 1135 #endif | |
| 1136 | |
| 1137 } // namespace | 1091 } // namespace |
| 1138 | 1092 |
| 1139 } // namespace net | 1093 } // namespace net |
| OLD | NEW |