Add Certs method to CertIssuerSourceStatic to return all certs.

Change-Id: Ib7ec2588f545102a49862491e84028c0527e6363
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/70067
Commit-Queue: Matt Mueller <mattm@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/pki/cert_issuer_source_static.cc b/pki/cert_issuer_source_static.cc
index fc20eb9..162b8de 100644
--- a/pki/cert_issuer_source_static.cc
+++ b/pki/cert_issuer_source_static.cc
@@ -17,6 +17,16 @@
 
 void CertIssuerSourceStatic::Clear() { intermediates_.clear(); }
 
+std::vector<std::shared_ptr<const ParsedCertificate>>
+CertIssuerSourceStatic::Certs() const {
+  std::vector<std::shared_ptr<const ParsedCertificate>> result;
+  result.reserve(intermediates_.size());
+  for (const auto& [key, cert] : intermediates_) {
+    result.push_back(cert);
+  }
+  return result;
+}
+
 void CertIssuerSourceStatic::SyncGetIssuersOf(const ParsedCertificate *cert,
                                               ParsedCertificateList *issuers) {
   auto range =
diff --git a/pki/cert_issuer_source_static.h b/pki/cert_issuer_source_static.h
index 1e60934..a0395ef 100644
--- a/pki/cert_issuer_source_static.h
+++ b/pki/cert_issuer_source_static.h
@@ -6,6 +6,7 @@
 #define BSSL_PKI_CERT_ISSUER_SOURCE_STATIC_H_
 
 #include <unordered_map>
+#include <vector>
 
 #include <openssl/base.h>
 
@@ -30,6 +31,9 @@
   // Clears the set of certificates.
   void Clear();
 
+  // Returns a vector containing all the certificates added to this source.
+  std::vector<std::shared_ptr<const ParsedCertificate>> Certs() const;
+
   size_t size() const { return intermediates_.size(); }
 
   // CertIssuerSource implementation:
diff --git a/pki/cert_issuer_source_static_unittest.cc b/pki/cert_issuer_source_static_unittest.cc
index 36f809a..8b0a36c 100644
--- a/pki/cert_issuer_source_static_unittest.cc
+++ b/pki/cert_issuer_source_static_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "cert_issuer_source_static.h"
 
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 #include "cert_issuer_source_sync_unittest.h"
 #include "parsed_certificate.h"
@@ -24,7 +25,7 @@
   CertIssuerSourceStatic source_;
 };
 
-INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticTest,
+INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticSyncTest,
                                CertIssuerSourceSyncTest,
                                CertIssuerSourceStaticTestDelegate);
 
@@ -35,6 +36,40 @@
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
     CertIssuerSourceSyncNotNormalizedTest);
 
+TEST(CertIssuerSourceStaticTest, AddCertsGetCertsAndClear) {
+  std::string test_dir = "testdata/cert_issuer_source_static_unittest/";
+  std::shared_ptr<const ParsedCertificate> cert1 =
+      ReadCertFromFile(test_dir + "root.pem");
+  ASSERT_TRUE(cert1);
+  std::shared_ptr<const ParsedCertificate> cert2 =
+      ReadCertFromFile(test_dir + "i1_1.pem");
+  ASSERT_TRUE(cert2);
+  std::shared_ptr<const ParsedCertificate> cert3 =
+      ReadCertFromFile(test_dir + "i1_2.pem");
+  ASSERT_TRUE(cert3);
+
+  CertIssuerSourceStatic source;
+  EXPECT_TRUE(source.Certs().empty());
+  EXPECT_EQ(source.size(), 0u);
+
+  source.AddCert(cert1);
+  EXPECT_THAT(source.Certs(), testing::UnorderedElementsAre(cert1));
+  EXPECT_EQ(source.size(), 1u);
+
+  source.AddCert(cert2);
+  EXPECT_THAT(source.Certs(), testing::UnorderedElementsAre(cert1, cert2));
+  EXPECT_EQ(source.size(), 2u);
+
+  source.AddCert(cert3);
+  EXPECT_THAT(source.Certs(),
+              testing::UnorderedElementsAre(cert1, cert2, cert3));
+  EXPECT_EQ(source.size(), 3u);
+
+  source.Clear();
+  EXPECT_TRUE(source.Certs().empty());
+  EXPECT_EQ(source.size(), 0u);
+}
+
 }  // namespace
 
 }  // namespace bssl