Index: net/cert/internal/parse_certificate_unittest.cc |
diff --git a/net/cert/internal/parse_certificate_unittest.cc b/net/cert/internal/parse_certificate_unittest.cc |
index b1de4260889ac108de4950311ea115596e6e010c..1caa90f1fc4c2c1839de8e00fc54b9013de72deb 100644 |
--- a/net/cert/internal/parse_certificate_unittest.cc |
+++ b/net/cert/internal/parse_certificate_unittest.cc |
@@ -6,6 +6,10 @@ |
#include "base/strings/stringprintf.h" |
#include "net/cert/internal/cert_errors.h" |
+// TODO(eroman): These tests should be moved into |
+// parsed_certificate_unittest.cc; this include dependency should |
+// go. |
+#include "net/cert/internal/parsed_certificate.h" |
#include "net/cert/internal/test_helpers.h" |
#include "net/der/input.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -75,6 +79,37 @@ void RunCertificateTest(const std::string& file_name) { |
} |
} |
+// Reads and parses a certificate from the PEM file |file_name|. |
+// |
+// Returns nullptr if the certificate parsing failed, and verifies that any |
+// errors match the ERRORS block in the .pem file. |
+scoped_refptr<ParsedCertificate> ParseCertificateFromFile( |
+ const std::string& file_name) { |
+ std::string data; |
+ std::string expected_errors; |
+ |
+ // Read the certificate data and error expectations from a single PEM file. |
+ const PemBlockMapping mappings[] = { |
+ {"CERTIFICATE", &data}, {"ERRORS", &expected_errors, true /*optional*/}, |
+ }; |
+ std::string test_file_path = GetFilePath(file_name); |
+ EXPECT_TRUE(ReadTestDataFromPemFile(test_file_path, mappings)); |
+ |
+ CertErrors errors; |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParsedCertificate::Create(data, {}, &errors); |
+ |
+ EXPECT_EQ(expected_errors, errors.ToDebugString()) << "Test file: " |
+ << test_file_path; |
+ |
+ // TODO(crbug.com/634443): Every parse failure being tested should emit error |
+ // information. |
+ // if (!cert) |
+ // EXPECT_FALSE(errors.empty()); |
+ |
+ return cert; |
+} |
+ |
// Tests parsing a Certificate. |
TEST(ParseCertificateTest, Version3) { |
RunCertificateTest("cert_version3.pem"); |
@@ -582,107 +617,100 @@ TEST(ParseExtensionsTest, Real) { |
// TODO(eroman): Verify the other 4 extensions' values. |
} |
-// Reads a PEM file containing a block "BASIC CONSTRAINTS". This input will |
-// be passed to ParseExtension, and the results filled in |out|. |
-bool ParseBasicConstraintsFromFile(const std::string& file_name, |
- ParsedBasicConstraints* out) { |
- std::string data; |
- const PemBlockMapping mappings[] = { |
- {"BASIC CONSTRAINTS", &data}, |
- }; |
- |
- EXPECT_TRUE(ReadTestDataFromPemFile(GetFilePath(file_name), mappings)); |
- return ParseBasicConstraints(der::Input(&data), out); |
-} |
- |
// Parses a BasicConstraints with no CA or pathlen. |
-TEST(ParseBasicConstraintsTest, NotCa) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile("basic_constraints_not_ca.pem", |
- &constraints)); |
- EXPECT_FALSE(constraints.is_ca); |
- EXPECT_FALSE(constraints.has_path_len); |
+TEST(ParseCertificateTest, BasicConstraintsNotCa) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_not_ca.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_FALSE(cert->basic_constraints().is_ca); |
+ EXPECT_FALSE(cert->basic_constraints().has_path_len); |
} |
// Parses a BasicConstraints with CA but no pathlen. |
-TEST(ParseBasicConstraintsTest, CaNoPath) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile("basic_constraints_ca_no_path.pem", |
- &constraints)); |
- EXPECT_TRUE(constraints.is_ca); |
- EXPECT_FALSE(constraints.has_path_len); |
+TEST(ParseCertificateTest, BasicConstraintsCaNoPath) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_ca_no_path.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_TRUE(cert->basic_constraints().is_ca); |
+ EXPECT_FALSE(cert->basic_constraints().has_path_len); |
} |
// Parses a BasicConstraints with CA and pathlen of 9. |
-TEST(ParseBasicConstraintsTest, CaPath9) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile("basic_constraints_ca_path_9.pem", |
- &constraints)); |
- EXPECT_TRUE(constraints.is_ca); |
- EXPECT_TRUE(constraints.has_path_len); |
- EXPECT_EQ(9u, constraints.path_len); |
+TEST(ParseCertificateTest, BasicConstraintsCaPath9) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_ca_path_9.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_TRUE(cert->basic_constraints().is_ca); |
+ EXPECT_TRUE(cert->basic_constraints().has_path_len); |
+ EXPECT_EQ(9u, cert->basic_constraints().path_len); |
} |
// Parses a BasicConstraints with CA and pathlen of 255 (largest allowed size). |
-TEST(ParseBasicConstraintsTest, Pathlen255) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile("basic_constraints_pathlen_255.pem", |
- &constraints)); |
- EXPECT_TRUE(constraints.is_ca); |
- EXPECT_TRUE(constraints.has_path_len); |
- EXPECT_EQ(255, constraints.path_len); |
+TEST(ParseCertificateTest, BasicConstraintsPathlen255) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_pathlen_255.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_TRUE(cert->basic_constraints().is_ca); |
+ EXPECT_TRUE(cert->basic_constraints().has_path_len); |
+ EXPECT_EQ(255, cert->basic_constraints().path_len); |
} |
// Parses a BasicConstraints with CA and pathlen of 256 (too large). |
-TEST(ParseBasicConstraintsTest, Pathlen256) { |
- ParsedBasicConstraints constraints; |
- ASSERT_FALSE(ParseBasicConstraintsFromFile( |
- "basic_constraints_pathlen_256.pem", &constraints)); |
+TEST(ParseCertificateTest, BasicConstraintsPathlen256) { |
+ ASSERT_FALSE(ParseCertificateFromFile("basic_constraints_pathlen_256.pem")); |
} |
// Parses a BasicConstraints with CA and a negative pathlen. |
-TEST(ParseBasicConstraintsTest, NegativePath) { |
- ParsedBasicConstraints constraints; |
- ASSERT_FALSE(ParseBasicConstraintsFromFile( |
- "basic_constraints_negative_path.pem", &constraints)); |
+TEST(ParseCertificateTest, BasicConstraintsNegativePath) { |
+ ASSERT_FALSE(ParseCertificateFromFile("basic_constraints_negative_path.pem")); |
} |
// Parses a BasicConstraints with CA and pathlen that is very large (and |
// couldn't fit in a 64-bit integer). |
-TEST(ParseBasicConstraintsTest, PathTooLarge) { |
- ParsedBasicConstraints constraints; |
- ASSERT_FALSE(ParseBasicConstraintsFromFile( |
- "basic_constraints_path_too_large.pem", &constraints)); |
+TEST(ParseCertificateTest, BasicConstraintsPathTooLarge) { |
+ ASSERT_FALSE( |
+ ParseCertificateFromFile("basic_constraints_path_too_large.pem")); |
} |
// Parses a BasicConstraints with CA explicitly set to false. This violates |
// DER-encoding rules, however is commonly used, so it is accepted. |
-TEST(ParseBasicConstraintsTest, CaFalse) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile("basic_constraints_ca_false.pem", |
- &constraints)); |
- EXPECT_FALSE(constraints.is_ca); |
- EXPECT_FALSE(constraints.has_path_len); |
+TEST(ParseCertificateTest, BasicConstraintsCaFalse) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_ca_false.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_FALSE(cert->basic_constraints().is_ca); |
+ EXPECT_FALSE(cert->basic_constraints().has_path_len); |
} |
// Parses a BasicConstraints with CA set to true and an unexpected NULL at |
// the end. |
-TEST(ParseBasicConstraintsTest, UnconsumedData) { |
- ParsedBasicConstraints constraints; |
- ASSERT_FALSE(ParseBasicConstraintsFromFile( |
- "basic_constraints_unconsumed_data.pem", &constraints)); |
+TEST(ParseCertificateTest, BasicConstraintsUnconsumedData) { |
+ ASSERT_FALSE( |
+ ParseCertificateFromFile("basic_constraints_unconsumed_data.pem")); |
} |
// Parses a BasicConstraints with CA omitted (false), but with a pathlen of 1. |
// This is valid DER for the ASN.1, however is not valid when interpreting the |
// BasicConstraints at a higher level. |
-TEST(ParseBasicConstraintsTest, PathLenButNotCa) { |
- ParsedBasicConstraints constraints; |
- ASSERT_TRUE(ParseBasicConstraintsFromFile( |
- "basic_constraints_pathlen_not_ca.pem", &constraints)); |
- EXPECT_FALSE(constraints.is_ca); |
- EXPECT_TRUE(constraints.has_path_len); |
- EXPECT_EQ(1u, constraints.path_len); |
+TEST(ParseCertificateTest, BasicConstraintsPathLenButNotCa) { |
+ scoped_refptr<ParsedCertificate> cert = |
+ ParseCertificateFromFile("basic_constraints_pathlen_not_ca.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ EXPECT_TRUE(cert->has_basic_constraints()); |
+ EXPECT_FALSE(cert->basic_constraints().is_ca); |
+ EXPECT_TRUE(cert->basic_constraints().has_path_len); |
+ EXPECT_EQ(1u, cert->basic_constraints().path_len); |
} |
// Parses a KeyUsage with a single 0 bit. |