# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''Generates a test suite from NIST PKITS test descriptions.

The output is a set of Type Parameterized Tests which are included by
pkits_unittest.h. See pkits_unittest.h for information on using the tests.
GoogleTest has a limit of 50 tests per type parameterized testcase, so the tests
are split up by section number (this also makes it possible to easily skip
sections that pertain to non-implemented features).

Usage:
  generate_tests.py <PKITS.pdf> <output.h>
'''

import os
import re
import subprocess
import sys
import tempfile


def sanitize_name(s):
  return s.translate(None, ' -')


def finalize_test_case(test_case_name, sanitized_test_names, output):
  output.write('\nWRAPPED_REGISTER_TYPED_TEST_SUITE_P(%s' % test_case_name)
  for name in sanitized_test_names:
    output.write(',\n    %s' % name)
  output.write(');\n')


def bool_to_str(b):
  return "true" if b else "false"


def make_policies_string(policies):
  return '"' + ','.join(policies) + '"'


def output_test(test_case_name, test_number, raw_test_name, subpart_number,
                info, certs, crls, sanitized_test_names, output):
  '''Writes a test case to |output|, and appends the test name to
  |sanitized_test_names|.'''
  sanitized_test_name = 'Section%s%s' % (test_number.split('.')[1],
                                         sanitize_name(raw_test_name))

  subpart_comment = ''
  if subpart_number is not None:
    sanitized_test_name += "Subpart%d" % (subpart_number)
    subpart_comment = ' (Subpart %d)' % (subpart_number)

  sanitized_test_names.append(sanitized_test_name)

  certs_formatted = ', '.join('"%s"' % n for n in certs)
  crls_formatted = ', '.join('"%s"' % n for n in crls)

  output.write('''
// %(test_number)s %(raw_test_name)s%(subpart_comment)s
WRAPPED_TYPED_TEST_P(%(test_case_name)s, %(sanitized_test_name)s) {
  const char* const certs[] = {
    %(certs_formatted)s
  };
  const char* const crls[] = {
    %(crls_formatted)s
  };
''' % vars())

  default_info = TestInfo(None)

  output.write('''PkitsTestInfo info;
  info.test_number = "%s";
  info.should_validate = %s;
''' % (test_number, bool_to_str(info.should_validate)))

  # Output any non-default inputs/outputs. Only properties that differ from
  # the defaults are written, so as to keep the generated file more readable.
  if info.initial_policy_set != default_info.initial_policy_set:
    output.write('''  info.SetInitialPolicySet(%s);
''' % make_policies_string(info.initial_policy_set))

  if info.initial_explicit_policy != default_info.initial_explicit_policy:
    output.write('''  info.SetInitialExplicitPolicy(%s);
''' % bool_to_str(info.initial_explicit_policy))

  if (info.initial_policy_mapping_inhibit !=
          default_info.initial_policy_mapping_inhibit):
    output.write('''  info.SetInitialPolicyMappingInhibit(%s);
''' % bool_to_str(info.initial_policy_mapping_inhibit))

  if (info.initial_inhibit_any_policy !=
          default_info.initial_inhibit_any_policy):
    output.write('''  info.SetInitialInhibitAnyPolicy(%s);
''' % bool_to_str(info.initial_inhibit_any_policy))

  if (info.user_constrained_policy_set !=
          default_info.user_constrained_policy_set):
    output.write('''  info.SetUserConstrainedPolicySet(%s);
''' % make_policies_string(info.user_constrained_policy_set))

  output.write('''
  this->RunTest(certs, crls, info);
}
''' % vars())


# Matches a section header, ex: "4.1 Signature Verification"
SECTION_MATCHER = re.compile('^\s*(\d+\.\d+)\s+(.+)\s*$')
# Matches a test header, ex: "4.1.1 Valid Signatures Test1"
TEST_MATCHER = re.compile('^\s*(\d+\.\d+.\d+)\s+(.+)\s*$')

# Matches the various headers in a test specification.
EXPECTED_HEADER_MATCHER = re.compile('^\s*Expected Result:')
PROCEDURE_HEADER_MATCHER = re.compile('^\s*Procedure:')
PATH_HEADER_MATCHER = re.compile('^\s*Certification Path:')

# Matches the Procedure text if using default settings.
USING_DEFAULT_SETTINGS_MATCHER = re.compile(
    '^.*using the \s*default settings.*')

# Matches the description text if using custom settings.
CUSTOM_SETTINGS_MATCHER = re.compile(
    '.*this\s+test\s+be\s+validated\s+using\s+the\s+following\s+inputs:.*')

# Match an expected test result. Note that some results in the PDF have a typo
# "path not should validate" instead of "path should not validate".
TEST_RESULT_MATCHER = re.compile(
    '^.*path (should validate|should not validate|not should validate)')

# Matches a line in the certification path, ex:
#    "\u2022 Good CA Cert, Good CA CRL"
PATH_MATCHER = re.compile('^\s*\xe2\x80\xa2\s*(.+)\s*$')
# Matches a page number. These may appear in the middle of multi-line fields and
# thus need to be ignored.
PAGE_NUMBER_MATCHER = re.compile('^\s*\d+\s*$')
# Matches if an entry in a certification path refers to a CRL, ex:
# "onlySomeReasons CA2 CRL1".
CRL_MATCHER = re.compile('^.*CRL\d*$')


class TestSections(object):
  def __init__(self):
    self.description_lines = []
    self.procedure_lines = []
    self.expected_result_lines = []
    self.cert_path_lines = []


def parse_main_test_sections(lines, i):
  result = TestSections()

  # Read the description lines (text after test name up until
  # "Procedure:").
  result.description_lines = []
  while i < len(lines):
    if PROCEDURE_HEADER_MATCHER.match(lines[i]):
      break
    result.description_lines.append(lines[i])
    i += 1

  # Read the procedure lines (text starting at "Procedure:" and up until
  # "Expected Result:".
  result.procedure_lines = []
  while i < len(lines):
    if EXPECTED_HEADER_MATCHER.match(lines[i]):
      break
    result.procedure_lines.append(lines[i])
    i += 1

  # Read the expected result lines (text starting at "Expected Result:" and up
  # until "Certification Path:".
  result.expected_result_lines = []
  while i < len(lines):
    if PATH_HEADER_MATCHER.match(lines[i]):
      break
    result.expected_result_lines.append(lines[i])
    i += 1

  # Read the certification path lines (text starting at "Certification Path:"
  # and up until the next test title.
  result.cert_path_lines = []
  while i < len(lines):
    if TEST_MATCHER.match(lines[i]) or SECTION_MATCHER.match(lines[i]):
      break
    result.cert_path_lines.append(lines[i])
    i += 1

  return i, result


def parse_cert_path_lines(lines):
  path_lines = []
  crls = []
  certs = []

  for line in lines[1:]:
    line = line.strip()

    if "is composed of the following objects:" in line:
      continue

    if not line or PAGE_NUMBER_MATCHER.match(line):
      continue
    path_match = PATH_MATCHER.match(line)
    if path_match:
      path_lines.append(path_match.group(1))
      continue
    # Continuation of previous path line.
    path_lines[-1] += ' ' + line

  for path_line in path_lines:
    for path in path_line.split(','):
      path = sanitize_name(path.strip())
      if CRL_MATCHER.match(path):
        crls.append(path)
      else:
        certs.append(path)

  return certs, crls


ANY_POLICY = 'anyPolicy'
TEST_POLICY_1 = 'NIST-test-policy-1'
TEST_POLICY_2 = 'NIST-test-policy-2'
TEST_POLICY_3 = 'NIST-test-policy-3'
TEST_POLICY_6 = 'NIST-test-policy-6'

# Note: This omits some outputs from PKITS:
#
#  * authorities-constrained-policy-set
#  * explicit-policy-indicator
class TestInfo(object):
  """This structure describes a test inputs and outputs"""

  def __init__(self, should_validate,
               # These defaults come from section 3 of PKITS.pdf
               initial_policy_set = [ANY_POLICY],
               initial_explicit_policy = False,
               initial_policy_mapping_inhibit = False,
               initial_inhibit_any_policy = False,
               # In all of the tests that are not related to policy processing,
               # each certificate in the path asserts the certificate policy
               # 2.16.840.1.101.3.2.1.48.1
               user_constrained_policy_set = [TEST_POLICY_1]):
    self.should_validate = should_validate
    self.initial_policy_set = initial_policy_set
    self.initial_explicit_policy = initial_explicit_policy
    self.initial_policy_mapping_inhibit = initial_policy_mapping_inhibit
    self.initial_inhibit_any_policy = initial_inhibit_any_policy
    self.user_constrained_policy_set = user_constrained_policy_set


TEST_OVERRIDES = {
  '4.8.1': [ # All Certificates Same Policy Test1
    # 1. default settings, but with initial-explicit-policy set. The path
    # should validate successfully
    TestInfo(True, initial_explicit_policy=True,
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-explicit-policy set and
    # initial-policy-set = {NIST-test-policy-1}. The path should validate
    # successfully.
    TestInfo(True, initial_explicit_policy=True,
             initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 3. default settings, but with initial-explicit-policy set and
    # initial-policy-set = {NIST-test-policy-2}. The path should not validate
    # successfully.
    TestInfo(False, initial_explicit_policy=True,
             initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[]),

    # 4. default settings, but with initial-explicit-policy set and
    # initial-policy-set = {NIST-test-policy-1, NIST-test-policy-2}. The path
    # should validate successfully.
    TestInfo(True, initial_explicit_policy=True,
             initial_policy_set=[TEST_POLICY_1, TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.2': [ # All Certificates No Policies Test2
    # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[]),

    # 2. default settings, but with initial-explicit-policy set. The path
    # should not validate successfully
    TestInfo(False, initial_explicit_policy=True,
             user_constrained_policy_set=[]),
  ],

  '4.8.3': [ # Different Policies Test3
    # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[]),

    # 2. default settings, but with initial-explicit-policy set. The path
    # should not validate successfully.
    TestInfo(False, initial_explicit_policy=True, user_constrained_policy_set=[]),

    # 3. default settings, but with initial-explicit-policy set and
    # initial-policy-set = {NIST-test-policy-1, NIST-test-policy-2}. The path
    # should not validate successfully.
    TestInfo(False, initial_explicit_policy=True,
             initial_policy_set=[TEST_POLICY_1, TEST_POLICY_2],
             user_constrained_policy_set=[]),
  ],

  '4.8.4': [ # Different Policies Test4
    # Procedure: Validate Different Policies Test4 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.69 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set if the application can process the policyConstraints
    # extension. If the application can process the policyConstraints extension
    # then the path should not validate successfully. If the application can
    # not process the policyConstraints extension, then the path should
    # validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.5': [ # 4.8.5 Different Policies Test5
    # Procedure: Validate Different Policies Test5 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.70 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set if the application can process the policyConstraints
    # extension. If the application can process the policyConstraints extension
    # then the path should not validate successfully. If the application can
    # not process the policyConstraints extension, then the path should
    # validate successfully
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.6': [ # Overlapping Policies Test6
    # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 3. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[]),
  ],

  '4.8.7': [ # Different Policies Test7
    # Procedure: Validate Different Policies Test7 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.72 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. If the
    # explicit-policy-indicator will be set if the application can process the
    # policyConstraints extension. If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully. If the application can not process the policyConstraints
    # extension, then the path should validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.8': [ # Different Policies Test8
    # Procedure: Validate Different Policies Test8 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.73 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set if the application can process the policyConstraints
    # extension. If the application can process the policyConstraints extension
    # then the path should not validate successfully. If the application can
    # not process the policyConstraints extension, then the path should
    # validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.9': [ # Different Policies Test9
    # Procedure: Validate Different Policies Test9 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.74 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set if the application can process the policyConstraints
    # extension. If the application can process the policyConstraints
    # extension, then the path should not validate successfully. If the
    # application can not process the policyConstraints extension, then the
    # path should validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.10': [ # All Certificates Same Policies Test10
    # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1, TEST_POLICY_2]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 3. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_2]),
  ],

  '4.8.11': [ # All Certificates AnyPolicy Test11
    # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[ANY_POLICY]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.12': [ # Different Policies Test12
    # Procedure: Validate Different Policies Test12 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.77 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set if the application can process the policyConstraints
    # extension. If the application can process the policyConstraints
    # extension, then the path should not validate successfully. If the
    # application can not process the policyConstraints extension, then the
    # path should validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.8.13': [ # All Certificates Same Policies Test13
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_2]),

    # 3. default settings, but with initial-policy-set = {NIST-test-policy-3}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_3],
             user_constrained_policy_set=[TEST_POLICY_3]),
  ],

  '4.8.14': [ # AnyPolicy Test14
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[]),
  ],

  '4.8.15': [ # User Notice Qualifier Test15
    # Procedure: Validate User Notice Qualifier Test15 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.80 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be the same
    # as the initial-explicit-policy indicator. If the initial-policy-set is
    # any-policy or otherwise includes NIST-test-policy-1, then the
    # user-constrained-policy-set will be {NIST-test-policy-1}. If not, the
    # user-constrained-policy-set will be empty. If the initial-explicit-policy
    # indicator is set and the initial-policy-set does not include
    # NIST-test-policy-1, then the path should be rejected, otherwise it should
    # validate successfully. If the path validates successfully, then the
    # application should display the user notice.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.16': [ # User Notice Qualifier Test16
    # Procedure: Validate User Notice Qualifier Test16 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.81 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be the same
    # as the initial-explicit-policy indicator. If the initial-policy-set is
    # any-policy or otherwise includes NIST-test-policy-1, then the
    # user-constrained-policy-set will be {NIST-test-policy-1}. If not, the
    # user-constrained-policy-set will be empty. If the initial-explicit-policy
    # indicator is set and the initial-policy-set does not include
    # NIST-test-policy-1, then the path should be rejected, otherwise it should
    # validate successfully. If the path validates successfully, then the
    # application should display the user notice associated with
    # NIST-test-policy-1. The user notice associated with NIST-test-policy-2
    # should not be displayed.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.17': [ # User Notice Qualifier Test17
    # Procedure: Validate User Notice Qualifier Test17 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.82 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be the same
    # as the initial-explicit-policy indicator. If the initial-policy-set is
    # any-policy or otherwise includes NIST-test-policy-1, then the
    # user-constrained-policy-set will be {NIST-test-policy-1}. If not, the
    # user-constrained-policy-set will be empty. If the initial-explicit-policy
    # indicator is set and the initial-policy-set does not include
    # NIST-test-policy-1, then the path should be rejected, otherwise it should
    # validate successfully. If the path validates successfully, then the
    # application should display the user notice associated with anyPolicy.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.18': [ # User Notice Qualifier Test18
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully and the qualifier associated with
    # NIST-test-policy-1 in the end entity certificate should be displayed.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should validate successfully and the qualifier associated with
    # anyPolicy in the end entity certificate should be displayed.
    TestInfo(True, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_2]),
  ],

  '4.8.19': [ # User Notice Qualifier Test19
    # Procedure: Validate User Notice Qualifier Test19 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.84 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be the same
    # as the initial-explicit-policy indicator. If the initial-policy-set is
    # any-policy or otherwise includes NIST-test-policy-1, then the
    # user-constrained-policy-set will be {NIST-test-policy-1}. If not, the
    # user-constrained-policy-set will be empty. If the initial-explicit-policy
    # indicator is set and the initial-policy-set does not include
    # NIST-test-policy-1, then the path should be rejected, otherwise it should
    # validate successfully.  Since the explicitText exceeds the maximum size
    # of 200 characters, the application may choose to reject the certificate.
    # If the application accepts the certificate, display of the user notice is
    # optional.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.8.20': [ # CPS Pointer Qualifier Test20
    # Procedure: Validate CPS Pointer Qualifier Test20 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.85 using the
    # default settings. (If possible, it is recommended that this test be run
    # with the initial-explicit-policy indicator set. If this can not be done,
    # manually check that the authorities-constrained-policy-set and
    # user-constrained-policy-set are correct.)
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be the same
    # as the initial-explicit-policy indicator. If the initial-policy-set is
    # any-policy or otherwise includes NIST-test-policy-1, then the
    # user-constrained-policy-set will be {NIST-test-policy-1}. If not, the
    # user-constrained-policy-set will be empty. If the initial-explicit-policy
    # indicator is set and the initial-policy-set does not include
    # NIST-test-policy-1, then the path should be rejected, otherwise it should
    # validate successfully. The CPS pointer in the qualifier should be
    # associated with NIST-testpolicy-1 in the
    # authorities-constrained-policy-set (and in the user-constrained-policy-set
    # if NIST-test-policy-1 is in that set). There are no processing
    # requirements associated with the CPS pointer qualifier.
    TestInfo(True, initial_explicit_policy=True,
             initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.9.1': [ # Valid RequireExplicitPolicy Test1
    # Procedure: Validate Valid requireExplicitPolicy Test1 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.86 using
    # the default settings.
    #
    # Expected Result: The path should validate successfully since the
    # explicit-policy-indicator is not set.
    TestInfo(True, user_constrained_policy_set=[]),
  ],

  '4.9.2': [ # Valid RequireExplicitPolicy Test2
    # Procedure: Validate Valid requireExplicitPolicy Test2 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.87 using
    # the default settings.
    #
    # Expected Result: The path should validate successfully since the
    # explicit-policy-indicator is not set
    TestInfo(True, user_constrained_policy_set=[]),
  ],

  '4.9.6': [ # Valid Self-Issued requireExplicitPolicy Test6
    # Procedure: Validate Valid Self-Issued requireExplicitPolicy Test6 EE using
    # the default settings or open and verify Signed Test Message 6.2.2.91 using
    # the default settings.
    #
    # Expected Result: The path should validate successfully since the
    # explicit-policy-indicator is not set.
    TestInfo(True, user_constrained_policy_set=[]),
  ],

  '4.10.1': [ # Valid Policy Mapping Test1
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[]),

    # 3. default settings, but with initial-policy-mapping-inhibit set. The
    # path should not validate successfully.
    TestInfo(False, initial_policy_mapping_inhibit=True,
             user_constrained_policy_set=[]),
  ],

  '4.10.2': [ # Invalid Policy Mapping Test2
    # 1. default settings. The path should not validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),

    # 2. default settings, but with initial-policy-mapping-inhibit set. The
    # path should not validate successfully.
    TestInfo(False, initial_policy_mapping_inhibit=True,
             user_constrained_policy_set=[]),
  ],

  '4.10.3': [ # Valid Policy Mapping Test3
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_2]),
  ],

  '4.10.4': [ # Invalid Policy Mapping Test4
    # Procedure: Validate Invalid Policy Mapping Test4 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.97 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should be rejected, otherwise
    # it should validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.10.5': [ # Valid Policy Mapping Test5
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-6}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_6],
             user_constrained_policy_set=[]),
  ],

  '4.10.6': [ # Valid Policy Mapping Test6
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
                   user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-6}.
    # The path should not validate successfully.
    TestInfo(False, initial_policy_set=[TEST_POLICY_6],
             user_constrained_policy_set=[]),
  ],

  '4.10.7': [ # Invalid Mapping From anyPolicy Test7
    # Procedure: Validate Invalid Mapping From anyPolicy Test7 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.100 using
    # the default settings.
    #
    # Expected Result: The path should not validate successfully since the
    # intermediate certificate includes a policy mapping extension in which
    # anyPolicy appears as an issuerDomainPolicy.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.10.8': [ # Invalid Mapping To anyPolicy Test8
    # Procedure: Validate Invalid Mapping To anyPolicy Test8 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.101 using
    # the default settings.
    #
    # Expected Result: The path should not validate successfully since the
    # intermediate certificate includes a policy mapping extension in which
    # anyPolicy appears as an subjectDomainPolicy.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.10.9': [ # Valid Policy Mapping Test9
    # Procedure: Validate Valid Policy Mapping Test9 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.102 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1}. If not, the user-constrained-policy-set will be
    # empty. If the initial-policy-set does not include NIST-test-policy-1 (and
    # the application can process the policyConstraints extension), then the
    # path should be rejected, otherwise it should validate successfully.
    TestInfo(True),
  ],

  '4.10.10': [ # Invalid Policy Mapping Test10
    # Procedure: Validate Invalid Policy Mapping Test10 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.103 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should be rejected, otherwise
    # it should validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.10.11': [ # Valid Policy Mapping Test11
    # Procedure: Validate Valid Policy Mapping Test11 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.104 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1}. If not, the user-constrained-policy-set will be
    # empty. If the initial-policy-set does not include NIST-test-policy-1 (and
    # the application can process the policyConstraints extension), then the
    # path should be rejected, otherwise it should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.10.12': [ # Valid Policy Mapping Test12
    # 1. default settings, but with initial-policy-set = {NIST-test-policy-1}.
    # The path should validate successfully and the application should display
    # the user notice associated with NIST-test-policy-3 in the end entity
    # certificate.
    TestInfo(True, initial_policy_set=[TEST_POLICY_1],
             user_constrained_policy_set=[TEST_POLICY_1]),

    # 2. default settings, but with initial-policy-set = {NIST-test-policy-2}.
    # The path should validate successfully and the application should display
    # the user notice associated with anyPolicy in the end entity certificate.
    TestInfo(True, initial_policy_set=[TEST_POLICY_2],
             user_constrained_policy_set=[TEST_POLICY_2]),
  ],

  '4.10.13': [ # Valid Policy Mapping Test13
    # Procedure: Validate Valid Policy Mapping Test13 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.106 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1}. If not, the user-constrained-policy-set will be
    # empty. If the initial-policy-set does not include NIST-test-policy-1 (and
    # the application can process the policyConstraints extension), then the
    # path should be rejected, otherwise it should validate successfully. If
    # the path is accepted, the application should display the user notice
    # associated with NIST-testpolicy-1 in the intermediate certificate.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.10.14': [ # Valid Policy Mapping Test14
    # Procedure: Validate Valid Policy Mapping Test14 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.107 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1}. If not, the user-constrained-policy-set will be
    # empty. If the initial-policy-set does not include NIST-test-policy-1 (and
    # the application can process the policyConstraints extension), then the
    # path should be rejected, otherwise it should validate successfully. If
    # the path is accepted, the application should display the user notice
    # associated with anyPolicy in the intermediate certificate
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.11.1': [ # Invalid inhibitPolicyMapping Test1
    # Procedure: Validate Invalid inhibitPolicyMapping Test1 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.108 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty. The explicit-policy-indicator
    # will be set.  The path should not validate successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.2': [ # Valid inhibitPolicyMapping Test2
    # Procedure: Validate Valid inhibitPolicyMapping Test2 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.109 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set. If
    # the initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.11.3': [ # Invalid inhibitPolicyMapping Test3
    # Procedure: Validate Invalid inhibitPolicyMapping Test3 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.110 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set.  The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.4': [ # Valid inhibitPolicyMapping Test4
    # Procedure: Validate Valid inhibitPolicyMapping Test4 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.111 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-2} and the explicit-policy-indicator will be set. If
    # the initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-2, then the path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_2]),
  ],

  '4.11.5': [ # Invalid inhibitPolicyMapping Test5
    # Procedure: Validate Invalid inhibitPolicyMapping Test5 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.112 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set.  The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.6': [ # Invalid inhibitPolicyMapping Test6
    # Procedure: Validate Invalid inhibitPolicyMapping Test6 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.113 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and the
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set. The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.7': [ # Valid Self-Issued inhibitPolicyMapping Test7
    # Procedure: Validate Valid Self-Issued inhibitPolicyMapping Test7 EE using
    # the default settings or open and verify Signed Test Message 6.2.2.114
    # using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set. If
    # the initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.11.8': [ # Invalid Self-Issued inhibitPolicyMapping Test8
    # Procedure: Validate Invalid Self-Issued inhibitPolicyMapping Test8 EE
    # using the default settings or open and verify Signed Test Message
    # 6.2.2.115 using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set. The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.9': [ # Invalid Self-Issued inhibitPolicyMapping Test9
    # Procedure: Validate Invalid Self-Issued inhibitPolicyMapping Test9 EE
    # using the default settings or open and verify Signed Test Message
    # 6.2.2.116 using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set. The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.10': [ # Invalid Self-Issued inhibitPolicyMapping Test10
    # Procedure: Validate Invalid Self-Issued inhibitPolicyMapping Test10 EE
    # using the default settings or open and verify Signed Test Message
    # 6.2.2.117 using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set. The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.11.11': [ # Invalid Self-Issued inhibitPolicyMapping Test11
    # Procedure: Validate Invalid Self-Issued inhibitPolicyMapping Test11 EE
    # using the default settings or open and verify Signed Test Message
    # 6.2.2.118 using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set. The path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.1': [ # Invalid inhibitAnyPolicy Test1
    # Procedure: Validate Invalid inhibitAnyPolicy Test1 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.119 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.2': [ # Valid inhibitAnyPolicy Test2
    # Procedure: Validate Valid inhibitAnyPolicy Test2 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.120 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1} and the path should validate successfully. If not,
    # then the user-constrained-policy-set will be empty. If the
    # user-constrained-policy-set is empty and the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.12.3': [ # inhibitAnyPolicy Test3
     # 1. default settings. The path should validate successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),

     # 2. default settings, but with initial-inhibit-any-policy set. The path
     # should not validate successfully.
    TestInfo(False, initial_inhibit_any_policy=True,
             user_constrained_policy_set=[]),
  ],

  '4.12.4': [ # Invalid inhibitAnyPolicy Test4
    # Procedure: Validate Invalid inhibitAnyPolicy Test4 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.122 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.5': [ # Invalid inhibitAnyPolicy Test5
    # Procedure: Validate Invalid inhibitAnyPolicy Test5 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.123 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.6': [ # Invalid inhibitAnyPolicy Test6
    # Procedure: Validate Invalid inhibitAnyPolicy Test6 EE using the default
    # settings or open and verify Signed Test Message 6.2.2.124 using the
    # default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.7': [ # Valid Self-Issued inhibitAnyPolicy Test7
    # Procedure: Validate Valid Self-Issued inhibitAnyPolicy Test7 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.125 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1} and the path should validate successfully. If not,
    # then the user-constrained-policy-set will be empty. If the
    # user-constrained-policy-set is empty and the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.12.8': [ # Invalid Self-Issued inhibitAnyPolicy Test8
    # Procedure: Validate Invalid Self-Issued inhibitAnyPolicy Test8 EE using
    # the default settings or open and verify Signed Test Message 6.2.2.126
    # using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],

  '4.12.9': [ # Valid Self-Issued inhibitAnyPolicy Test9
    # Procedure: Validate Valid Self-Issued inhibitAnyPolicy Test9 EE using the
    # default settings or open and verify Signed Test Message 6.2.2.127 using
    # the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set will be
    # {NIST-test-policy-1} and the explicit-policy-indicator will be set (if
    # the application can process the policyConstraints extension). If the
    # initial-policy-set is any-policy or otherwise includes
    # NIST-test-policy-1, then the user-constrained-policy-set will be
    # {NIST-test-policy-1} and the path should validate successfully. If not,
    # then the user-constrained-policy-set will be empty. If the
    # user-constrained-policy-set is empty and the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(True, user_constrained_policy_set=[TEST_POLICY_1]),
  ],

  '4.12.10': [ # Invalid Self-Issued inhibitAnyPolicy Test10
    # Procedure: Validate Invalid Self-Issued inhibitAnyPolicy Test10 EE using
    # the default settings or open and verify Signed Test Message 6.2.2.128
    # using the default settings.
    #
    # Expected Result: The authorities-constrained-policy-set and
    # user-constrained-policy-set will be empty and the
    # explicit-policy-indicator will be set (if the application can process the
    # policyConstraints extension). If the application can process the
    # policyConstraints extension, then the path should not validate
    # successfully.
    TestInfo(False, user_constrained_policy_set=[]),
  ],
}


def parse_test(lines, i, test_case_name, test_number, test_name,
               sanitized_test_names, output):
  # Start by doing a coarse level of parsing that separates out the lines for
  # the main sections.
  i, test_sections = parse_main_test_sections(lines, i)

  certs, crls = parse_cert_path_lines(test_sections.cert_path_lines)

  # Most tests have a formulaic specification: they use the default
  # settings, and have one expectation. These are easily parsed and are handled
  # programmatically. In contrast, many of the policies tests have a more
  # complicated specification which involves multiple subtests having various
  # settings, as well as expectations described in terms of supported
  # extensions. Rather than try to handle all the nuanced language, these are
  # handled manually via "overrides".
  overrides = TEST_OVERRIDES.get(test_number, None)

  if overrides is None:
    # Verify that the test description doesn't include numbered subparts (those
    # are not handled here).
    if CUSTOM_SETTINGS_MATCHER.match(" ".join(test_sections.description_lines)):
      sys.stderr.write('Unexpected custom settings for %s\n' % test_number)
      sys.exit(1)

    # Verify that the test is using only default settings.
    if not USING_DEFAULT_SETTINGS_MATCHER.match(
        " ".join(test_sections.procedure_lines)):
      sys.stderr.write('Unexpected procedure for %s: %s\n' %
                       (test_number, " ".join(test_section.procedure_lines)))
      sys.exit(1)

    # Check whether expected result is validation success or failure.
    result_match = TEST_RESULT_MATCHER.match(
       test_sections.expected_result_lines[0])
    if not result_match:
      sys.stderr.write('Unknown expectation for %s:\n%s\n' % (
          test_number, " ".join(test_sections.expected_result_lines)))
      sys.exit(1)
    # Initializes with default settings.
    info = TestInfo(result_match.group(1) == 'should validate')

    # Special case the 4.9 test failures (require explicit policy) to set
    # user_constrained_policy_set to empty. This is only done for the 4.9
    # tests, because the other policy tests are special cased as overrides and
    # hence set this manually on a per-test basis.
    #
    # user_constrained_policy_set enumerates the subset of the initial policy
    # set (anyPolicy in the default case) that were valid for the path. For
    # non-policy tests the expectation for user_constrained_policy_set is
    # [TEST_POLICY_1] since each policy asserts that. However for these tests,
    # the expectation is an empty user_constrained_policy_set since there was
    # no valid policy for the path (in fact, that is why the path validation is
    # expected to fail).
    if test_number.startswith('4.9.') and not info.should_validate:
      info.user_constrained_policy_set = []

    output_test(test_case_name, test_number, test_name, None, info, certs,
                crls, sanitized_test_names, output)
  else:
    # The overrides may have a series of inputs (settings) and outputs
    # (success/failure) for this test. Output each as a separate test case.
    for subpart_i in range(len(overrides)):
      info = overrides[subpart_i]
      # If the test has only 1 subpart, don't number it.
      subpart_number = subpart_i + 1 if len(overrides) > 1 else None
      output_test(test_case_name, test_number, test_name, subpart_number, info,
                  certs, crls, sanitized_test_names, output)

  return i


def main():
  pkits_pdf_path, output_path = sys.argv[1:]

  pkits_txt_file = tempfile.NamedTemporaryFile()

  subprocess.check_call(['pdftotext', '-layout', '-nopgbrk', '-eol', 'unix',
                         pkits_pdf_path, pkits_txt_file.name])

  test_descriptions = pkits_txt_file.read()

  # Extract section 4 of the text, which is the part that contains the tests.
  test_descriptions = test_descriptions.split(
      '4 Certification Path Validation Tests')[-1]
  test_descriptions = test_descriptions.split(
      '5 Relationship to Previous Test Suite', 1)[0]

  output = open(output_path, 'w')
  output.write('// Autogenerated by %s, do not edit\n\n' % sys.argv[0])
  output.write('// Hack to allow disabling type parameterized test cases.\n'
               '// See https://github.com/google/googletest/issues/389\n')
  output.write('#define WRAPPED_TYPED_TEST_P(CaseName, TestName) '
               'TYPED_TEST_P(CaseName, TestName)\n')
  output.write('#define WRAPPED_REGISTER_TYPED_TEST_SUITE_P(CaseName, ...) '
               'REGISTER_TYPED_TEST_SUITE_P(CaseName, __VA_ARGS__)\n\n')

  test_case_name = None
  sanitized_test_names = []

  lines = test_descriptions.splitlines()

  i = 0
  while i < len(lines):
    section_match = SECTION_MATCHER.match(lines[i])
    match = TEST_MATCHER.match(lines[i])
    i += 1

    if section_match:
      if test_case_name:
        finalize_test_case(test_case_name, sanitized_test_names, output)
        sanitized_test_names = []

      test_case_name = 'PkitsTest%02d%s' % (
          int(section_match.group(1).split('.')[-1]),
          sanitize_name(section_match.group(2)))
      output.write('\ntemplate <typename PkitsTestDelegate>\n')
      output.write('class %s : public PkitsTest<PkitsTestDelegate> {};\n' %
                   test_case_name)
      output.write('TYPED_TEST_SUITE_P(%s);\n' % test_case_name)

    if match:
      test_number = match.group(1)
      test_name = match.group(2)
      if not test_case_name:
        output.write('// Skipped %s %s\n' % (test_number, test_name))
        continue
      i, parse_test(lines, i, test_case_name, test_number,
                    test_name, sanitized_test_names, output)

  if test_case_name:
    finalize_test_case(test_case_name, sanitized_test_names, output)


if __name__ == '__main__':
  main()
